Skip to content

Commit c8e9ad6

Browse files
committed
Backport improvements to CI setup
This includes the ability to release from GitHub Actions. Closes gh-33202
1 parent 562351f commit c8e9ad6

File tree

12 files changed

+429
-73
lines changed

12 files changed

+429
-73
lines changed

.github/actions/build/action.yml

+56
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
name: 'Build'
2+
description: 'Builds the project, optionally publishing it to a local deployment repository'
3+
inputs:
4+
java-version:
5+
required: false
6+
default: '8'
7+
description: 'The Java version to compile and test with'
8+
java-distribution:
9+
required: false
10+
default: 'liberica'
11+
description: 'The Java distribution to use for the build'
12+
java-toolchain:
13+
required: false
14+
default: 'false'
15+
description: 'Whether a Java toolchain should be used'
16+
publish:
17+
required: false
18+
default: 'false'
19+
description: 'Whether to publish artifacts ready for deployment to Artifactory'
20+
develocity-access-key:
21+
required: false
22+
description: 'The access key for authentication with ge.spring.io'
23+
outputs:
24+
build-scan-url:
25+
description: 'The URL, if any, of the build scan produced by the build'
26+
value: ${{ (inputs.publish == 'true' && steps.publish.outputs.build-scan-url) || steps.build.outputs.build-scan-url }}
27+
version:
28+
description: 'The version that was built'
29+
value: ${{ steps.read-version.outputs.version }}
30+
runs:
31+
using: composite
32+
steps:
33+
- name: Prepare Gradle Build
34+
uses: ./.github/actions/prepare-gradle-build
35+
with:
36+
develocity-access-key: ${{ inputs.develocity-access-key }}
37+
java-version: ${{ inputs.java-version }}
38+
java-distribution: ${{ inputs.java-distribution }}
39+
java-toolchain: ${{ inputs.java-toolchain }}
40+
- name: Build
41+
id: build
42+
if: ${{ inputs.publish == 'false' }}
43+
shell: bash
44+
run: ./gradlew check
45+
- name: Publish
46+
id: publish
47+
if: ${{ inputs.publish == 'true' }}
48+
shell: bash
49+
run: ./gradlew -PdeploymentRepository=$(pwd)/deployment-repository build publishAllPublicationsToDeploymentRepository
50+
- name: Read Version From gradle.properties
51+
id: read-version
52+
shell: bash
53+
run: |
54+
version=$(sed -n 's/version=\(.*\)/\1/p' gradle.properties)
55+
echo "Version is $version"
56+
echo "version=$version" >> $GITHUB_OUTPUT
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
name: Create GitHub Release
2+
description: Create the release on GitHub with a changelog
3+
inputs:
4+
milestone:
5+
description: 'Name of the GitHub milestone for which a release will be created'
6+
required: true
7+
token:
8+
description: 'Token to use for authentication with GitHub'
9+
required: true
10+
runs:
11+
using: composite
12+
steps:
13+
- name: Generate Changelog
14+
uses: spring-io/github-changelog-generator@185319ad7eaa75b0e8e72e4b6db19c8b2cb8c4c1 #v0.0.11
15+
with:
16+
milestone: ${{ inputs.milestone }}
17+
token: ${{ inputs.token }}
18+
config-file: .github/actions/create-github-release/changelog-generator.yml
19+
- name: Create GitHub Release
20+
env:
21+
GITHUB_TOKEN: ${{ inputs.token }}
22+
shell: bash
23+
run: gh release create ${{ format('v{0}', inputs.milestone) }} --notes-file changelog.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
changelog:
2+
repository: spring-projects/spring-framework
3+
sections:
4+
- title: ":star: New Features"
5+
labels:
6+
- "type: enhancement"
7+
- title: ":lady_beetle: Bug Fixes"
8+
labels:
9+
- "type: bug"
10+
- "type: regression"
11+
- title: ":notebook_with_decorative_cover: Documentation"
12+
labels:
13+
- "type: documentation"
14+
- title: ":hammer: Dependency Upgrades"
15+
sort: "title"
16+
labels:
17+
- "type: dependency-upgrade"
18+
contributors:
19+
exclude:
20+
names:
21+
- "bclozel"
22+
- "jhoeller"
23+
- "poutsma"
24+
- "rstoyanchev"
25+
- "sbrannen"
26+
- "sdeleuze"
27+
- "simonbasle"
28+
- "snicoll"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
name: 'Prepare Gradle Build'
2+
description: 'Prepares a Gradle build. Sets up Java and Gradle and configures Gradle properties'
3+
inputs:
4+
java-version:
5+
required: false
6+
default: '8'
7+
description: 'The Java version to use for the build'
8+
java-distribution:
9+
required: false
10+
default: 'liberica'
11+
description: 'The Java distribution to use for the build'
12+
java-toolchain:
13+
required: false
14+
default: 'false'
15+
description: 'Whether a Java toolchain should be used'
16+
develocity-access-key:
17+
required: false
18+
description: 'The access key for authentication with ge.spring.io'
19+
runs:
20+
using: composite
21+
steps:
22+
- name: Set Up Java
23+
uses: actions/setup-java@v4
24+
with:
25+
distribution: ${{ inputs.java-distribution }}
26+
java-version: |
27+
${{ inputs.java-version }}
28+
${{ inputs.java-toolchain == 'true' && '8' || '' }}
29+
- name: Set Up Gradle
30+
uses: gradle/actions/setup-gradle@dbbdc275be76ac10734476cc723d82dfe7ec6eda # v3.4.2
31+
with:
32+
cache-read-only: false
33+
develocity-access-key: ${{ inputs.develocity-access-key }}
34+
- name: Configure Gradle Properties
35+
shell: bash
36+
run: |
37+
mkdir -p $HOME/.gradle
38+
echo 'systemProp.user.name=spring-builds+github' >> $HOME/.gradle/gradle.properties
39+
echo 'systemProp.org.gradle.internal.launcher.welcomeMessageEnabled=false' >> $HOME/.gradle/gradle.properties
40+
echo 'org.gradle.daemon=false' >> $HOME/.gradle/gradle.properties
41+
echo 'org.gradle.daemon=4' >> $HOME/.gradle/gradle.properties
42+
- name: Configure Toolchain Properties
43+
if: ${{ inputs.java-toolchain == 'true' }}
44+
shell: bash
45+
run: |
46+
echo toolchainVersion=${{ inputs.java-version }} >> $HOME/.gradle/gradle.properties
47+
echo systemProp.org.gradle.java.installations.auto-detect=false >> $HOME/.gradle/gradle.properties
48+
echo systemProp.org.gradle.java.installations.auto-download=false >> $HOME/.gradle/gradle.properties
49+
echo systemProp.org.gradle.java.installations.paths=${{ format('$JAVA_HOME_{0}_X64', inputs.java-version) }} >> $HOME/.gradle/gradle.properties

