# This workflow runs after a release of the action. # It merges any changes from the release back into the # main branch. Typically, this is just a single commit # that updates the changelog. name: Tag release and merge back on: workflow_dispatch: inputs: baseBranch: description: 'The base branch to merge into' default: main required: false push: branches: - v1 - v2 jobs: merge-back: runs-on: ubuntu-latest if: github.repository == 'github/codeql-action' env: BASE_BRANCH: "${{ github.event.inputs.baseBranch || 'main' }}" HEAD_BRANCH: "${{ github.head_ref || github.ref }}" steps: - name: Dump environment run: env - name: Dump GitHub context env: GITHUB_CONTEXT: '${{ toJson(github) }}' run: echo "$GITHUB_CONTEXT" - uses: actions/checkout@v3 - uses: actions/setup-node@v2 - name: Update git config run: | git config --global user.email "github-actions@github.com" git config --global user.name "github-actions[bot]" - name: Get version and new branch id: getVersion run: | VERSION="v$(jq '.version' -r 'package.json')" SHORT_SHA="${GITHUB_SHA:0:8}" echo "::set-output name=version::$VERSION" NEW_BRANCH="mergeback/${VERSION}-to-${BASE_BRANCH}-${SHORT_SHA}" echo "::set-output name=newBranch::$NEW_BRANCH" - name: Dump branches env: NEW_BRANCH: "${{ steps.getVersion.outputs.newBranch }}" run: | echo "BASE_BRANCH $BASE_BRANCH" echo "HEAD_BRANCH $HEAD_BRANCH" echo "NEW_BRANCH $NEW_BRANCH" - name: Create mergeback branch env: NEW_BRANCH: "${{ steps.getVersion.outputs.newBranch }}" run: | git checkout -b "$NEW_BRANCH" - name: Check for tag id: check env: VERSION: "${{ steps.getVersion.outputs.version }}" run: | set +e # don't fail on an errored command git ls-remote --tags origin | grep "$VERSION" EXISTS="$?" if [ "$EXISTS" -eq 0 ]; then echo "Tag $TAG exists. Not going to re-release." echo "::set-output name=exists::true" else echo "Tag $TAG does not exist yet." fi # we didn't tag the release during the update-release-branch workflow because the # commit that actually makes it to the release branch is a merge commit, # and not yet known during the first workflow. We tag now because we know the correct commit. - name: Tag release if: steps.check.outputs.exists != 'true' env: VERSION: ${{ steps.getVersion.outputs.version }} run: | git tag -a "$VERSION" -m "$VERSION" git fetch --unshallow # unshallow the repo in order to allow pushes git push origin --follow-tags "$VERSION" - name: Create mergeback branch if: steps.check.outputs.exists != 'true' && contains(github.ref, 'v2') env: VERSION: "${{ steps.getVersion.outputs.version }}" NEW_BRANCH: "${{ steps.getVersion.outputs.newBranch }}" GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" run: | set -exu PR_TITLE="Mergeback $VERSION $HEAD_BRANCH into $BASE_BRANCH" PR_BODY="Updates version and changelog." # Update the version number ready for the next release npm version patch --no-git-tag-version # Update the changelog perl -i -pe 's/^/## \[UNRELEASED\]\n\nNo user facing changes.\n\n/ if($.==3)' CHANGELOG.md git add . git commit -m "Update changelog and version after $VERSION" git push origin "$NEW_BRANCH" # PR checks won't be triggered on PRs created by Actions. Therefore mark the PR as draft # so that a maintainer can take the PR out of draft, thereby triggering the PR checks. gh pr create \ --head "$NEW_BRANCH" \ --base "$BASE_BRANCH" \ --title "$PR_TITLE" \ --label "Update dependencies" \ --body "$PR_BODY" \ --draft