Skip to content

[release] Prepare and release 3.7.0 #1359

[release] Prepare and release 3.7.0

[release] Prepare and release 3.7.0 #1359

Workflow file for this run

name: publish
on:
push:
branches:
# For branches, better to list them explicitly than regexp include.
# Older branches are triggered using workflows present there
- main
permissions: read-all
env:
DOCS_ZIP: docs-zip
DOCS_ZIP_PATH: docs/build/distributions
jobs:
# General job notes: we DON'T want to cancel any previous runs, especially in the case of a "back to snapshots" build right after a release push
# We specify the ubuntu version to minimize the chances we have to deal with a migration during a release
prepare:
# Notes on prepare: this job has no access to secrets, only github token. As a result, all non-core actions are centralized here
# This includes the tagging and drafting of release notes. Still, when possible we favor plain run of gradle tasks
runs-on: ubuntu-20.04
strategy:
fail-fast: false
matrix:
test-type:
- type: core
arguments: ":reactor-core:test --no-daemon"
- type: core-java21
arguments: ":reactor-core:java21Test --no-daemon"
- type: other
arguments: "check -x :reactor-core:test -x :reactor-core:java11Test -x :reactor-core:java21Test -x spotlessCheck -x :reactor-core:jcstress --no-daemon"
name: prepare - ${{ matrix.test-type.type }} tests
outputs:
versionType: ${{ steps.version.outputs.versionType }}
fullVersion: ${{ steps.version.outputs.fullVersion }}
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # tag=v4
- name: Setup JDK 11
if: contains('main', github.base_ref)
uses: actions/setup-java@8df1039502a15bceb9433410b1a100fbe190c53b # tag=v3
with:
distribution: 'temurin'
java-version: 11
- name: Setup JDK 21
if: contains('main 3.6.x', github.base_ref)
uses: actions/setup-java@8df1039502a15bceb9433410b1a100fbe190c53b # tag=v3
with:
distribution: 'temurin'
java-version: 21
- name: Setup JDK 8
uses: actions/setup-java@8df1039502a15bceb9433410b1a100fbe190c53b # tag=v3
with:
distribution: 'temurin'
java-version: 8
- name: Setup Gradle
uses: gradle/actions/setup-gradle@d156388eb19639ec20ade50009f3d199ce1e2808
- name: interpret version
id: version
#we only run the qualifyVersionGha task so that no other console printing can hijack this step's output
#output: versionType, fullVersion
#fails if versionType is BAD, which interrupts the workflow
run: ./gradlew qualifyVersionGha
- name: run checks
id: checks
run: ./gradlew ${{ matrix.test-type.arguments }}
# Build the docs-zip antora doc for the current branch, and upload generated docs-zip to workflow run.
# JDK21 is used because the antora plugin requires a JDK17 compatible version.
# Each deploy job can then download the docs-zip to ./docs/build/distributions/ in order to let it be included in published artifacts.
# (see gradle/setup.gradle publications which includes docs zip file, if found from docs/build/distributions directory)
build-docs-zip:
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- name: Set up Ruby for asciidoctor-pdf
uses: ruby/setup-ruby@cacc9f1c0b3f4eb8a16a6bb0ed10897b43b9de49 # v1
with:
ruby-version: 3.3.0
- name: Install asciidoctor-pdf / rouge
run: gem install asciidoctor-pdf rouge
- name: Setup java 21 for antora
uses: actions/setup-java@8df1039502a15bceb9433410b1a100fbe190c53b # v4
with:
distribution: 'temurin'
java-version: '21'
- name: Build antora docs zip distribution for the current branch
run: ./gradlew docs
- name: Upload docs/build to current workflow run
uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4
with:
name: ${{ env.DOCS_ZIP }}
path: ${{ env.DOCS_ZIP_PATH }}
retention-days: 3
if-no-files-found: error
#deploy the snapshot artifacts to Artifactory
deploySnapshot:
name: deploySnapshot
runs-on: ubuntu-20.04
needs: [prepare, build-docs-zip]
if: needs.prepare.outputs.versionType == 'SNAPSHOT'
environment: snapshots
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # tag=v4
- name: Setup JDK 11
if: contains('main', github.base_ref)
uses: actions/setup-java@8df1039502a15bceb9433410b1a100fbe190c53b # tag=v3
with:
distribution: 'temurin'
java-version: 11
- name: Setup JDK 21
if: contains('main 3.6.x', github.base_ref)
uses: actions/setup-java@8df1039502a15bceb9433410b1a100fbe190c53b # tag=v3
with:
distribution: 'temurin'
java-version: 21
- name: Setup JDK 8
uses: actions/setup-java@8df1039502a15bceb9433410b1a100fbe190c53b # tag=v3
with:
distribution: 'temurin'
java-version: 8
- name: Download antora docs-zip
uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e # v4
with:
name: ${{ env.DOCS_ZIP }}
path: ${{ env.DOCS_ZIP_PATH }}
- name: deploy
env:
ORG_GRADLE_PROJECT_artifactory_publish_username: ${{secrets.ARTIFACTORY_SNAPSHOT_USERNAME}}
ORG_GRADLE_PROJECT_artifactory_publish_password: ${{secrets.ARTIFACTORY_PASSWORD}}
run: |
./gradlew -Dorg.gradle.parallel=false assemble artifactoryPublish -Partifactory_publish_contextUrl=https://repo.spring.io -Partifactory_publish_repoKey=libs-snapshot-local
#sign the milestone artifacts and deploy them to Artifactory
deployMilestone:
name: deployMilestone
runs-on: ubuntu-20.04
needs: [prepare, build-docs-zip]
if: needs.prepare.outputs.versionType == 'MILESTONE'
environment: releases
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # tag=v4
- name: Setup JDK 11
if: contains('main', github.base_ref)
uses: actions/setup-java@8df1039502a15bceb9433410b1a100fbe190c53b # tag=v3
with:
distribution: 'temurin'
java-version: 11
- name: Setup JDK 21
if: contains('main 3.6.x', github.base_ref)
uses: actions/setup-java@8df1039502a15bceb9433410b1a100fbe190c53b # tag=v3
with:
distribution: 'temurin'
java-version: 21
- name: Setup JDK 8
uses: actions/setup-java@8df1039502a15bceb9433410b1a100fbe190c53b # tag=v3
with:
distribution: 'temurin'
java-version: 8
- name: Download antora docs-zip
uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e # v4
with:
name: ${{ env.DOCS_ZIP }}
path: ${{ env.DOCS_ZIP_PATH }}
- name: deploy
env:
ORG_GRADLE_PROJECT_artifactory_publish_username: ${{secrets.ARTIFACTORY_USERNAME}}
ORG_GRADLE_PROJECT_artifactory_publish_password: ${{secrets.ARTIFACTORY_PASSWORD}}
ORG_GRADLE_PROJECT_signingKey: ${{secrets.SIGNING_KEY}}
ORG_GRADLE_PROJECT_signingPassword: ${{secrets.SIGNING_PASSPHRASE}}
run: |
./gradlew -Dorg.gradle.parallel=false assemble sign artifactoryPublish -Partifactory_publish_contextUrl=https://repo.spring.io -Partifactory_publish_repoKey=libs-milestone-local
#sign the release artifacts and deploy them to Artifactory
deployRelease:
name: deployRelease
runs-on: ubuntu-20.04
needs: [prepare, build-docs-zip]
if: needs.prepare.outputs.versionType == 'RELEASE'
environment: releases
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # tag=v4
- name: Setup JDK 11
if: contains('main', github.base_ref)
uses: actions/setup-java@8df1039502a15bceb9433410b1a100fbe190c53b # tag=v3
with:
distribution: 'temurin'
java-version: 11
- name: Setup JDK 21
if: contains('main 3.6.x', github.base_ref)
uses: actions/setup-java@8df1039502a15bceb9433410b1a100fbe190c53b # tag=v3
with:
distribution: 'temurin'
java-version: 21
- name: Setup JDK 8
uses: actions/setup-java@8df1039502a15bceb9433410b1a100fbe190c53b # tag=v3
with:
distribution: 'temurin'
java-version: 8
- name: Download antora docs/build
uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e # v4
with:
name: ${{ env.DOCS_ZIP }}
path: ${{ env.DOCS_ZIP_PATH }}
- name: deploy
env:
ORG_GRADLE_PROJECT_artifactory_publish_username: ${{secrets.ARTIFACTORY_USERNAME}}
ORG_GRADLE_PROJECT_artifactory_publish_password: ${{secrets.ARTIFACTORY_PASSWORD}}
ORG_GRADLE_PROJECT_signingKey: ${{secrets.SIGNING_KEY}}
ORG_GRADLE_PROJECT_signingPassword: ${{secrets.SIGNING_PASSPHRASE}}
ORG_GRADLE_PROJECT_sonatypeUsername: ${{secrets.SONATYPE_USERNAME}}
ORG_GRADLE_PROJECT_sonatypePassword: ${{secrets.SONATYPE_PASSWORD}}
run: |
./gradlew -Dorg.gradle.parallel=false assemble sign artifactoryPublish -Partifactory_publish_contextUrl=https://repo.spring.io -Partifactory_publish_repoKey=libs-release-local publishMavenJavaPublicationToSonatypeRepository
tagMilestone:
name: Tag milestone
needs: [ prepare, deployMilestone ]
runs-on: ubuntu-20.04
permissions:
contents: write
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # tag=v4
- name: tag
run: |
git config --local user.name 'reactorbot'
git config --local user.email '[email protected]'
git tag -m "Release milestone ${{ needs.prepare.outputs.fullVersion }}" v${{ needs.prepare.outputs.fullVersion }} ${{ github.sha }}
git push --tags
tagRelease:
name: Tag release
needs: [ prepare, deployRelease ]
runs-on: ubuntu-20.04
permissions:
contents: write
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # tag=v4
- name: tag
run: |
git config --local user.name 'reactorbot'
git config --local user.email '[email protected]'
git tag -m "Release version ${{ needs.prepare.outputs.fullVersion }}" v${{ needs.prepare.outputs.fullVersion }} ${{ github.sha }}
git push --tags
cleanup:
name: Cleanup docs-zip artifact
needs: [ deploySnapshot, tagRelease, tagMilestone ]
if: always() && (needs.deploySnapshot.result == 'success' || needs.tagRelease.result == 'success' || needs.tagMilestone.result == 'success')
runs-on: ubuntu-20.04
permissions:
actions: write
steps:
- name: delete antora docs-zip artifact
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |-
ARTIFACTS_URL="/repos/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID}/artifacts"
ARTIFACT_ID=$(gh api -H 'Accept: application/vnd.github+json' -H 'X-GitHub-Api-Version: 2022-11-28' $ARTIFACTS_URL | jq -r '.artifacts[] | select(.name == "'$DOCS_ZIP'") | .id // ""')
if [ -n "$ARTIFACT_ID" ]; then
gh api --method DELETE -H 'Accept: application/vnd.github+json' -H 'X-GitHub-Api-Version: 2022-11-28' /repos/${{github.repository}}/actions/artifacts/$ARTIFACT_ID}
fi
# For Gradle configuration of signing, see https://docs.gradle.org/current/userguide/signing_plugin.html#sec:in-memory-keys
# publishMavenJavaPublicationToSonatypeRepository only sends to a staging repository