This document describes the technical aspects of the Jenkins release process.
The intended audience is those who want to lead the release process and want more information than the release checklist offers.
This guide does not aim to be a technical paper, how the release process works in detail. Take a look at the README.adoc for that.
This document covers the whole release process for initial LTS releases. Point releases (.2, .3) do not require the full process and are indicated to be striked through on the checklist.
Bear in mind, as future release lead, you do not need to work through the release checklist all by yourself. Prior release leads and release team member are there to help you out, just ask for assistence in the #jenkins-release:matrix.org chat.
- Glossary
- Software Prerequisites
- Knowledge Prerequisites
- Access Prerequisites
- Preparation
- Release Candidate Creation
- LTS Release
This document uses the following generic terms, which may need a clarification:
- checklist: The release checklist
- 2.VVV: The version number of the weekly release the LTS release is based upon, e.g. 2.375.
2.VVV.x translates to 2.375.x in this example, .x is no placeholder. - RC: Release Candidate
⚠️ : Specific permission required. See Access Prerequisites.
- git 2.38.1 or newer
- bash 5.2 or newer
- groovy 2.x or newer available in your local packages
- xdg-utils in your local packages (to be removed in the future, not available on homebrew/macOS)
- maven 3.9.6 or newer
- openjdk 17 or 21
- Novice knowledge about GitHub, how to create branches, pull requests and releases.
- Novice knowlege how to use a terminal to run a script and specify an input.
- Competence knowledge how to cherry-pick commits and resolve merge conflicts with a situational merge strategy.
- Beginner knowledge about Jenkins, multibranch pipelines and folders.
The following is only available to release team members.
You can safely ignore it, these are not needed for the majority of steps. If they are needed, the steps below will tell you with a warning symbol (
It's recommended to ask someone from the release team to take care of these steps, if you are not a release team member yourself yet.
Access to the Jenkins release infrastructure
- An account on accounts.jenkins.io.
- The account is part of the
release-core
LDAP group.
- The account is part of the
- A VPN client to access the Jenkins VPN to access non-public resources.
- Access to release.ci.jenkins.io and trusted.ci.jenkins.io.
- Be part of the
release
team in the jenkinsci and jenkins-infra organization.
Timing for the preperation phase is usually 14 days before the RC release date or after the baseline selection an open call for the release lead takes place.
It's recommended to start the preperation phase as soon as the release lead is selected.
Long-Term-Support (LTS) releases are picked every 12 weeks from a weekly baseline. You can find more information about the LTS release line process LTS Release Line.
The release officer ends the selection and announces the weekly baseline with an open call for the release lead on the jenkins-dev mailing list.
To be the release lead, you need to respond to the call and declare your intest to lead the release.
To initiate a new LTS baseline, run the init-lts-line script in a local clone of the jenkins repository.
Note: If you do not have write access on the repository, ask a release team member to run the script for you.
To initiate a new LTS baseline, create a new branch based on the default branch, for example stable-2.VVV
.
You'll need to update several files, see to the LTS checklist.
Note: If you do not have write access on the repository, ask a release team member to create the branch for you.
Create a pull request updating the BOM to the weekly release, the LTS release is based upon. Refer to previous pull requests for additional changes that are required.
- Modify the newest
bom-2.VVV.x/pom.xml
to declare the LTS line you are initiating.
This is done by replacing<artifactId>bom-weekly</artifactId>
in the<dependencyManagement>
block to<artifactId>bom-2.VVV.x</artifactId>
. - Create a new file for the LTS release in
bom-2.VVV.x/pom.xml
. This file should contain the following content:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>io.jenkins.tools.bom</groupId>
<artifactId>parent</artifactId>
<version>${changelist}</version>
</parent>
<artifactId>bom-2.VVV.x</artifactId>
<packaging>pom</packaging>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>bom-weekly</artifactId>
<version>${project.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
Keep in mind to replace VVV with the LTS baseline again.
- Add the created file to the
pom.xml
in the root directory of the repository in the<modules>
block:
...
<module>bom-weekly</module>
<module>bom-2.VVV.x</module>
...
- Create a new profile in the sample plugin's pom
<profiles>
located atsample-plugin/pom.xml
:
<profiles>
<profile>
<id>2.VVV.x</id>
<properties>
<bom>2.VVV.x</bom>
<jenkins.version>2.VVV</jenkins.version>
</properties>
</profile>
</profiles>
Create a PR to update the JCasC integration tests to the weekly release, the LTS release is based upon.
This is done by replacing the jenkins.version
property in the <properties>
block to the version of the weekly release you are basing the LTS line on.
Make sure that all the Jira issues and GitHub PRs are in the correct state and that Jira issues are labeled with lts-candidate
. Visit the checklist for more information.
Send a backporting announcement email to the jenkinsci-dev mailing list, using the default template. Remember to exchange the LTS version, release date and Jira URLs.
Use the LTS candidates query to list issues eligible for a backport.
Add 2.VVV.p-fixed
and remove lts-candidate
or add 2.VVV.p-rejected
and retain the lts-candidate
label.
.p stands for patch release, like .1, .2, or .3.
Run the list-issue-commits script to locate commits via jira ID and backport them via cherry-pick -x $commit
into a separate branch based on stable-2.VVV
.
Incase there are conflicting commits, pick an appropriate merge strategy to address the conflicts without undoing the change or merging in newer content.
Open a PR against the stable-2.VVV
branch from your separate backporting branch from the prior step.
Use the list-issue-commits script to generate a list of issues to include in the PR description.
Visit the checklist for more information.
Additionally, take a look at the release and packaging repository, for additional LTS candidates.
The following tests need to be reviewed and confirmed to be passing:
- Acceptance tests: Open a pull request modifying the
jenkins.version
of thelts
profile in the acceptance test harness suite, to the incremental produced by the backporting pull request injenkinsci/jenkins
. - Plugin compatibility: Open a pull request modifying the
jenkins.version
in the newest bom profile, to the incremental produced by the backporting pull request injenkinsci/jenkins
.
Additionally, you need to add a dummy file, to run the full test suite, if you lack triage permissions on the repository to add the corresponding label. To do so, run the following command:
echo 'TODO delete me' > full-test
git add full-test
git commit -m 'Run full tests'
git push
Only if both pull requests are green, the backporting pull request can be merged.
Replace stable-2.xxx
with the new LTS stable branch version.
Take a look at the example PR how to do that.
Timing for the RC creation is usually the same day the RC is published.
Merge the backporting PR from the prior step into the stable-2.VVV
branch. Do not squash the commits, create a merge commit.
Note: If you do not have write access on the repository, ask a release team member to merge the PR for you.
If the build passes, obtain the "Incrementals" URL from the "Checks" tab of the stable branch:
Select Details
-> jenkins-war
and obtain the jenkins-war-2.VVV-rcXXXXX.CCCCCCCCCCCCC.war
URL. C
is the commit hash of the merge commit and acts as placeholder.
Create a pre-release on GitHub for the stable-2.VVV
branch based on this sample.
Note: If you do not have write access on the repository, ask a release team member to create the pre-release for you.
The jenkinsci-dev mailing list and the community forums have received an automatic announcement about the RC, once the pre-release has been created on GitHub.
Check with the security team, whether a security update is planned for this release, which impacts the LTS release and core itself. Security pre-announcements are sent to the jenkinsci-advisories mailing list.
Even if no security update is planned, it is a good idea to verify with the security team that no security update is is progress.
In case a security update impacting the LTS release is planned, the release process is paused and the security team takes over the release.
Timing for the LTS release is usually the same day the LTS release is published.
Take a look at the checklist, and make sure, that both channels are notified in advance.
Run the release job on release.ci.jenkins.io if no security release for Jenkins is planned.
Note: If you do not have access to the Jenkins VPN, ask a release team member to start the job for you.
Once the build is complete, publish the GitHub release for the stable-2.VVV
branch, selecting the jenkins-2.VVV.V
tag. Use this sample.
Note: If you do not have write access on the repository, ask a release team member to publish the release for you.
If the release build passes, confirm if all acceptance tests are green:
- Confirm Datadog checks.
- Confirm Debian installer acceptance tests are passing.
- Confirm Red Hat installer acceptance tests are passing.
For good measures, check the console log to confirm that the correct release package was used (e.g. search for 2.VVV
).
Adjust state and Released As
of Jira issues fixed in the release (see the changelog for issue links)
Create a new tag in the jenkinsci/docker repository with the value of the released core version:
git tag --annotate --message="2.VVV.V" 2.VVV.V
git push upstream 2.VVV.V
Publish a release on GitHub associated with the tag pushed.
The Container image job in trusted.ci.jenkins.io should detect the tag in the next 15 minutes and automatically publish it to the DockerHub.
Note: If you do not have access to the network trusted.ci.jenkins.io is in, ask a release team or infrastructure team member to start the job for you. Access to the VPN is not sufficient.
Confirm that the images are available at Docker hub.
Update the helm charts to the new LTS release. The jenkins-dependency-updater
bot generates the PR automatically in the jenkinsci/helm-charts repository. Once approved and merged, it's released automatically.
If the bot didn't create a PR yet, either wait for the next cron schedule or run the sync-lts
workflow manually.
- Create a helpdesk ticket to update
ci.jenkins.io
,trusted.ci
,cert.ci
andrelease.ci
to the new LTS release, example
Check LTS changelog is visible on the downloads site.