Browse Source
This includes the ability to release from GitHub Actions. Closes gh-33202pull/33211/head
12 changed files with 429 additions and 73 deletions
@ -0,0 +1,56 @@
@@ -0,0 +1,56 @@
|
||||
name: 'Build' |
||||
description: 'Builds the project, optionally publishing it to a local deployment repository' |
||||
inputs: |
||||
java-version: |
||||
required: false |
||||
default: '8' |
||||
description: 'The Java version to compile and test with' |
||||
java-distribution: |
||||
required: false |
||||
default: 'liberica' |
||||
description: 'The Java distribution to use for the build' |
||||
java-toolchain: |
||||
required: false |
||||
default: 'false' |
||||
description: 'Whether a Java toolchain should be used' |
||||
publish: |
||||
required: false |
||||
default: 'false' |
||||
description: 'Whether to publish artifacts ready for deployment to Artifactory' |
||||
develocity-access-key: |
||||
required: false |
||||
description: 'The access key for authentication with ge.spring.io' |
||||
outputs: |
||||
build-scan-url: |
||||
description: 'The URL, if any, of the build scan produced by the build' |
||||
value: ${{ (inputs.publish == 'true' && steps.publish.outputs.build-scan-url) || steps.build.outputs.build-scan-url }} |
||||
version: |
||||
description: 'The version that was built' |
||||
value: ${{ steps.read-version.outputs.version }} |
||||
runs: |
||||
using: composite |
||||
steps: |
||||
- name: Prepare Gradle Build |
||||
uses: ./.github/actions/prepare-gradle-build |
||||
with: |
||||
develocity-access-key: ${{ inputs.develocity-access-key }} |
||||
java-version: ${{ inputs.java-version }} |
||||
java-distribution: ${{ inputs.java-distribution }} |
||||
java-toolchain: ${{ inputs.java-toolchain }} |
||||
- name: Build |
||||
id: build |
||||
if: ${{ inputs.publish == 'false' }} |
||||
shell: bash |
||||
run: ./gradlew check |
||||
- name: Publish |
||||
id: publish |
||||
if: ${{ inputs.publish == 'true' }} |
||||
shell: bash |
||||
run: ./gradlew -PdeploymentRepository=$(pwd)/deployment-repository build publishAllPublicationsToDeploymentRepository |
||||
- name: Read Version From gradle.properties |
||||
id: read-version |
||||
shell: bash |
||||
run: | |
||||
version=$(sed -n 's/version=\(.*\)/\1/p' gradle.properties) |
||||
echo "Version is $version" |
||||
echo "version=$version" >> $GITHUB_OUTPUT |
||||
@ -0,0 +1,23 @@
@@ -0,0 +1,23 @@
|
||||
name: Create GitHub Release |
||||
description: Create the release on GitHub with a changelog |
||||
inputs: |
||||
milestone: |
||||
description: 'Name of the GitHub milestone for which a release will be created' |
||||
required: true |
||||
token: |
||||
description: 'Token to use for authentication with GitHub' |
||||
required: true |
||||
runs: |
||||
using: composite |
||||
steps: |
||||
- name: Generate Changelog |
||||
uses: spring-io/github-changelog-generator@185319ad7eaa75b0e8e72e4b6db19c8b2cb8c4c1 #v0.0.11 |
||||
with: |
||||
milestone: ${{ inputs.milestone }} |
||||
token: ${{ inputs.token }} |
||||
config-file: .github/actions/create-github-release/changelog-generator.yml |
||||
- name: Create GitHub Release |
||||
env: |
||||
GITHUB_TOKEN: ${{ inputs.token }} |
||||
shell: bash |
||||
run: gh release create ${{ format('v{0}', inputs.milestone) }} --notes-file changelog.md |
||||
@ -0,0 +1,28 @@
@@ -0,0 +1,28 @@
|
||||
changelog: |
||||
repository: spring-projects/spring-framework |
||||
sections: |
||||
- title: ":star: New Features" |
||||
labels: |
||||
- "type: enhancement" |
||||
- title: ":lady_beetle: Bug Fixes" |
||||
labels: |
||||
- "type: bug" |
||||
- "type: regression" |
||||
- title: ":notebook_with_decorative_cover: Documentation" |
||||
labels: |
||||
- "type: documentation" |
||||
- title: ":hammer: Dependency Upgrades" |
||||
sort: "title" |
||||
labels: |
||||
- "type: dependency-upgrade" |
||||
contributors: |
||||
exclude: |
||||
names: |
||||
- "bclozel" |
||||
- "jhoeller" |
||||
- "poutsma" |
||||
- "rstoyanchev" |
||||
- "sbrannen" |
||||
- "sdeleuze" |
||||
- "simonbasle" |
||||
- "snicoll" |
||||
@ -0,0 +1,49 @@
@@ -0,0 +1,49 @@
|
||||
name: 'Prepare Gradle Build' |
||||
description: 'Prepares a Gradle build. Sets up Java and Gradle and configures Gradle properties' |
||||
inputs: |
||||
java-version: |
||||
required: false |
||||
default: '8' |
||||
description: 'The Java version to use for the build' |
||||
java-distribution: |
||||
required: false |
||||
default: 'liberica' |
||||
description: 'The Java distribution to use for the build' |
||||
java-toolchain: |
||||
required: false |
||||
default: 'false' |
||||
description: 'Whether a Java toolchain should be used' |
||||
develocity-access-key: |
||||
required: false |
||||
description: 'The access key for authentication with ge.spring.io' |
||||
runs: |
||||
using: composite |
||||
steps: |
||||
- name: Set Up Java |
||||
uses: actions/setup-java@v4 |
||||
with: |
||||
distribution: ${{ inputs.java-distribution }} |
||||
java-version: | |
||||
${{ inputs.java-version }} |
||||
${{ inputs.java-toolchain == 'true' && '8' || '' }} |
||||
- name: Set Up Gradle |
||||
uses: gradle/actions/setup-gradle@dbbdc275be76ac10734476cc723d82dfe7ec6eda # v3.4.2 |
||||
with: |
||||
cache-read-only: false |
||||
develocity-access-key: ${{ inputs.develocity-access-key }} |
||||
- name: Configure Gradle Properties |
||||
shell: bash |
||||
run: | |
||||
mkdir -p $HOME/.gradle |
||||
echo 'systemProp.user.name=spring-builds+github' >> $HOME/.gradle/gradle.properties |
||||
echo 'systemProp.org.gradle.internal.launcher.welcomeMessageEnabled=false' >> $HOME/.gradle/gradle.properties |
||||
echo 'org.gradle.daemon=false' >> $HOME/.gradle/gradle.properties |
||||
echo 'org.gradle.daemon=4' >> $HOME/.gradle/gradle.properties |
||||
- name: Configure Toolchain Properties |
||||
if: ${{ inputs.java-toolchain == 'true' }} |
||||
shell: bash |
||||
run: | |
||||
echo toolchainVersion=${{ inputs.java-version }} >> $HOME/.gradle/gradle.properties |
||||
echo systemProp.org.gradle.java.installations.auto-detect=false >> $HOME/.gradle/gradle.properties |
||||
echo systemProp.org.gradle.java.installations.auto-download=false >> $HOME/.gradle/gradle.properties |
||||
echo systemProp.org.gradle.java.installations.paths=${{ format('$JAVA_HOME_{0}_X64', inputs.java-version) }} >> $HOME/.gradle/gradle.properties |
||||
@ -0,0 +1,50 @@
@@ -0,0 +1,50 @@
|
||||
name: Sync to Maven Central |
||||
description: Syncs a release to Maven Central and waits for it to be available for use |
||||
inputs: |
||||
jfrog-cli-config-token: |
||||
description: 'Config token for the JFrog CLI' |
||||
required: true |
||||
spring-framework-version: |
||||
description: 'The version of Spring Framework that is being synced to Central' |
||||
required: true |
||||
ossrh-s01-token-username: |
||||
description: 'Username for authentication with s01.oss.sonatype.org' |
||||
required: true |
||||
ossrh-s01-token-password: |
||||
description: 'Password for authentication with s01.oss.sonatype.org' |
||||
required: true |
||||
ossrh-s01-staging-profile: |
||||
description: 'Staging profile to use when syncing to Central' |
||||
required: true |
||||
runs: |
||||
using: composite |
||||
steps: |
||||
- name: Set Up JFrog CLI |
||||
uses: jfrog/setup-jfrog-cli@7c95feb32008765e1b4e626b078dfd897c4340ad # v4.1.2 |
||||
env: |
||||
JF_ENV_SPRING: ${{ inputs.jfrog-cli-config-token }} |
||||
- name: Download Release Artifacts |
||||
shell: bash |
||||
run: jf rt download --spec ${{ format('{0}/artifacts.spec', github.action_path) }} --spec-vars 'buildName=${{ format('spring-framework-{0}', inputs.spring-framework-version) }};buildNumber=${{ github.run_number }}' |
||||
- name: Sync |
||||
uses: spring-io/nexus-sync-action@42477a2230a2f694f9eaa4643fa9e76b99b7ab84 # v0.0.1 |
||||
with: |
||||
username: ${{ inputs.ossrh-s01-token-username }} |
||||
password: ${{ inputs.ossrh-s01-token-password }} |
||||
staging-profile-name: ${{ inputs.ossrh-s01-staging-profile }} |
||||
create: true |
||||
upload: true |
||||
close: true |
||||
release: true |
||||
generate-checksums: true |
||||
- name: Await |
||||
shell: bash |
||||
run: | |
||||
url=${{ format('https://repo.maven.apache.org/maven2/org/springframework/spring-context/{0}/spring-context-{0}.jar', inputs.spring-framework-version) }} |
||||
echo "Waiting for $url" |
||||
until curl --fail --head --silent $url > /dev/null |
||||
do |
||||
echo "." |
||||
sleep 60 |
||||
done |
||||
echo "$url is available" |
||||
@ -0,0 +1,20 @@
@@ -0,0 +1,20 @@
|
||||
{ |
||||
"files": [ |
||||
{ |
||||
"aql": { |
||||
"items.find": { |
||||
"$and": [ |
||||
{ |
||||
"@build.name": "${buildName}", |
||||
"@build.number": "${buildNumber}", |
||||
"path": { |
||||
"$nmatch": "org/springframework/spring-*.zip" |
||||
} |
||||
} |
||||
] |
||||
} |
||||
}, |
||||
"target": "nexus/" |
||||
} |
||||
] |
||||
} |
||||
@ -0,0 +1,90 @@
@@ -0,0 +1,90 @@
|
||||
name: Release |
||||
on: |
||||
push: |
||||
tags: |
||||
- v5.3.[0-9]+ |
||||
concurrency: |
||||
group: ${{ github.workflow }}-${{ github.ref }} |
||||
jobs: |
||||
build-and-stage-release: |
||||
if: ${{ github.repository == 'spring-projects/spring-framework' }} |
||||
name: Build and Stage Release |
||||
runs-on: ubuntu-latest |
||||
steps: |
||||
- name: Check Out Code |
||||
uses: actions/checkout@v4 |
||||
- name: Build and Publish |
||||
id: build-and-publish |
||||
uses: ./.github/actions/build |
||||
with: |
||||
develocity-access-key: ${{ secrets.GRADLE_ENTERPRISE_SECRET_ACCESS_KEY }} |
||||
publish: true |
||||
- name: Stage Release |
||||
uses: spring-io/artifactory-deploy-action@26bbe925a75f4f863e1e529e85be2d0093cac116 # v0.0.1 |
||||
with: |
||||
build-name: ${{ format('spring-framework-{0}', steps.build-and-publish.outputs.version)}} |
||||
folder: 'deployment-repository' |
||||
password: ${{ secrets.ARTIFACTORY_PASSWORD }} |
||||
repository: 'libs-staging-local' |
||||
signing-key: ${{ secrets.GPG_PRIVATE_KEY }} |
||||
signing-passphrase: ${{ secrets.GPG_PASSPHRASE }} |
||||
uri: 'https://repo.spring.io' |
||||
username: ${{ secrets.ARTIFACTORY_USERNAME }} |
||||
outputs: |
||||
version: ${{ steps.build-and-publish.outputs.version }} |
||||
verify: |
||||
name: Verify |
||||
needs: build-and-stage-release |
||||
uses: ./.github/workflows/verify.yml |
||||
with: |
||||
staging: true |
||||
version: ${{ needs.build-and-stage-release.outputs.version }} |
||||
secrets: |
||||
google-chat-webhook-url: ${{ secrets.GOOGLE_CHAT_WEBHOOK_URL }} |
||||
repository-password: ${{ secrets.ARTIFACTORY_PASSWORD }} |
||||
repository-username: ${{ secrets.ARTIFACTORY_USERNAME }} |
||||
token: ${{ secrets.GH_ACTIONS_REPO_TOKEN }} |
||||
sync-to-maven-central: |
||||
name: Sync to Maven Central |
||||
needs: |
||||
- build-and-stage-release |
||||
- verify |
||||
runs-on: ubuntu-latest |
||||
steps: |
||||
- name: Check Out Code |
||||
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 |
||||
- name: Sync to Maven Central |
||||
uses: ./.github/actions/sync-to-maven-central |
||||
with: |
||||
jfrog-cli-config-token: ${{ secrets.JF_ARTIFACTORY_SPRING }} |
||||
ossrh-s01-staging-profile: ${{ secrets.OSSRH_S01_STAGING_PROFILE }} |
||||
ossrh-s01-token-password: ${{ secrets.OSSRH_S01_TOKEN_PASSWORD }} |
||||
ossrh-s01-token-username: ${{ secrets.OSSRH_S01_TOKEN_USERNAME }} |
||||
spring-framework-version: ${{ needs.build-and-stage-release.outputs.version }} |
||||
promote-release: |
||||
name: Promote Release |
||||
needs: |
||||
- build-and-stage-release |
||||
- sync-to-maven-central |
||||
runs-on: ubuntu-latest |
||||
steps: |
||||
- name: Set up JFrog CLI |
||||
uses: jfrog/setup-jfrog-cli@7c95feb32008765e1b4e626b078dfd897c4340ad # v4.1.2 |
||||
env: |
||||
JF_ENV_SPRING: ${{ secrets.JF_ARTIFACTORY_SPRING }} |
||||
- name: Promote build |
||||
run: jfrog rt build-promote ${{ format('spring-framework-{0}', needs.build-and-stage-release.outputs.version)}} ${{ github.run_number }} libs-release-local |
||||
create-github-release: |
||||
name: Create GitHub Release |
||||
needs: |
||||
- build-and-stage-release |
||||
- promote-release |
||||
runs-on: ubuntu-latest |
||||
steps: |
||||
- name: Check Out Code |
||||
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 |
||||
- name: Create GitHub Release |
||||
uses: ./.github/actions/create-github-release |
||||
with: |
||||
milestone: ${{ needs.build-and-stage-release.outputs.version }} |
||||
token: ${{ secrets.GH_ACTIONS_REPO_TOKEN }} |
||||
@ -1,13 +1,11 @@
@@ -1,13 +1,11 @@
|
||||
name: "Validate Gradle Wrapper" |
||||
on: [push, pull_request] |
||||
|
||||
permissions: |
||||
contents: read |
||||
|
||||
jobs: |
||||
validation: |
||||
name: "Validation" |
||||
name: "Validate Gradle Wrapper" |
||||
runs-on: ubuntu-latest |
||||
steps: |
||||
- uses: actions/checkout@v4 |
||||
- uses: gradle/wrapper-validation-action@v2 |
||||
- uses: gradle/actions/wrapper-validation@dbbdc275be76ac10734476cc723d82dfe7ec6eda # v3.4.2 |
||||
@ -0,0 +1,71 @@
@@ -0,0 +1,71 @@
|
||||
name: Verify |
||||
on: |
||||
workflow_call: |
||||
inputs: |
||||
version: |
||||
required: true |
||||
type: string |
||||
staging: |
||||
required: false |
||||
default: false |
||||
type: boolean |
||||
secrets: |
||||
repository-username: |
||||
required: false |
||||
repository-password: |
||||
required: false |
||||
google-chat-webhook-url: |
||||
required: true |
||||
token: |
||||
required: true |
||||
jobs: |
||||
verify: |
||||
name: Verify |
||||
runs-on: ubuntu-latest |
||||
steps: |
||||
- name: Check Out Release Verification Tests |
||||
uses: actions/checkout@v4 |
||||
with: |
||||
repository: spring-projects/spring-framework-release-verification |
||||
ref: 'v0.0.2' |
||||
token: ${{ secrets.token }} |
||||
- name: Check Out Send Notification Action |
||||
uses: actions/checkout@v4 |
||||
with: |
||||
path: spring-framework |
||||
sparse-checkout: .github/actions/send-notification |
||||
- name: Set Up Java |
||||
uses: actions/setup-java@v4 |
||||
with: |
||||
distribution: 'liberica' |
||||
java-version: 8 |
||||
- name: Set Up Gradle |
||||
uses: gradle/actions/setup-gradle@dbbdc275be76ac10734476cc723d82dfe7ec6eda # v3.4.2 |
||||
with: |
||||
cache-read-only: false |
||||
- name: Configure Gradle Properties |
||||
shell: bash |
||||
run: | |
||||
mkdir -p $HOME/.gradle |
||||
echo 'org.gradle.daemon=false' >> $HOME/.gradle/gradle.properties |
||||
- name: Run Release Verification Tests |
||||
env: |
||||
RVT_VERSION: ${{ inputs.version }} |
||||
RVT_RELEASE_TYPE: oss |
||||
RVT_STAGING: ${{ inputs.staging }} |
||||
RVT_OSS_REPOSITORY_USERNAME: ${{ secrets.repository-username }} |
||||
RVT_OSS_REPOSITORY_PASSWORD: ${{ secrets.repository-password }} |
||||
run: ./gradlew spring-framework-release-verification-tests:test |
||||
- name: Upload Build Reports on Failure |
||||
uses: actions/upload-artifact@v4 |
||||
if: failure() |
||||
with: |
||||
name: build-reports |
||||
path: '**/build/reports/' |
||||
- name: Send Notification |
||||
uses: ./spring-framework/.github/actions/send-notification |
||||
if: failure() |
||||
with: |
||||
webhook-url: ${{ secrets.google-chat-webhook-url }} |
||||
status: ${{ job.status }} |
||||
run-name: ${{ format('{0} | Verification | {1}', github.ref_name, inputs.version) }} |
||||
Loading…
Reference in new issue