.github/actions/send-notification/action.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
name: Send notification
1+
name: Send Notification
22
description: Sends a Google Chat message as a notification of the job's outcome
33
inputs:
44
webhook-url:
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
name: Sync to Maven Central
2+
description: Syncs a release to Maven Central and waits for it to be available for use
3+
inputs:
4+
jfrog-cli-config-token:
5+
description: 'Config token for the JFrog CLI'
6+
required: true
7+
spring-framework-version:
8+
description: 'The version of Spring Framework that is being synced to Central'
9+
required: true
10+
ossrh-s01-token-username:
11+
description: 'Username for authentication with s01.oss.sonatype.org'
12+
required: true
13+
ossrh-s01-token-password:
14+
description: 'Password for authentication with s01.oss.sonatype.org'
15+
required: true
16+
ossrh-s01-staging-profile:
17+
description: 'Staging profile to use when syncing to Central'
18+
required: true
19+
runs:
20+
using: composite
21+
steps:
22+
- name: Set Up JFrog CLI
23+
uses: jfrog/setup-jfrog-cli@7c95feb32008765e1b4e626b078dfd897c4340ad # v4.1.2
24+
env:
25+
JF_ENV_SPRING: ${{ inputs.jfrog-cli-config-token }}
26+
- name: Download Release Artifacts
27+
shell: bash
28+
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 }}'
29+
- name: Sync
30+
uses: spring-io/nexus-sync-action@42477a2230a2f694f9eaa4643fa9e76b99b7ab84 # v0.0.1
31+
with:
32+
username: ${{ inputs.ossrh-s01-token-username }}
33+
password: ${{ inputs.ossrh-s01-token-password }}
34+
staging-profile-name: ${{ inputs.ossrh-s01-staging-profile }}
35+
create: true
36+
upload: true
37+
close: true
38+
release: true
39+
generate-checksums: true
40+
- name: Await
41+
shell: bash
42+
run: |
43+
url=${{ format('https://repo.maven.apache.org/maven2/org/springframework/spring-context/{0}/spring-context-{0}.jar', inputs.spring-framework-version) }}
44+
echo "Waiting for $url"
45+
until curl --fail --head --silent $url > /dev/null
46+
do
47+
echo "."
48+
sleep 60
49+
done
50+
echo "$url is available"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
{
2+
"files": [
3+
{
4+
"aql": {
5+
"items.find": {
6+
"$and": [
7+
{
8+
"@build.name": "${buildName}",
9+
"@build.number": "${buildNumber}",
10+
"path": {
11+
"$nmatch": "org/springframework/spring-*.zip"
12+
}
13+
}
14+
]
15+
}
16+
},
17+
"target": "nexus/"
18+
}
19+
]
20+
}
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,33 @@
1-
name: Build and deploy snapshot
1+
name: Build and Deploy Snapshot
22
on:
33
push:
44
branches:
55
- 5.3.x
6+
permissions:
7+
actions: write
68
concurrency:
79
group: ${{ github.workflow }}-${{ github.ref }}
810
jobs:
911
build-and-deploy-snapshot:
10-
if: ${{ github.repository == 'spring-projects/spring-framework' }}
11-
name: Build and deploy snapshot
12+
name: Build and Deploy Snapshot
1213
runs-on: ubuntu-latest
14+
if: ${{ github.repository == 'spring-projects/spring-framework' }}
1315
steps:
14-
- name: Set up Java
15-
uses: actions/setup-java@v4
16-
with:
17-
distribution: 'liberica'
18-
java-version: 8
19-
- name: Check out code
16+
- name: Check Out Code
2017
uses: actions/checkout@v4
21-
- name: Set up Gradle
22-
uses: gradle/actions/setup-gradle@417ae3ccd767c252f5661f1ace9f835f9654f2b5
18+
- name: Build and Publish
19+
id: build-and-publish
20+
uses: ./.github/actions/build
2321
with:
24-
cache-read-only: false
25-
- name: Configure Gradle properties
26-
shell: bash
27-
run: |
28-
mkdir -p $HOME/.gradle
29-
echo 'systemProp.user.name=spring-builds+github' >> $HOME/.gradle/gradle.properties
30-
echo 'systemProp.org.gradle.internal.launcher.welcomeMessageEnabled=false' >> $HOME/.gradle/gradle.properties
31-
echo 'org.gradle.daemon=false' >> $HOME/.gradle/gradle.properties
32-
echo 'org.gradle.daemon=4' >> $HOME/.gradle/gradle.properties
33-
- name: Build and publish
34-
id: build
35-
env:
36-
CI: 'true'
37-
GRADLE_ENTERPRISE_URL: 'https://ge.spring.io'
38-
DEVELOCITY_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_SECRET_ACCESS_KEY }}
39-
run: ./gradlew -PdeploymentRepository=$(pwd)/deployment-repository build publishAllPublicationsToDeploymentRepository
22+
develocity-access-key: ${{ secrets.GRADLE_ENTERPRISE_SECRET_ACCESS_KEY }}
23+
publish: true
4024
- name: Deploy
41-
uses: spring-io/[email protected]
25+
uses: spring-io/artifactory-deploy-action@26bbe925a75f4f863e1e529e85be2d0093cac116 # v0.0.1
4226
with:
4327
uri: 'https://repo.spring.io'
4428
username: ${{ secrets.ARTIFACTORY_USERNAME }}
4529
password: ${{ secrets.ARTIFACTORY_PASSWORD }}
46-
build-name: ${{ format('spring-framework-{0}', github.ref_name)}}
30+
build-name: 'spring-framework-5.3.x'
4731
repository: 'libs-snapshot-local'
4832
folder: 'deployment-repository'
4933
signing-key: ${{ secrets.GPG_PRIVATE_KEY }}
@@ -53,11 +37,24 @@ jobs:
5337
/**/spring-*-docs.zip::zip.type=docs
5438
/**/spring-*-dist.zip::zip.type=dist
5539
/**/spring-*-schema.zip::zip.type=schema
56-
- name: Send notification
40+
- name: Send Notification
5741
uses: ./.github/actions/send-notification
5842
if: always()
5943
with:
6044
webhook-url: ${{ secrets.GOOGLE_CHAT_WEBHOOK_URL }}
6145
status: ${{ job.status }}
62-
build-scan-url: ${{ steps.build.outputs.build-scan-url }}
63-
run-name: ${{ format('{0} | Linux | Java 8', github.ref_name) }}
46+
build-scan-url: ${{ steps.build-and-publish.outputs.build-scan-url }}
47+
run-name: ${{ format('{0} | Linux | Java 8', github.ref_name) }}
48+
outputs:
49+
version: ${{ steps.build-and-publish.outputs.version }}
50+
verify:
51+
name: Verify
52+
needs: build-and-deploy-snapshot
53+
uses: ./.github/workflows/verify.yml
54+
secrets:
55+
google-chat-webhook-url: ${{ secrets.GOOGLE_CHAT_WEBHOOK_URL }}
56+
repository-password: ${{ secrets.ARTIFACTORY_PASSWORD }}
57+
repository-username: ${{ secrets.ARTIFACTORY_USERNAME }}
58+
token: ${{ secrets.GH_ACTIONS_REPO_TOKEN }}
59+
with:
60+
version: ${{ needs.build-and-deploy-snapshot.outputs.version }}

.github/workflows/ci.yml

+10-36
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ concurrency:
77
group: ${{ github.workflow }}-${{ github.ref }}
88
jobs:
99
ci:
10+
name: '${{ matrix.os.name}} | Java ${{ matrix.java.version}}'
11+
runs-on: ${{ matrix.os.id }}
1012
if: ${{ github.repository == 'spring-projects/spring-framework' }}
1113
strategy:
1214
matrix:
@@ -25,52 +27,24 @@ jobs:
2527
name: Linux
2628
java:
2729
version: 8
28-
name: '${{ matrix.os.name}} | Java ${{ matrix.java.version}}'
29-
runs-on: ${{ matrix.os.id }}
3030
steps:
31-
- name: Set up Java
32-
uses: actions/setup-java@v4
33-
with:
34-
distribution: 'liberica'
35-
java-version: |
36-
${{ matrix.java.version }}
37-
${{ matrix.java.toolchain && '8' || '' }}
3831
- name: Prepare Windows runner
3932
if: ${{ runner.os == 'Windows' }}
4033
run: |
4134
git config --global core.autocrlf true
4235
git config --global core.longPaths true
4336
Stop-Service -name Docker
44-
- name: Check out code
37+
- name: Check Out Code
4538
uses: actions/checkout@v4
46-
- name: Set up Gradle
47-
uses: gradle/actions/setup-gradle@417ae3ccd767c252f5661f1ace9f835f9654f2b5
48-
with:
49-
cache-read-only: false
50-
- name: Configure Gradle properties
51-
shell: bash
52-
run: |
53-
mkdir -p $HOME/.gradle
54-
echo 'systemProp.user.name=spring-builds+github' >> $HOME/.gradle/gradle.properties
55-
echo 'systemProp.org.gradle.internal.launcher.welcomeMessageEnabled=false' >> $HOME/.gradle/gradle.properties
56-
echo 'org.gradle.daemon=false' >> $HOME/.gradle/gradle.properties
57-
echo 'org.gradle.daemon=4' >> $HOME/.gradle/gradle.properties
58-
- name: Configure toolchain properties
59-
if: ${{ matrix.java.toolchain }}
60-
shell: bash
61-
run: |
62-
echo toolchainVersion=${{ matrix.java.version }} >> $HOME/.gradle/gradle.properties
63-
echo systemProp.org.gradle.java.installations.auto-detect=false >> $HOME/.gradle/gradle.properties
64-
echo systemProp.org.gradle.java.installations.auto-download=false >> $HOME/.gradle/gradle.properties
65-
echo systemProp.org.gradle.java.installations.paths=${{ format('$JAVA_HOME_{0}_X64', matrix.java.version) }} >> $HOME/.gradle/gradle.properties
6639
- name: Build
6740
id: build
68-
env:
69-
CI: 'true'
70-
GRADLE_ENTERPRISE_URL: 'https://ge.spring.io'
71-
DEVELOCITY_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_SECRET_ACCESS_KEY }}
72-
run: ./gradlew check
73-
- name: Send notification
41+
uses: ./.github/actions/build
42+
with:
43+
java-version: ${{ matrix.java.version }}
44+
java-distribution: ${{ matrix.java.distribution || 'liberica' }}
45+
java-toolchain: ${{ matrix.java.toolchain }}
46+
develocity-access-key: ${{ secrets.GRADLE_ENTERPRISE_SECRET_ACCESS_KEY }}
47+
- name: Send Notification
7448
uses: ./.github/actions/send-notification
7549
if: always()
7650
with:

0 commit comments

Comments
 (0)