diff --git a/.github/workflows/reusable-release.yml b/.github/workflows/reusable-release.yml index 5497b7a..29b6407 100644 --- a/.github/workflows/reusable-release.yml +++ b/.github/workflows/reusable-release.yml @@ -41,6 +41,8 @@ jobs: outputs: key_fingerprint: ${{ steps.read-identifiers.outputs.key_fingerprint }} key_email: ${{ steps.read-identifiers.outputs.key_email }} + release_type: ${{ steps.generate-version-suffix.outputs.release_type }} + version_suffix: ${{ steps.generate-version-suffix.outputs.version_suffix }} steps: - uses: actions/setup-java@v4 with: @@ -59,6 +61,25 @@ jobs: key_fingerprint=$key_fingerprint key_email=$key_email EndOfFile + - name: Check for default branch + id: generate-version-suffix + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + default_branch=$(gh repo view --json defaultBranchRef --jq .defaultBranchRef.name ${{ github.repository }}) + + if [[ "$default_branch" = $GITHUB_REF_NAME ]]; then + release_type="FULL_MAIN_BRANCH" + version_suffix="" + else + release_type="PREVIEW_FEATURE_BRANCH" + version_suffix="-PREVIEW.${GITHUB_REF_NAME//[^[:alnum:-_]]/}.$(date +%Y-%m-%dT%H%M).${GITHUB_SHA:0:8}" + fi + echo "current branch: $GITHUB_REF_NAME, release_type: $release_type, version_suffix: $version_suffix" + cat << EndOfFile >> $GITHUB_OUTPUT + release_type=$release_type + version_suffix=$version_suffix + EndOfFile generate-version-update-commits: name: 🎊 Test & Version @@ -77,7 +98,15 @@ jobs: run: | git config user.email "${{ needs.init.outputs.key_email }}" git config user.name "$COMMITTER_NAME" - sbt "release with-defaults" + + sbt_commands_file=$(mktemp) + cat << EndOfFile > $sbt_commands_file + set releaseVersion := releaseVersion.value.andThen(_ + "${{ needs.init.outputs.version_suffix }}") + release with-defaults + EndOfFile + cat $sbt_commands_file + sbt ";< $sbt_commands_file" + echo $GITHUB_WORKSPACE cd `mktemp -d` git clone --bare $GITHUB_WORKSPACE repo-with-unsigned-version-update-commits.git @@ -100,6 +129,7 @@ jobs: runs-on: ubuntu-latest outputs: release_tag: ${{ steps.create-commit.outputs.release_tag }} + release_version: ${{ steps.create-commit.outputs.release_version }} release_commit_id: ${{ steps.create-commit.outputs.release_commit_id }} steps: - uses: actions/checkout@v4 @@ -143,12 +173,24 @@ jobs: cat << EndOfFile >> $GITHUB_OUTPUT release_tag=$RELEASE_TAG + release_version=${RELEASE_TAG#"v"} release_commit_id=$release_commit_id EndOfFile git log --format="%h %p %ce %s" --decorate=short -n3 git status - git push + + if [ "${{ needs.init.outputs.release_type }}" == "FULL_MAIN_BRANCH" ] + then + echo "Full Main-Branch release, pushing 2 commits to the default branch" + git push # push 2 commits (non-snapshot version, then new snapshot version) onto the default branch + else + tag_for_pushing="preliminary-${{ github.run_id }}" + echo "Preview Feature-Branch release, pushing 1 commit with the temporary tag $tag_for_pushing" + git tag -a -m "Tag created merely to allow _pushing_ the release commit, which gains the signed $RELEASE_TAG tag later on in the workflow" $tag_for_pushing $release_commit_id + git push origin $tag_for_pushing # push the single commit with a tag only + fi + create-artifacts: name: 🎊 Create artifacts @@ -240,7 +282,7 @@ jobs: echo "Message is..." cat tag-message.txt - echo "Creating tag" + echo "Creating release tag (including artifact hashes)" git tag -a -F tag-message.txt $RELEASE_TAG $RELEASE_COMMIT_ID echo "RELEASE_TAG=$RELEASE_TAG" @@ -289,20 +331,62 @@ jobs: sbt "sonatypeBundleRelease" github-release: - name: 🔒 GitHub Release - needs: [push-release-commit, sign] + name: 🔒 Update GitHub + needs: [init, push-release-commit, sign] runs-on: ubuntu-latest permissions: contents: write + pull-requests: write env: RELEASE_TAG: ${{ needs.push-release-commit.outputs.release_tag }} + RELEASE_VERSION: ${{ needs.push-release-commit.outputs.release_version }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GH_REPO: ${{ github.repository }} + GITHUB_REPO_URL: ${{ github.server_url }}/${{ github.repository }} steps: + - name: Common values + run: | + GITHUB_ACTIONS_PATH="$GITHUB_REPO_URL/actions" + GITHUB_WORKFLOW_FILE="release.yml" # Could be derived from $GITHUB_WORKFLOW_REF + GITHUB_WORKFLOW_URL="$GITHUB_ACTIONS_PATH/workflows/$GITHUB_WORKFLOW_FILE" + + cat << EndOfFile >> $GITHUB_ENV + GITHUB_WORKFLOW_FILE=$GITHUB_WORKFLOW_FILE + GITHUB_WORKFLOW_LINK=[GitHub UI]($GITHUB_WORKFLOW_URL) + GITHUB_WORKFLOW_RUN_LINK=[#${{ github.run_number }}]($GITHUB_ACTIONS_PATH/runs/${{ github.run_id }}) + EndOfFile - name: Create Github Release - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - GH_REPO: ${{ github.repository }} + if: needs.init.outputs.release_type == 'FULL_MAIN_BRANCH' run: | - gh release create $RELEASE_TAG --verify-tag --generate-notes --notes "Release run: [#${{ github.run_number }}](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }})" - - name: Job summary + gh release create $RELEASE_TAG --verify-tag --generate-notes --notes "Release run: $GITHUB_WORKFLOW_RUN_LINK" + echo "GitHub Release notes: [$RELEASE_TAG]($GITHUB_REPO_URL/releases/tag/$RELEASE_TAG)" >> $GITHUB_STEP_SUMMARY + - name: Update PR with comment + if: needs.init.outputs.release_type == 'PREVIEW_FEATURE_BRANCH' run: | - echo "GitHub Release notes: [$RELEASE_TAG](${{ github.server_url }}/${{ github.repository }}/releases/tag/$RELEASE_TAG)" >> $GITHUB_STEP_SUMMARY + cat << EndOfFile > comment_body.txt + @${{github.actor}} has published a preview version of this PR with release workflow run $GITHUB_WORKFLOW_RUN_LINK, based on commit ${{ github.sha }}: + + $RELEASE_VERSION + +
+ Want to make another preview release? + + Click 'Run workflow' in the $GITHUB_WORKFLOW_LINK, specifying the $GITHUB_REF_NAME branch, or use the [GitHub CLI](https://cli.github.com/) command: + + gh workflow run $GITHUB_WORKFLOW_FILE --ref $GITHUB_REF_NAME + +
+ +
+ Want to make a full release after this PR is merged? + + Click 'Run workflow' in the $GITHUB_WORKFLOW_LINK, leaving the branch as the default, or use the [GitHub CLI](https://cli.github.com/) command: + + gh workflow run $GITHUB_WORKFLOW_FILE + +
+ EndOfFile + + cat comment_body.txt + + gh pr comment ${{ github.ref_name }} --body-file comment_body.txt >> $GITHUB_STEP_SUMMARY diff --git a/docs/making-a-release.md b/docs/making-a-release.md index 75fdbef..9442dcc 100644 --- a/docs/making-a-release.md +++ b/docs/making-a-release.md @@ -16,7 +16,10 @@ https://github.com/guardian/gha-scala-library-release-workflow/assets/52038/ec18 ![image](https://github.com/guardian/gha-scala-library-release-workflow/assets/52038/a9ee9dd8-5443-41f6-b335-3b9ecf3e3b1d) * Click on `Run workflow` on the right-hand side of the blue _"This workflow has a workflow_dispatch event trigger."_ bar:
![image](https://github.com/guardian/gha-scala-library-release-workflow/assets/52038/4f25745a-207d-4d40-b697-d488918930f0) -* Click on the green `Run workflow` button in the modal popup that appears:
+* In the modal popup that appears: + * For a normal full release on the main branch, leave the branch set to the default (ie `main`). If you're + making a 'preview' release of an unmerged PR, select the PR's branch from the `Branch:` dropdown. + * Click on the green `Run workflow` button:
![image](https://github.com/guardian/gha-scala-library-release-workflow/assets/52038/b8669ae3-bb39-4ca6-b285-4eef3d3e341b) * You've started a release! However, the GitHub UI can be slow to update, so **reload** the page, and then click on the new workflow run to see its progress: