diff --git a/.github/workflows/reusable-release.yml b/.github/workflows/reusable-release.yml index 7d0c21c..6fe47b8 100644 --- a/.github/workflows/reusable-release.yml +++ b/.github/workflows/reusable-release.yml @@ -35,12 +35,14 @@ env: RUN_ATTEMPT_UID: ${{ github.run_id }}-${{ github.run_attempt }} jobs: - identifiers-for-signing-key: - name: 🔒 Read Signing Key Id + init: + name: 🔒 Init runs-on: ubuntu-latest 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,10 +61,31 @@ 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 }}) + + # * Full Main-Branch Release: 2 commits - committing non-snapshot version, then new snapshot version + # * Preview Feature-Branch Release: 1 commit - committing non-snapshot version only + 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 "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 - needs: identifiers-for-signing-key + needs: init runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -70,13 +93,22 @@ jobs: with: distribution: corretto java-version: 17 +# - name: Debug MIMA assessment +# run: | +# sbt "show versionPolicyFindIssues" - name: Use sbt-release to construct version.sbt updates - env: - KEY_EMAIL: ${{ needs.identifiers-for-signing-key.outputs.key_email }} run: | - git config user.email "$KEY_EMAIL" + 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 @@ -93,7 +125,7 @@ jobs: push-release-commit: name: 🔒 Push Release Commit - needs: [generate-version-update-commits, identifiers-for-signing-key] + needs: [generate-version-update-commits, init] permissions: contents: write runs-on: ubuntu-latest @@ -117,8 +149,8 @@ jobs: - name: Create commit id: create-commit env: - KEY_FINGERPRINT: ${{ needs.identifiers-for-signing-key.outputs.key_fingerprint }} - KEY_EMAIL: ${{ needs.identifiers-for-signing-key.outputs.key_email }} + KEY_FINGERPRINT: ${{ needs.init.outputs.key_fingerprint }} + KEY_EMAIL: ${{ needs.init.outputs.key_email }} run: | echo "GITHUB_REF_NAME=$GITHUB_REF_NAME" echo "GITHUB_REF=$GITHUB_REF" @@ -131,6 +163,7 @@ jobs: git config user.email "$KEY_EMAIL" git config user.name "$COMMITTER_NAME" git config commit.gpgsign true + git config tag.gpgSign true git config user.signingkey "$KEY_FINGERPRINT" git remote add unsigned ../repo-with-unsigned-version-update-commits.git @@ -147,11 +180,22 @@ jobs: 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 -s -m "Release $release_tag initiated by $COMMITTER_NAME" $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 - needs: [identifiers-for-signing-key, push-release-commit] + needs: [init, push-release-commit] runs-on: ubuntu-latest outputs: ARTIFACT_SHA256SUMS: ${{ steps.record-hashes.outputs.ARTIFACT_SHA256SUMS }} @@ -166,7 +210,7 @@ jobs: - name: Generate artifacts run: | cat << EndOfFile > sbt-commands.txt - set every sonatypeProjectHosting := Some(xerial.sbt.Sonatype.GitHubHosting("$GITHUB_REPOSITORY_OWNER", "${GITHUB_REPOSITORY#*/}", "${{ needs.identifiers-for-signing-key.outputs.key_email }}")) + set every sonatypeProjectHosting := Some(xerial.sbt.Sonatype.GitHubHosting("$GITHUB_REPOSITORY_OWNER", "${GITHUB_REPOSITORY#*/}", "${{ needs.init.outputs.key_email }}")) set ThisBuild / publishTo := Some(Resolver.file("foobar", file("$LOCAL_ARTIFACTS_STAGING_PATH"))) EndOfFile cat sbt-commands.txt @@ -192,10 +236,10 @@ jobs: sign: name: 🔒 Sign - needs: [identifiers-for-signing-key, push-release-commit, create-artifacts] + needs: [init, push-release-commit, create-artifacts] runs-on: ubuntu-latest env: - KEY_FINGERPRINT: ${{ needs.identifiers-for-signing-key.outputs.key_fingerprint }} + KEY_FINGERPRINT: ${{ needs.init.outputs.key_fingerprint }} steps: - uses: actions/checkout@v4 with: @@ -220,7 +264,7 @@ jobs: RELEASE_TAG: ${{ needs.push-release-commit.outputs.release_tag }} RELEASE_COMMIT_ID: ${{ needs.push-release-commit.outputs.release_commit_id }} ARTIFACT_SHA256SUMS: ${{ needs.create-artifacts.outputs.ARTIFACT_SHA256SUMS }} - KEY_EMAIL: ${{ needs.identifiers-for-signing-key.outputs.key_email }} + KEY_EMAIL: ${{ needs.init.outputs.key_email }} run: | echo "RELEASE_TAG=$RELEASE_TAG" echo "RELEASE_COMMIT_ID=$RELEASE_COMMIT_ID" @@ -239,8 +283,8 @@ jobs: echo "Message is..." cat tag-message.txt - echo "Creating tag" - git tag -a -F tag-message.txt $RELEASE_TAG $RELEASE_COMMIT_ID + echo "Creating/Updating release tag with artifact details" + git tag --force -a -F tag-message.txt $RELEASE_TAG $RELEASE_COMMIT_ID echo "RELEASE_TAG=$RELEASE_TAG" git show $RELEASE_TAG @@ -288,20 +332,61 @@ 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 }} + 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 + 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_TAG + +
+ 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