Spring Security Release Plugin is a Gradle plugin that provides common tasks for automating releases.
To use the plugin, apply the plugin in your project’s root build.gradle:
plugins {
id "io.spring.security.release" version "1.0.4"
}Finally, define your project’s configuration via the springRelease DSL.
Here is an example configuration that releases on Thursdays following the 2nd Monday of the month (i.e. Spring Framework’s release day):
springRelease {
repositoryOwner = "spring-projects"
repositoryName = "spring-framework"
weekOfMonth = 2
dayOfWeek = 4
referenceDocUrl = "https://docs.spring.io/spring-framework/reference/{version}/index.html"
apiDocUrl = "https://docs.spring.io/spring-framework/docs/{version}/api/"
replaceVersionInReferenceDocUrl = true
releaseVersionPrefix = "v"
}-
repositoryOwner: GitHub user or organization name (optional, defaults tospring-projects) -
repositoryName: GitHub repository name (optional, defaults toproject.name) -
weekOfMonth: The week of the month when releases for this project are scheduled; valid values are 1 - 3 where 1 is the first week with a Monday (required) -
dayOfWeek: The day of the week when releases for this project are scheduled; valid values are 1 - 5 where 1 is Monday and 5 is Friday (required) -
referenceDocUrl: The template URL for a version of the reference documentation; can contain the variable{version}which is automatically substituted based on the current version (required) -
apiDocUrl: The template URL for a version of the API documentation; can contain the variable{version}which is automatically substituted based on the current version (required) -
replaceVersionInReferenceDocUrl: Flag controlling whether{version}should be replaced (true) or left as-is (false) in thereferenceDocUrl; Useful for working with Antora (optional, defaults tofalse) -
releaseVersionPrefix: The prefix used to tag the release version; typically used to prefix withv, e.g.v1.0.1(optional, defaults to an empty string)
There are two types of tasks provided by this plugin:
-
Top-level tasks which you would normally run during CI as part of an automated release
-
Internal tasks which are used by other tasks
|
Note
|
Some top-level tasks are also used by other tasks. |
Top-level tasks:
Internal tasks (only used by other tasks):
|
Tip
|
By adding gitHubAccessToken=… to ~/.gradle/gradle.properties, many of these tasks can be performed with no additional inputs and therefore can be run directly from your IDE while avoiding GitHub rate limits.
|
Checks if the given branch has commercial support and outputs true or false.
The following command will determine if the given branch has commercial support:
./gradlew checkBranchHasCommercialSupport -Pbranch=1.0.xTask properties:
-
branch: Specify the branch used check support (required) -
gitHubAccessToken: A personal access token used to avoid hitting rate limits on the GitHub API (optional)
Full example:
./gradlew checkBranchHasCommercialSupport -Pbranch=1.0.x -PgitHubAccessToken=$GITHUB_ACCESS_TOKENChecks if the given branch has OSS support and outputs true or false.
The following command will determine if the given branch has OSS support:
./gradlew checkBranchHasOssSupport -Pbranch=1.0.xTask properties:
-
branch: Specify the branch used to check support (required) -
gitHubAccessToken: A personal access token used to avoid hitting rate limits on the GitHub API (optional)
Full example:
./gradlew checkBranchHasOssSupport -Pbranch=1.0.x -PgitHubAccessToken=$GITHUB_ACCESS_TOKENChecks if the given version is due today or past due and outputs true or false.
The following command will determine if there are no open issues (based on the current version):
./gradlew checkMilestoneIsDueTodayTask properties:
-
nextVersion: Specify the version used to check the due date (optional, usesgetNextReleaseMilestoneif not specified) -
gitHubAccessToken: A personal access token used to avoid hitting rate limits on the GitHub API (optional)
Full example:
./gradlew checkMilestoneIsDueToday -PnextVersion=1.0.0 -PgitHubAccessToken=$GITHUB_ACCESS_TOKENChecks if there are open issues for the next release milestone and outputs true or false.
The following command will determine if there are open issues (based on the current version):
./gradlew checkMilestoneHasOpenIssuesTask properties:
-
nextVersion: Specify the version used to check for open issues (optional, usesgetNextReleaseMilestoneif not specified) -
gitHubAccessToken: A personal access token used to avoid hitting rate limits on the GitHub API (optional)
Full example:
./gradlew checkMilestoneHasOpenIssues -PnextVersion=1.0.0 -PgitHubAccessToken=$GITHUB_ACCESS_TOKENCloses a release milestone for the specified version.
The following command will close a release milestone (based on the current version):
./gradlew closeMilestoneTask properties:
-
nextVersion: Specify the version of the release milestone to close (optional, usesgetNextReleaseMilestoneif not specified) -
gitHubAccessToken: A personal access token used access the GitHub API (required)
Full example:
./gradlew closeMilestone -PnextVersion=1.0.0 -PgitHubAccessToken=$GITHUB_ACCESS_TOKENCreate a GitHub release with release notes using the GitHub API and a new release version for the current project on spring.io using the Sagan API.
This task uses generateChangelog to generate the release notes and the configured referenceDocUrl, apiDocUrl and replaceVersionInReferenceDocUrl values from the DSL.
|
Note
|
This task is a combination of createGitHubRelease and createSaganRelease, with the added benefit that the createRelease parameter (see Task properties below) determines whether both APIs are actually called.
|
The following command will perform a dry-run and provide output of what creating the next release would look like:
./gradlew createReleaseTask properties:
-
nextVersion: Specify the version used to create the release (optional, usesgetNextReleaseMilestoneif not specified) -
branch: Specify the branch used to tag the release (optional, defaults tomain) -
createRelease: Flag controlling whether the release is created (true) or a dry-run is performed (false) (optional, defaults tofalse) -
gitHubAccessToken: A personal access token used to avoid hitting rate limits on the GitHub API and/or create the release (optional, required ifcreateReleaseistrue)
Full example:
./gradlew createRelease -PnextVersion=1.0.0 -Pbranch=1.0.x -PcreateRelease=true -PgitHubAccessToken=$GITHUB_ACCESS_TOKENCreate a GitHub release with release notes using the GitHub API.
This task uses generateChangelog to generate the release notes.
The following command will perform a dry-run and provide output of what creating the next release would look like:
./gradlew createGitHubReleaseTask properties:
-
nextVersion: Specify the version used to create the release (optional, usesgetNextReleaseMilestoneif not specified) -
branch: Specify the branch used to tag the release (optional, defaults tomain) -
createRelease: Flag controlling whether the release is created (true) or a dry-run is performed (false) (optional, defaults tofalse) -
gitHubAccessToken: A personal access token used to avoid hitting rate limits on the GitHub API and/or create the release (optional, required ifcreateReleaseistrue)
Full example:
./gradlew createGitHubRelease -PnextVersion=1.0.0 -Pbranch=1.0.x -PcreateRelease=true -PgitHubAccessToken=$GITHUB_ACCESS_TOKENCreate a new release version for the current project on spring.io using the Sagan API.
This task uses the configured referenceDocUrl, apiDocUrl and replaceVersionInReferenceDocUrl values from the DSL.
The following command will create a new release version:
./gradlew createSaganRelease -PgitHubAccessToken=$GITHUB_ACCESS_TOKENTask properties:
-
nextVersion: Specify the version used to create the release (optional, usesproject.versionif not specified) -
gitHubAccessToken: A personal access token used to access the Sagan API (required)
Full example:
./gradlew createSaganRelease -PnextVersion=1.0.0 -PgitHubAccessToken=$GITHUB_ACCESS_TOKENDelete a release version for the current project on spring.io using the Sagan API.
The following command will delete the previous release version:
./gradlew deleteSaganRelease -PgitHubAccessToken=$GITHUB_ACCESS_TOKENTask properties:
-
previousVersion: Specify the version used to delete the release (optional, usesgetPreviousReleaseMilestoneif not specified) -
gitHubAccessToken: A personal access token used to access the Sagan API (required)
Full example:
./gradlew deleteSaganRelease -PpreviousVersion=1.0.0 -PgitHubAccessToken=$GITHUB_ACCESS_TOKENGenerate the release notes (changelog) for a milestone using github-changelog-generator.
The following command will determine the next available GitHub release milestone (based on the current version), and generate a changelog which is written to build/changelog/release-notes.md:
./gradlew generateChangelogTask properties:
-
nextVersion: Specify the version used to generate the changelog (optional, usesgetNextReleaseMilestoneif not specified) -
gitHubAccessToken: A personal access token used to avoid hitting rate limits on the GitHub API (optional) -
gitHubUserName: The username that owns thegitHubAccessToken(optional, usesgetGitHubUserNameto look up the username if not specified)
Full example:
./gradlew generateChangelog -PnextVersion=1.0.0 -PgitHubAccessToken=$GITHUB_ACCESS_TOKEN -PgitHubUserName=spring-userUse the gitHubAccessToken to look up the user using the GitHub API and output the username.
The following command will look up the GitHub username:
./gradlew getGitHubUserName -PgitHubAccessToken=$GITHUB_ACCESS_TOKENTask properties:
-
gitHubAccessToken: A personal access token used to look up the user using the GitHub API (required)
Finds or calculates the next release version based on the current version and outputs the version number.
If the current version is a SNAPSHOT with a patch version of 0, the GitHub API is used to find the next milestone (sorted by due date) that matches the base version number.
If no milestone exists, the base version is used instead.
In all other cases, the base version is chosen automatically.
For example, if the current version is 1.0.0-SNAPSHOT and milestones 1.0.0-M2, 1.0.0-RC1 and 1.0.0 are available, then 1.0.0-M2 will be chosen based on due date.
If the current version is 1.0.1-SNAPSHOT, then 1.0.1 (the base version) is chosen automatically without consulting the GitHub API.
|
Note
|
This task is used internally by several other tasks to automatically determine the next release milestone when the nextVersion property is not specified.
|
The following command determines the next available GitHub release milestone (based on the current version):
./gradlew getNextReleaseMilestoneTask properties:
-
currentVersion: Specify the version used to calculate the next release milestone (optional, usesproject.versionif not specified) -
gitHubAccessToken: A personal access token used to avoid hitting rate limits on the GitHub API (optional)
Full example:
./gradlew getNextReleaseMilestone -PcurrentVersion=1.0.0 -PgitHubAccessToken=$GITHUB_ACCESS_TOKENCalculates the next snapshot version based on the current version and outputs the version number.
For example, if the current version is a milestone such as 1.0.0-M2, then this task outputs 1.0.0-SNAPSHOT.
If the current version is a GA version such as 1.0.0, then this task increments the patch version and outputs 1.0.1-SNAPSHOT.
The following command determines the next snapshot version (based on the current release version):
./gradlew getNextSnapshotVersionTask properties:
-
currentVersion: Specify the version used to calculate the next snapshot version (optional, usesproject.versionif not specified)
Full example:
./gradlew getNextSnapshotVersion -PcurrentVersion=1.0.0Finds the previous release version based on the current version using the Sagan API (now backed by Contentful) and outputs the version number.
If the current version is a SNAPSHOT, this task finds an existing SNAPSHOT version with the same major/minor version.
If the current version is a GA version, this task finds an existing GA version with the same major/minor version.
If multiple (ambiguous) options or no options exist (not found), this task outputs a message indicating the problem but does not fail.
The following command will determine the previous release milestone (based on the current version):
./gradlew getPreviousReleaseMilestone -PgitHubAccessToken=$GITHUB_ACCESS_TOKENTask properties:
-
currentVersion: Specify the version used to calculate the previous release milestone (optional, usesproject.versionif not specified) -
gitHubAccessToken: A personal access token used to access the GitHub and Sagan APIs (required)
Full example:
./gradlew getPreviousReleaseMilestone -PcurrentVersion=1.0.0 -PgitHubAccessToken=$GITHUB_ACCESS_TOKENSchedule the next release (even months only) or release train (series of milestones starting in January or July) based on the current version.
This task works with the concept of a Spring release train to automate scheduling one or more milestones using the configured weekOfMonth and dayOfWeek values from the DSL.
All dates are calculated based on the first Monday of the month.
For example, if the current date is June 1, 2023, the current version is 1.0.0-SNAPSHOT, weekOfMonth is 2 and dayOfWeek is 4 (i.e. Spring Framework’s release day), then this task can schedule a release train for July 13, 2023 (1.0.0-M1), August 17, 2023 (1.0.0-M2), September 14, 2023 (1.0.0-M3), October 12, 2023 (1.0.0-RC1) and November 16, 2023 (1.0.0).
However with all other values being the same, if the current version is 1.0.1-SNAPSHOT, this task will simply schedule a patch release on the next even month (which is the current month in this example) of June 15, 2023 (1.0.1).
The logic to determine whether to schedule a release train or a single patch release is based on the value of the patch version, where x.x.0 attempts to schedule a release train, and x.x.1 or higher schedules a patch release.
This task does nothing if the next release milestone already exists.
The following command schedules the next release milestone (or release train):
./gradlew scheduleNextRelease -PgitHubAccessToken=$GITHUB_ACCESS_TOKENTask properties:
-
nextVersion: Specify the version used to schedule the next release milestone (optional, usesgetNextReleaseMilestoneif not specified) -
gitHubAccessToken: A personal access token used to access the GitHub API (required)
Full example:
./gradlew scheduleNextRelease -PnextVersion=1.0.0 -PgitHubAccessToken=$GITHUB_ACCESS_TOKEN