From fc2d073d73f8d10ca1f16eed7ef7d516a26e1724 Mon Sep 17 00:00:00 2001 From: alrex Date: Mon, 11 May 2020 13:52:33 -0700 Subject: [PATCH] Adding script and workflow to automate the preparation of releases (#615) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The prepare-release workflow is triggered when a new release/ branch is created. This workflow parses the number from the branch name and updates version.py/changelog.md files accordingly. It then creates a pull request with those changes. This addresses part of #374. Co-authored-by: Mauricio Vásquez --- .github/workflows/prepare-release.yml | 27 +++++++++ scripts/prepare_release.sh | 80 +++++++++++++++++++++++++++ 2 files changed, 107 insertions(+) create mode 100644 .github/workflows/prepare-release.yml create mode 100755 scripts/prepare_release.sh diff --git a/.github/workflows/prepare-release.yml b/.github/workflows/prepare-release.yml new file mode 100644 index 0000000000..7d15b02bed --- /dev/null +++ b/.github/workflows/prepare-release.yml @@ -0,0 +1,27 @@ +name: prepare-release +on: + push: + branch: [ 'release/*' ] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - name: Get the version + id: get_version + run: echo ::set-output name=VERSION::${GITHUB_REF/refs\/tags\//} + + - name: Prepare the release + id: update + run: | + ./scripts/prepare_release.sh ${{ steps.get_version.outputs.VERSION }} + + - name: Create Pull Request + id: create-pr + uses: peter-evans/create-pull-request@v2.7.0 + with: + branch: ${{ steps.get_version.outputs.VERSION }}-auto + title: '[pre-release] Update changelogs, version [${{ steps.get_version.outputs.VERSION }}]' + if: ${{ steps.update.outputs.version_updated == 1 }} diff --git a/scripts/prepare_release.sh b/scripts/prepare_release.sh new file mode 100755 index 0000000000..23dd038b40 --- /dev/null +++ b/scripts/prepare_release.sh @@ -0,0 +1,80 @@ +#!/bin/bash +# +# This script: +# 1. parses the version number from the branch name +# 2. updates version.py files to match that version +# 3. iterates through CHANGELOG.md files and updates any files containing +# unreleased changes +# 4. sets the output variable 'version_updated' to determine whether +# the github action to create a pull request should run. this allows +# maintainers to merge changes back into the release branch without +# triggering unnecessary pull requests +# + +VERSION=`echo $1 | awk -F "/" '{print $NF}'` +echo "Using version ${VERSION}" + +# check the version matches expected versioning e.g +# 0.6, 0.6b, 0.6b0, 0.6.0 +if [[ ! "${VERSION}" =~ ^([0-9])(\.*[0-9]{1,5}[a-b]*){1,3}$ ]]; then + echo "Version number invalid: $VERSION" + exit 1 +fi + +function update_version_file() { + errors=0 + for f in `find . -name version.py`; do + # check if version is already in version.py + grep -q ${VERSION} $f; + rc=$? + if [ $rc == 0 ]; then + errors=1 + echo "${f} already contains ${VERSION}" + continue + fi + # update version.py + perl -i -pe "s/__version__.*/__version__ = \"${VERSION}\"/g" ${f}; + git add ${f}; + echo "Updating ${f}" + done + if [ ${errors} != 0 ]; then + echo "::set-output name=version_updated::0" + exit 0 + fi +} + +function update_changelog() { + errors=0 + for f in `find . -name CHANGELOG.md`; do + # check if version is already in CHANGELOG + grep -q ${VERSION} $f; + rc=$? + if [ $rc == 0 ]; then + errors=1 + echo "${f} already contains ${VERSION}" + continue + fi + # check if changelog contains any new details + changes=`sed -n '/## Unreleased/,/^##/p' ${f} | grep -v '^##' | wc -w | awk '{$1=$1;print}'` + if [ ${changes} != "0" ]; then + # update CHANGELOG.md + perl -i -pe 's/## Unreleased.*/## Unreleased\n\n## '${VERSION}'/' ${f}; + git add ${f}; + echo "Updating ${f}" + else + echo "Skipping ${f}, no changes detected" + fi + done + if [ ${errors} != 0 ]; then + echo "::set-output name=version_updated::0" + exit 0 + fi +} + +update_version_file +update_changelog + +git config --local user.email "action@github.com" +git config --local user.name "GitHub Action" +git commit -m "updating changelogs and version to ${VERSION}" +echo "::set-output name=version_updated::1"