This is an automated email from the ASF dual-hosted git repository. matrei pushed a commit to branch release-updates-2 in repository https://gitbox.apache.org/repos/asf/grails-gradle-publish.git
commit 52c3a55dc26ac7614dd44cf28df413acd0800b5a Author: Mattias Reichel <[email protected]> AuthorDate: Wed Nov 26 09:36:58 2025 +0100 [skip ci] update release workflow --- .github/vote_templates/announce.txt | 13 +- .github/vote_templates/staged.txt | 16 +- .github/vote_templates/vote_succeeded.txt | 12 + .github/workflows/release.yaml | 364 ++++++++++++++++-------------- 4 files changed, 227 insertions(+), 178 deletions(-) diff --git a/.github/vote_templates/announce.txt b/.github/vote_templates/announce.txt index 48ad460..e77b40e 100644 --- a/.github/vote_templates/announce.txt +++ b/.github/vote_templates/announce.txt @@ -1,19 +1,20 @@ -The Apache Grails community is pleased to announce the release of Apache Grails - Grails Publish Gradle Plugin ${VERSION}. +The Apache Grails community is pleased to announce the release of Apache Grails - ${PROJECT_NAME} ${VERSION}. -The Grails Publish Gradle Plugin is a tool that simplifies the process of publishing Grails-related artifacts to various repository types - making it easier for developers to share their work with the community. +${PROJECT_DESC} -Users are encouraged to try the milestone to provide early feedback. Detailed instructions are available here: https://github.com/apache/grails-gradle-publish. +The release notes are available here: +https://github.com/${REPO_SLUG}/releases/tag/${TAG} For the complete list of changes: -https://github.com/apache/grails-gradle-publish/compare/v${PREVIOUS_VERSION}...v${VERSION} +https://github.com/${REPO_SLUG}/compare/v<PREVIOUS_VERSION>...${TAG} Apache Grails website: https://grails.apache.org/ Download Links: https://grails.apache.org/download.html Grails Resources: -- Grails Publish Gradle Plugin GitHub repo: https://github.com/apache/grails-gradle-publish -- Issues: https://github.com/apache/grails-gradle-publish/issues +- ${PROJECT_NAME} repo: https://github.com/${REPO_SLUG} +- Issues: https://github.com/${REPO_SLUG}/issues - Mailing lists: https://grails.apache.org/community.html Happy Coding, diff --git a/.github/vote_templates/staged.txt b/.github/vote_templates/staged.txt index dc24393..628dbb9 100644 --- a/.github/vote_templates/staged.txt +++ b/.github/vote_templates/staged.txt @@ -1,21 +1,21 @@ Hi Everyone, -I am happy to start the VOTE thread for an Apache Grails - Gradle Plugin - Grails Publish ${VERSION}! +I am happy to start the VOTE thread to release ${PROJECT_NAME} ${VERSION}! Pre-release discussion thread is here: <Thread Link> -Release notes & Tag for the release are here: -https://github.com/apache/grails-gradle-publish/releases/tag/v${VERSION} -Tag commit id: ${VERSION_COMMIT_ID} +The release notes and tag for the release are here: +https://github.com/${REPO_SLUG}/releases/tag/${TAG} +Tag commit id: ${SHA} The artifacts to be voted on are located as follows (r${DIST_SVN_REVISION}): -Source release: https://dist.apache.org/repos/dist/dev/grails/grails-publish/${VERSION}/sources +Source release: https://dist.apache.org/repos/dist/dev/${SVN_PROJECT}/${SVN_FOLDER}/${VERSION}/sources Release artifacts are signed with a key from the following file: https://dist.apache.org/repos/dist/release/grails/KEYS -Please vote on releasing this package as Apache Grails - Gradle Plugin - Grails Publish ${VERSION}. +Please vote on releasing this package as: ${PROJECT_NAME} ${VERSION}. Reminder on ASF release approval requirements for PMC members: https://www.apache.org/legal/release-policy.html#release-approval @@ -26,9 +26,9 @@ https://www.apache.org/info/verification.html The vote is open for a minimum of 72 hours and passes if a majority of at least three +1 PMC votes are cast. -[ ] +1 Release Apache Grails - Gradle Plugin - Grails Publish ${VERSION} +[ ] +1 Release ${PROJECT_NAME} ${VERSION} [ ] 0 I don't have a strong opinion about this, but I assume it's ok -[ ] -1 Do not release Apache Grails - Gradle Plugin - Grails Publish ${VERSION} because... +[ ] -1 Do not release ${PROJECT_NAME} ${VERSION} because... Here is my vote: diff --git a/.github/vote_templates/vote_succeeded.txt b/.github/vote_templates/vote_succeeded.txt new file mode 100644 index 0000000..f722d5d --- /dev/null +++ b/.github/vote_templates/vote_succeeded.txt @@ -0,0 +1,12 @@ +The vote has passed with <X> +1 binding votes and <Y> +1 additional votes. + +<IF NEW EMAIL> +Vote thread: <VOTE THREAD PERMALINK> +</IF NEW EMAIL> + +I'll proceed with the release and announce it shortly. + +Thanks to everyone who participated in the vote! + +Regards +<NAME> diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 281f45e..a085eea 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -19,7 +19,22 @@ on: types: [ published ] permissions: { } env: + DIST_NAME: apache-grails-publish GRAILS_PUBLISH_RELEASE: 'true' + JAVA_DISTRIBUTION: liberica + JAVA_VERSION: 17.0.17 # this must be a specific version for reproducible builds, keep it synced with .sdkmanrc + PROJECT_DESC: > + The Grails Publish Gradle Plugin is a tool that simplifies the process of publishing + Grails-related artifacts to various repository types - making it easier for developers + to share their work with the community. + PROJECT_NAME: Grails Publish Gradle Plugin + REPO_NAME: ${{ github.event.repository.name }} + REPO_SLUG: ${{ github.repository }} + SVN_FOLDER: grails-publish + SVN_PROJECT: grails + TAG: ${{ github.event.release.tag_name }} + TARGET_BRANCH: ${{ github.event.release.target_commitish }} + VERSION: will be computed in each job jobs: publish: name: "Stage Jar Files" @@ -27,104 +42,84 @@ jobs: contents: write # to stage distributions to the GitHub release page issues: write # to modify milestones runs-on: ubuntu-24.04 - outputs: - commit_sha: ${{ steps.commit_sha.outputs.value }} - release_version: ${{ steps.release_version.outputs.value }} steps: + - name: "📝 Establish release version" + run: echo "VERSION=${TAG#v}" >> "$GITHUB_ENV" - name: "🌐 Output Agent IP" # in the event RAO blocks this agent, this can be used to debug it run: curl -s https://api.ipify.org - name: "📥 Checkout repository" uses: actions/checkout@v5 with: + ref: ${{ env.TAG }} token: ${{ secrets.GITHUB_TOKEN }} # This should not be needed as ${{ github.token }} is the default, but there have been issues with it. - name: "📅 Store common build date" # to ensure a reproducible build run: echo "SOURCE_DATE_EPOCH=$(git log -1 --pretty=%ct)" >> "$GITHUB_ENV" - name: "📅 Ensure source files use common date" run: find . -depth \( -type f -o -type d \) -exec touch -d "@${SOURCE_DATE_EPOCH}" {} + - - name: "🔐 Set up GPG for signing" + - name: "🔐 Set up GPG for signing" # Use env var to not expose the key + env: + GPG_KEY: ${{ secrets.GRAILS_GPG_KEY }} run: | - echo "${{ secrets.GRAILS_GPG_KEY }}" | gpg --batch --import + echo "${GPG_KEY}" | gpg --batch --import gpg --list-keys - name: "☕️ Setup JDK" uses: actions/setup-java@v5 with: - distribution: liberica - java-version: 17.0.14 # this must be a specific version for reproducible builds + distribution: ${{ env.JAVA_DISTRIBUTION }} + java-version: ${{ env.JAVA_VERSION }} - name: "🐘 Setup Gradle" uses: gradle/actions/setup-gradle@v5 with: develocity-access-key: ${{ secrets.GRAILS_DEVELOCITY_ACCESS_KEY }} - - name: "📝 Store the current release version" - id: release_version - env: - TAG_NAME: ${{ github.event.release.tag_name }} - run: echo "value=${TAG_NAME#v}" >> $GITHUB_OUTPUT - name: "⚙️ Run pre-release" uses: apache/grails-github-actions/pre-release@asf env: - RELEASE_VERSION: ${{ steps.release_version.outputs.value }} - - name: "📝 Fetch new sha for the release tag after pre-prelease commit" - id: commit_sha - env: - REPO: ${{ github.repository }} - TAG: ${{ github.event.release.tag_name }} - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - ref_json=$(gh api "repos/$REPO/git/ref/tags/$TAG") - type=$(jq -r '.object.type' <<<"$ref_json") - sha=$(jq -r '.object.sha' <<<"$ref_json") - if [ "$type" = "tag" ]; then - sha=$(gh api "repos/$REPO/git/tags/$sha" --jq '.object.sha') - fi - echo "Found commit sha: $sha" - echo "value=$sha" >> $GITHUB_OUTPUT + RELEASE_VERSION: ${{ env.VERSION }} - name: "🧩 Run Assemble" - run: > - ./gradlew assemble + run: ./gradlew assemble - name: "📦 Generate docs" - run: > - ./gradlew grails-publish:groovydoc + run: ./gradlew grails-publish:groovydoc - name: "✨ Create Staging Repository" env: NEXUS_PUBLISH_USERNAME: ${{ secrets.NEXUS_STAGE_DEPLOYER_USER }} NEXUS_PUBLISH_PASSWORD: ${{ secrets.NEXUS_STAGE_DEPLOYER_PW }} NEXUS_PUBLISH_URL: ${{ vars.STAGING_URL }} NEXUS_PUBLISH_STAGING_PROFILE_ID: ${{ secrets.STAGING_PROFILE_ID }} - NEXUS_PUBLISH_DESCRIPTION: '${{ github.event.repository.name }}:${{ steps.release_version.outputs.value }}' - SIGNING_KEY: ${{ secrets.GPG_KEY_ID }} + NEXUS_PUBLISH_DESCRIPTION: '${{ env.REPO_NAME }}:${{ env.VERSION }}' run: ./gradlew initializeSonatypeStagingRepository - - name: "📤 Publish" + - name: "📤 Publish to Staging Repository" env: NEXUS_PUBLISH_USERNAME: ${{ secrets.NEXUS_STAGE_DEPLOYER_USER }} NEXUS_PUBLISH_PASSWORD: ${{ secrets.NEXUS_STAGE_DEPLOYER_PW }} NEXUS_PUBLISH_URL: ${{ vars.STAGING_URL }} NEXUS_PUBLISH_STAGING_PROFILE_ID: ${{ secrets.STAGING_PROFILE_ID }} - NEXUS_PUBLISH_DESCRIPTION: '${{ github.event.repository.name }}:${{ steps.release_version.outputs.value }}' + NEXUS_PUBLISH_DESCRIPTION: '${{ env.REPO_NAME }}:${{ env.VERSION }}' SIGNING_KEY: ${{ secrets.GPG_KEY_ID }} run: > - ./gradlew findSonatypeStagingRepository - publishToSonatype + ./gradlew + -x initializeSonatypeStagingRepository + findSonatypeStagingRepository + publishToSonatype aggregateChecksums aggregatePublishedArtifacts - -x initializeSonatypeStagingRepository - name: "✅ Close Staging Repository" env: NEXUS_PUBLISH_USERNAME: ${{ secrets.NEXUS_STAGE_DEPLOYER_USER }} NEXUS_PUBLISH_PASSWORD: ${{ secrets.NEXUS_STAGE_DEPLOYER_PW }} NEXUS_PUBLISH_URL: ${{ vars.STAGING_URL }} NEXUS_PUBLISH_STAGING_PROFILE_ID: ${{ secrets.STAGING_PROFILE_ID }} - NEXUS_PUBLISH_DESCRIPTION: '${{ github.event.repository.name }}:${{ steps.release_version.outputs.value }}' - SIGNING_KEY: ${{ secrets.GPG_KEY_ID }} + NEXUS_PUBLISH_DESCRIPTION: '${{ env.REPO_NAME }}:${{ env.VERSION }}' run: > - ./gradlew findSonatypeStagingRepository - closeSonatypeStagingRepository + ./gradlew -x initializeSonatypeStagingRepository + findSonatypeStagingRepository + closeSonatypeStagingRepository - name: "📅 Generate build date file" run: echo "$SOURCE_DATE_EPOCH" >> build/BUILD_DATE.txt - name: "📤 Upload build date, checksums and published artifacts files" uses: softprops/action-gh-release@v2 with: - tag_name: ${{ github.event.release.tag_name }} + tag_name: ${{ env.TAG }} files: | build/BUILD_DATE.txt build/CHECKSUMS.txt @@ -136,84 +131,87 @@ jobs: contents: write runs-on: ubuntu-24.04 steps: + - name: "📝 Establish release version" + run: echo "VERSION=${TAG#v}" >> "$GITHUB_ENV" - name: "📥 Checkout repository" uses: actions/checkout@v5 with: + path: grails-publish + ref: ${{ env.TAG }} token: ${{ secrets.GITHUB_TOKEN }} # This should not be needed as ${{ github.token }} is the default, but there have been issues with it. - path: 'grails-publish' - name: "🗑️ Remove unnecessary files" run: | - rm -f \ - grails-publish/gradle/wrapper/gradle-wrapper.jar \ - grails-publish/gradle/wrapper/gradle-wrapper.properties \ - grails-publish/gradlew.bat \ - grails-publish/gradlew + rm -f grails-publish/gradle/wrapper/gradle-wrapper.jar + rm -f grails-publish/gradle/wrapper/gradle-wrapper.properties + rm -f grails-publish/gradlew.bat + rm -f grails-publish/gradlew - name: "📥 Download CHECKSUMS.txt and rename to CHECKSUMS" - working-directory: 'grails-publish' + working-directory: grails-publish env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | - release_url=$(gh release view ${{ github.event.release.tag_name }} --json assets --repo ${{ github.repository }} --jq '.assets[] | select(.name == "CHECKSUMS.txt") | .url') - curl -f -L -H "Authorization: token $GH_TOKEN" -o CHECKSUMS "$release_url" + release_url=$(gh release view ${TAG} --json assets --repo ${REPO_SLUG} --jq '.assets[] | select(.name == "CHECKSUMS.txt") | .url') + curl -f -L -H "Authorization: token $TOKEN" -o CHECKSUMS "$release_url" - name: "📥 Download PUBLISHED_ARTIFACTS.txt and rename to PUBLISHED_ARTIFACTS" - working-directory: 'grails-publish' + working-directory: grails-publish env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | - release_url=$(gh release view ${{ github.event.release.tag_name }} --json assets --repo ${{ github.repository }} --jq '.assets[] | select(.name == "PUBLISHED_ARTIFACTS.txt") | .url') - curl -f -L -H "Authorization: token $GH_TOKEN" -o PUBLISHED_ARTIFACTS "$release_url" + release_url=$(gh release view ${TAG} --json assets --repo ${REPO_SLUG} --jq '.assets[] | select(.name == "PUBLISHED_ARTIFACTS.txt") | .url') + curl -f -L -H "Authorization: token $TOKEN" -o PUBLISHED_ARTIFACTS "$release_url" - name: "📥 Download BUILD_DATE.txt and rename to BUILD_DATE" - working-directory: 'grails-publish' + working-directory: grails-publish env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | - release_url=$(gh release view ${{ github.event.release.tag_name }} --json assets --repo ${{ github.repository }} --jq '.assets[] | select(.name == "BUILD_DATE.txt") | .url') - curl -f -L -H "Authorization: token $GH_TOKEN" -o BUILD_DATE "$release_url" + release_url=$(gh release view ${TAG} --json assets --repo ${REPO_SLUG} --jq '.assets[] | select(.name == "BUILD_DATE.txt") | .url') + curl -f -L -H "Authorization: token $TOKEN" -o BUILD_DATE "$release_url" - name: "📅 Ensure source files use common date" run: | SOURCE_DATE_EPOCH=$(cat grails-publish/BUILD_DATE) find . -depth \( -type f -o -type d \) -exec touch -d "@${SOURCE_DATE_EPOCH}" {} + - name: "📦 Create source distribution ZIP" - run: | - zip -r \ - "apache-grails-publish-${{ needs.publish.outputs.release_version }}-src.zip" \ - grails-publish \ - -x 'grails-publish/.git/*' \ + run: > + zip -r + ${DIST_NAME}-${VERSION}-src.zip + grails-publish + -x 'grails-publish/.git/*' -x 'grails-publish/.github/*' - - name: '🔐 Set up GPG for signing artifacts' + - name: '🔐 Set up GPG for signing artifacts' # use env var to not expose the key + env: + GPG_KEY: ${{ secrets.GRAILS_GPG_KEY }} run: | - echo "${{ secrets.GRAILS_GPG_KEY }}" | gpg --batch --import + echo "${GPG_KEY}" | gpg --batch --import gpg --list-keys - name: "🔏 Sign source distribution ZIP" - run: | - gpg \ - --default-key "${{ secrets.GPG_KEY_ID }}" \ - --batch \ - --yes \ - --pinentry-mode loopback \ - --armor \ - --detach-sign apache-grails-publish-${{ needs.publish.outputs.release_version }}-src.zip + run: > + gpg + --default-key "${{ secrets.GPG_KEY_ID }}" + --batch + --yes + --pinentry-mode loopback + --armor + --detach-sign + ${DIST_NAME}-${VERSION}-src.zip - name: "📦 Create source distribution checksum" - run: | - sha512sum "apache-grails-publish-${{ needs.publish.outputs.release_version }}-src.zip" \ - > "apache-grails-publish-${{ needs.publish.outputs.release_version }}-src.zip.sha512" + run: sha512sum ${DIST_NAME}-${VERSION}-src.zip > ${DIST_NAME}-${VERSION}-src.zip.sha512 - name: "🚀 Upload ZIP and Signature to GitHub Release" uses: softprops/action-gh-release@v2 with: - tag_name: ${{ github.event.release.tag_name }} + tag_name: ${{ env.TAG }} files: | - apache-grails-publish-${{ needs.publish.outputs.release_version }}-src.zip - apache-grails-publish-${{ needs.publish.outputs.release_version }}-src.zip.asc - apache-grails-publish-${{ needs.publish.outputs.release_version }}-src.zip.sha512 + ${{ env.DIST_NAME }}-${{ env.VERSION }}-src.zip + ${{ env.DIST_NAME }}-${{ env.VERSION }}-src.zip.asc + ${{ env.DIST_NAME }}-${{ env.VERSION }}-src.zip.sha512 - name: "🗑️ Remove CHECKSUMS.txt asset from release" env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | set -e gh release delete-asset \ - ${{ github.event.release.tag_name }} \ + ${TAG} \ CHECKSUMS.txt \ - --repo ${{ github.repository }} \ + --repo ${REPO_SLUG} \ --yes - name: "🗑️ Remove BUILD_DATE.txt asset from release" env: @@ -221,9 +219,9 @@ jobs: run: | set -e gh release delete-asset \ - ${{ github.event.release.tag_name }} \ + ${TAG} \ BUILD_DATE.txt \ - --repo ${{ github.repository }} \ + --repo ${REPO_SLUG} \ --yes - name: "🗑️ Remove PUBLISHED_ARTIFACTS.txt asset from release" env: @@ -231,12 +229,12 @@ jobs: run: | set -e gh release delete-asset \ - ${{ github.event.release.tag_name }} \ + ${TAG} \ PUBLISHED_ARTIFACTS.txt \ - --repo ${{ github.repository }} \ + --repo ${REPO_SLUG} \ --yes upload: - name: "Upload Source Distribution" + name: "Upload Source Distribution to dist.apache.org" needs: [ publish, source ] runs-on: ubuntu-24.04 permissions: @@ -245,87 +243,92 @@ jobs: SVN_USERNAME: ${{ secrets.SVC_DIST_GRAILS_USERNAME }} SVN_PASSWORD: ${{ secrets.SVC_DIST_GRAILS_PASSWORD }} steps: - - name: "🌐 Output Agent IP" # in the event RAO blocks this agent, this can be used to debug it - run: curl -s https://api.ipify.org - - name: "⚙️ Setup SVN and Tools" + - name: "📝 Establish release version" + run: echo "VERSION=${TAG#v}" >> "$GITHUB_ENV" + - name: "🛠️ Install tools" run: sudo apt-get install -y subversion subversion-tools tree gettext-base - - name: "👀 Ensure grails dev folder exists" + - name: "👀 Ensure dev/${{ env.SVN_PROJECT }} folder exists" run: | set -e - if svn ls https://dist.apache.org/repos/dist/dev/grails --username "$SVN_USERNAME" --password "$SVN_PASSWORD" --non-interactive; then - echo "Dev Folder 'grails' already exists — skipping creation" + if svn ls https://dist.apache.org/repos/dist/dev/${SVN_PROJECT} --username "${SVN_USERNAME}" --password "${SVN_PASSWORD}" --non-interactive; then + echo "Dev Folder [${SVN_PROJECT}] already exists — skipping creation" else - echo "Dev Folder 'grails' does not exist, creating" - svnmucc --username "$SVN_USERNAME" --password "$SVN_PASSWORD" --non-interactive \ - mkdir https://dist.apache.org/repos/dist/dev/grails \ - -m "Create 'grails' dev folder" + echo "Dev Folder [${SVN_PROJECT}] does not exist, creating" + svnmucc --username "${SVN_USERNAME}" --password "${SVN_PASSWORD}" --non-interactive \ + mkdir https://dist.apache.org/repos/dist/dev/${SVN_PROJECT} \ + -m "Create '${SVN_PROJECT}' dev folder" fi - - name: "👀 Ensure grails publish folder exists" + - name: "👀 Ensure dev/${{ env.SVN_PROJECT }}/${{ env.SVN_FOLDER }} folder exists" run: | set -e - if svn ls https://dist.apache.org/repos/dist/dev/grails/grails-publish --username "$SVN_USERNAME" --password "$SVN_PASSWORD" --non-interactive; then - echo "Dev Folder 'grails/grails-publish' already exists — skipping creation" + if svn ls https://dist.apache.org/repos/dist/dev/${SVN_PROJECT}/${SVN_FOLDER} --username "${SVN_USERNAME}" --password "${SVN_PASSWORD}" --non-interactive; then + echo "Dev Folder [${SVN_PROJECT}/${SVN_FOLDER}] already exists — skipping creation" else - echo "Dev Folder 'grails/grails-publish' does not exist, creating" - svnmucc --username "$SVN_USERNAME" --password "$SVN_PASSWORD" --non-interactive \ - mkdir https://dist.apache.org/repos/dist/dev/grails/grails-publish \ - -m "Create 'grails-publish' dev folder" + echo "Dev Folder [${SVN_PROJECT}/${SVN_FOLDER}] does not exist, creating" + svnmucc --username "${SVN_USERNAME}" --password "${SVN_PASSWORD}" --non-interactive \ + mkdir https://dist.apache.org/repos/dist/dev/${SVN_PROJECT}/${SVN_FOLDER} \ + -m "Create '${SVN_PROJECT}/${SVN_FOLDER}' dev folder" fi - name: "📥 Checkout dev repo" run: | - svn checkout --username "$SVN_USERNAME" --password "$SVN_PASSWORD" --non-interactive https://dist.apache.org/repos/dist/dev/grails/grails-publish dev-repo + svn checkout --username "${SVN_USERNAME}" --password "${SVN_PASSWORD}" --non-interactive "https://dist.apache.org/repos/dist/dev/${SVN_PROJECT}/${SVN_FOLDER}" dev-repo - name: "🗑️ Remove existing dev version" run: | - export VERSION="${{ needs.publish.outputs.release_version }}" cd dev-repo - if [ -d "$VERSION" ]; then - svn delete "$VERSION" - svn commit -m "Remove grails-publish dev version $VERSION" --username "$SVN_USERNAME" --password "$SVN_PASSWORD" --non-interactive + if [ -d "${VERSION}" ]; then + svn delete "${VERSION}" + svn commit -m "Remove ${SVN_PROJECT} ${SVN_FOLDER} dev version ${VERSION}" --username "${SVN_USERNAME}" --password "${SVN_PASSWORD}" --non-interactive else - echo "No existing dev version $VERSION to remove" + echo "No existing dev version ${VERSION} to remove" fi - name: "📥 Fetch source distributions" run: | - export TAG="${{ github.event.release.tag_name }}" - export VERSION="${{ needs.publish.outputs.release_version }}" cd dev-repo - mkdir -p $VERSION/sources - cd $VERSION/sources - curl -f -LO https://github.com/${{ github.repository }}/releases/download/$TAG/apache-grails-publish-$VERSION-src.zip - curl -f -LO https://github.com/${{ github.repository }}/releases/download/$TAG/apache-grails-publish-$VERSION-src.zip.sha512 - curl -f -LO https://github.com/${{ github.repository }}/releases/download/$TAG/apache-grails-publish-$VERSION-src.zip.asc + mkdir -p ${VERSION}/sources + cd ${VERSION}/sources + curl -f -LO https://github.com/${REPO_SLUG}/releases/download/${TAG}/${DIST_NAME}-${VERSION}-src.zip + curl -f -LO https://github.com/${REPO_SLUG}/releases/download/${TAG}/${DIST_NAME}-${VERSION}-src.zip.sha512 + curl -f -LO https://github.com/${REPO_SLUG}/releases/download/${TAG}/${DIST_NAME}-${VERSION}-src.zip.asc echo "Downloaded the following files:" ls -l - - name: "Upload distributions" + - name: "🚀 Upload distributions" run: | - export VERSION="${{ needs.publish.outputs.release_version }}" cd dev-repo echo "Adding the following files to SVN:" tree - svn add $VERSION --force - svn commit -m "Upload grails distribution files for $VERSION" --username "$SVN_USERNAME" --password "$SVN_PASSWORD" --non-interactive + svn add ${VERSION} --force + svn commit -m "Upload ${PROJECT_NAME} distribution files for ${VERSION}" --username "${SVN_USERNAME}" --password "${SVN_PASSWORD}" --non-interactive pwd - name: "💾 Store Distribution SVN revision in a file" run: | - export VERSION="${{ needs.publish.outputs.release_version }}" cd dev-repo - svn info $VERSION > "DIST_SVN_REVISION.txt" - - name: "📤 Upload the Distribution SVN revision file" + svn info ${VERSION} > DIST_SVN_REVISION.txt + - name: "📤 Upload Distribution SVN revision" uses: softprops/action-gh-release@v2 with: - tag_name: ${{ github.event.release.tag_name }} + tag_name: ${{ env.TAG }} files: dev-repo/DIST_SVN_REVISION.txt - name: "📥 Checkout repository" uses: actions/checkout@v5 with: - token: ${{ secrets.GITHUB_TOKEN }} # This should not be needed as ${{ github.token }} is the default, but there have been issues with it. - path: 'grails-publish' - - name: "📧 Print Grails Vote Email" + path: ${{ env.REPO_NAME }} + ref: ${{ env.TAG }} + - name: "📝 Fetch new sha for the release tag after pre-prelease commit" env: - VERSION: ${{ needs.publish.outputs.release_version }} - VERSION_COMMIT_ID: ${{ needs.publish.outputs.commit_sha }} + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + ref_json=$(gh api "repos/${REPO_SLUG}/git/ref/tags/${TAG}") + type=$(jq -r '.object.type' <<<"$ref_json") + sha=$(jq -r '.object.sha' <<<"$ref_json") + if [ "$type" = "tag" ]; then + sha=$(gh api "repos/${REPO_SLUG}/git/tags/${sha}" --jq '.object.sha') + fi + echo "Found sha: $sha" + echo "SHA=${sha}" >> "$GITHUB_ENV" + - name: "📧 Print Grails Vote Email" run: | export DIST_SVN_REVISION=$(awk '/Last Changed Rev:/ {print $4}' dev-repo/DIST_SVN_REVISION.txt) + echo "::group::Grails PMC Vote Email" echo "" echo "TO:" @@ -335,77 +338,102 @@ jobs: echo "" echo "Subject:" echo "*************************************************" - echo "[VOTE] Release Apache Grails - Gradle Plugin - Grails Publish ${VERSION}" + echo "[VOTE] Release ${PROJECT_NAME} ${VERSION}" echo "*************************************************" - echo "" echo "Body:" echo "*************************************************" - cat grails-publish/.github/vote_templates/staged.txt | envsubst + cat ${REPO_NAME}/.github/vote_templates/staged.txt | envsubst echo "*************************************************" echo "::endgroup::" release: environment: release - name: 'VOTE SUCCEEDED - Release Artifacts' + name: "VOTE SUCCEEDED - Release Artifacts" needs: [ publish, source, upload ] runs-on: ubuntu-24.04 steps: - - name: "Output Agent IP" # in the event RAO blocks this agent, this can be used to debug it - run: curl -s https://api.ipify.org - - name: "Setup SVN and Tools" - run: sudo apt-get install -y subversion subversion-tools tree gettext-base - - name: "🗳 Grails PMC Vote Confirmation - MANUAL" + - name: "📝 Establish release version" + run: echo "VERSION=${TAG#v}" >> "$GITHUB_ENV" + - name: "🛠️ Install tools" + run: sudo apt-get install -y gettext-base + - name: "📥 Checkout repository" + uses: actions/checkout@v5 + with: + ref: ${{ env.TAG }} + - name: "🗳 MANUAL - Confirm Grails PMC Vote succeeded" run: | echo "::group::Manual Confirmation" - echo "🔎 This step is a placeholder that the vote confirmation on [email protected] completed successfully." + echo "🔎 Make sure that the vote confirmation on [email protected] completed successfully before proceeding." echo "::endgroup::" - - name: "🚀 Release JAR files - MANUAL" + - name: "📧 MANUAL - Send Vote Result Email" + run: | + echo "::group::Manual Vote Result Email" + echo "" + echo "Send a new email or reply to the original vote email by changing the subject." + echo "" + echo "TO:" + echo "*************************************************" + echo "[email protected]" + echo "*************************************************" + echo "" + echo "Subject:" + echo "*************************************************" + echo "[RESULT][VOTE] ${PROJECT_NAME} ${VERSION}" + echo "*************************************************" + echo "" + echo "Body:" + echo "*************************************************" + cat .github/vote_templates/vote_succeeded.txt | envsubst + echo "*************************************************" + echo "::endgroup::" + - name: "🚀 MANUAL - Release JAR files" run: | echo "::group::Manual Jar Promotion" - echo "Run .github/scripts/releaseJarFiles.sh '${{ github.event.release.tag_name }}' '${{ github.event.repository.name }}:${{ needs.publish.outputs.release_version }}' <ASF_USER>" + echo "Run .github/scripts/releaseJarFiles.sh ${REPO_NAME}:${VERSION} <ASF_USER>" echo "::endgroup::" - - name: "🚀 Release distribution artifacts - MANUAL" + - name: "🚀 MANUAL - Release distribution artifacts" run: | echo "::group::Manual ASF Artifact Promotion" - echo "Run github/scripts/releaseDistributions.sh '${{ github.event.release.tag_name }}' <ASF_USER>" + echo "Run .github/scripts/releaseDistributions.sh ${TAG} ${SVN_FOLDER} <ASF_USER>" echo "::endgroup::" - - name: "✅ Update ASF Reporter - MANUAL" + - name: "✅ MANUAL - Update ASF Reporter" run: | echo "::group::Manual ASF Reporter Update" TODAY=$(date +"%Y-%m-%d") - echo "Check email from [email protected] & update https://reporter.apache.org/addrelease.html?grails to add GRAILS-PUBLISH-${{ needs.publish.outputs.release_version }} as complete as of ${TODAY}" + echo "Check email from [email protected] & update https://reporter.apache.org/addrelease.html?${SVN_PROJECT} to add ${SVN_FOLDER^^}-${VERSION} as complete as of ${TODAY}" echo "::endgroup::" docs: environment: docs name: "VOTE SUCCEEDED - Publish Documentation" - needs: [ publish, source, upload ] # TODO Once we have confirmed release won't fail, add it as a dependency here + needs: [ publish, source, upload, release ] runs-on: ubuntu-24.04 permissions: contents: write # required gh-pages update steps: + - name: "📝 Establish release version" + run: echo "VERSION=${TAG#v}" >> "$GITHUB_ENV" - name: "📥 Checkout repository" uses: actions/checkout@v5 with: + ref: ${{ env.TAG }} token: ${{ secrets.GITHUB_TOKEN }} # This should not be needed as ${{ github.token }} is the default, but there have been issues with it. - name: "📅 Ensure Common Build Date" # to ensure a reproducible build run: echo "SOURCE_DATE_EPOCH=$(git log -1 --pretty=%ct)" >> "$GITHUB_ENV" - name: "☕️ Setup JDK" uses: actions/setup-java@v5 with: - java-version: 17 - distribution: liberica + distribution: ${{ env.JAVA_DISTRIBUTION }} + java-version: ${{ env.JAVA_VERSION }} - name: "🐘 Setup Gradle" uses: gradle/actions/setup-gradle@v5 with: develocity-access-key: ${{ secrets.GRAILS_DEVELOCITY_ACCESS_KEY }} - name: "📖 Generate Documentation" - run: > - ./gradlew grails-publish:groovydoc - - name: "🚀 Publish to Github Pages" + run: ./gradlew grails-publish:groovydoc + - name: "🚀 Publish to GitHub Pages" uses: apache/grails-github-actions/deploy-github-pages@asf env: GRADLE_PUBLISH_RELEASE: 'true' SOURCE_FOLDER: plugin/build/docs/api - VERSION: ${{ needs.publish.outputs.release_version }} close: name: "VOTE SUCCEEDED - Close Release" environment: release @@ -417,21 +445,29 @@ jobs: pull-requests: write # to open PR actions: write # in case there are pending changes to release.yml in the target branch steps: + - name: "📝 Establish release version" + run: echo "VERSION=${TAG#v}" >> "$GITHUB_ENV" + - name: "🛠️ Install tools" + run: sudo apt-get install -y gettext-base - name: "📥 Checkout repository" uses: actions/checkout@v5 with: + ref: ${{ env.TAG }} token: ${{ secrets.GITHUB_TOKEN }} # This should not be needed as ${{ github.token }} is the default, but there have been issues with it. - name: "⚙️ Run post-release" uses: apache/grails-github-actions/post-release@asf - - name: '🌎 Create Blog Post - MANUAL' + - name: "🌎 MANUAL - Create Blog Post" run: | echo "::group::Blog Post Creation - MANUAL" - echo "Publish a blog post on https://grails.apache.org/blog/ about the new release ${{ needs.publish.outputs.release_version }} using the repo https://github.com/apache/grails-static-website" + echo "Publish a blog post on https://grails.apache.org/blog/ about the new release [${VERSION}] using the repo https://github.com/apache/grails-static-website" echo "::endgroup::" - - name: '✉️ Announcement Email' - env: - VERSION: ${{ needs.publish.outputs.release_version }} - PREVIOUS_VERSION: 'TODO_PREVIOUS_VERSION' + - name: "🌎 MANUAL - Merge Close Release PR" + run: | + echo "::group::Merge Close Release PR - MANUAL" + echo "The post-release step in the release workflow will create a merge branch for the original tag with version number and then open a PR to merge back into the next branch." + echo "You will need to merge this PR into the branch after correcting any merge conflict." + echo "::endgroup::" + - name: '📧 Announcement Email' run: | echo "::group::Announcement Email" echo "" @@ -442,7 +478,7 @@ jobs: echo "" echo "Subject:" echo "*************************************************" - echo "[ANNOUNCE] Apache Grails - Gradle Plugin - Grails Publish ${VERSION}" + echo "[ANNOUNCE] ${PROJECT_NAME} ${VERSION}" echo "*************************************************" echo "" echo "Body:"
