Skip to content

Commit 9c0469a

Browse files
committed
HHH-17239 Automate maintenance releases
1 parent 0ab6fa3 commit 9c0469a

File tree

8 files changed

+666
-7
lines changed

8 files changed

+666
-7
lines changed

.release/.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
# The folder into which we checkout our release scripts into
2+
*

ci/release/Jenkinsfile

Lines changed: 207 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,207 @@
1+
#! /usr/bin/groovy
2+
/*
3+
* Hibernate, Relational Persistence for Idiomatic Java
4+
*
5+
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
6+
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
7+
*/
8+
9+
/*
10+
* See https://github.com/hibernate/hibernate-jenkins-pipeline-helpers
11+
*/
12+
@Library('[email protected]') _
13+
14+
// Avoid running the pipeline on branch indexing
15+
if (currentBuild.getBuildCauses().toString().contains('BranchIndexingCause')) {
16+
print "INFO: Build skipped due to trigger being Branch Indexing"
17+
currentBuild.result = 'ABORTED'
18+
return
19+
}
20+
21+
env.PROJECT = "orm"
22+
env.JIRA_KEY = "HHH"
23+
24+
pipeline {
25+
agent {
26+
label 'Worker&&Containers'
27+
}
28+
tools {
29+
jdk 'OpenJDK 11 Latest'
30+
}
31+
options {
32+
buildDiscarder logRotator(daysToKeepStr: '30', numToKeepStr: '10')
33+
rateLimitBuilds(throttle: [count: 1, durationName: 'day', userBoost: true])
34+
disableConcurrentBuilds(abortPrevious: false)
35+
preserveStashes()
36+
}
37+
parameters {
38+
string(
39+
name: 'RELEASE_VERSION',
40+
defaultValue: '',
41+
description: 'The version to be released, e.g. 6.2.1.Final.',
42+
trim: true
43+
)
44+
string(
45+
name: 'DEVELOPMENT_VERSION',
46+
defaultValue: '',
47+
description: 'The next version to be used after the release, e.g. 6.2.2-SNAPSHOT.',
48+
trim: true
49+
)
50+
booleanParam(
51+
name: 'RELEASE_DRY_RUN',
52+
defaultValue: false,
53+
description: 'If true, just simulate the release, without pushing any commits or tags, and without uploading any artifacts or documentation.'
54+
)
55+
}
56+
stages {
57+
stage('Release check') {
58+
steps {
59+
script {
60+
dir('.release/scripts') {
61+
checkout scmGit(branches: [[name: '*/main']], extensions: [], userRemoteConfigs: [[credentialsId: 'ed25519.Hibernate-CI.github.com', url: 'https://github.com/hibernate/hibernate-release-scripts.git']])
62+
}
63+
// Determine version information for release process
64+
env.CURRENT_VERSION = sh(
65+
script: ".release/scripts/determine-current-version.sh ${env.PROJECT}",
66+
returnStdout: true
67+
).trim()
68+
69+
if ( params.RELEASE_VERSION == null || params.RELEASE_VERSION.isEmpty() ) {
70+
env.RELEASE_VERSION = sh(
71+
script: ".release/scripts/determine-release-version.sh ${env.CURRENT_VERSION}",
72+
returnStdout: true
73+
).trim()
74+
}
75+
else {
76+
env.RELEASE_VERSION = params.RELEASE_VERSION
77+
}
78+
if ( params.DEVELOPMENT_VERSION == null || params.DEVELOPMENT_VERSION.isEmpty() ) {
79+
env.DEVELOPMENT_VERSION = sh(
80+
script: ".release/scripts/determine-development-version.sh ${env.RELEASE_VERSION}",
81+
returnStdout: true
82+
).trim()
83+
}
84+
else {
85+
env.DEVELOPMENT_VERSION = params.DEVELOPMENT_VERSION
86+
}
87+
env.VERSION_BASIS = sh(
88+
script: ".release/scripts/determine-version-basis.sh ${env.RELEASE_VERSION}",
89+
returnStdout: true
90+
).trim()
91+
env.VERSION_FAMILY = sh(
92+
script: ".release/scripts/determine-version-family.sh ${env.RELEASE_VERSION}",
93+
returnStdout: true
94+
).trim()
95+
env.NEXT_VERSION_BASIS = sh(
96+
script: ".release/scripts/determine-version-basis.sh ${env.DEVELOPMENT_VERSION}",
97+
returnStdout: true
98+
).trim()
99+
env.SCRIPT_OPTIONS = params.RELEASE_DRY_RUN ? "-d" : ""
100+
echo "Workspace version: ${env.CURRENT_VERSION}"
101+
echo "Release version: ${env.RELEASE_VERSION}"
102+
echo "Development version: ${env.DEVELOPMENT_VERSION}"
103+
echo "Version family: ${env.VERSION_FAMILY}"
104+
105+
// Determine version id to check if Jira version exists
106+
sh(script: ".release/scripts/determine-jira-version-id.sh ${env.JIRA_KEY} ${env.VERSION_BASIS}", returnStdout: true)
107+
}
108+
}
109+
}
110+
stage('Release prepare') {
111+
steps {
112+
script {
113+
dir('.release/scripts') {
114+
checkout scmGit(branches: [[name: '*/main']], extensions: [], userRemoteConfigs: [[credentialsId: 'ed25519.Hibernate-CI.github.com', url: 'https://github.com/hibernate/hibernate-release-scripts.git']])
115+
}
116+
configFileProvider([configFile(fileId: 'release.config.ssh', targetLocation: "${env.HOME}/.ssh/config"), configFile(fileId: 'release.config.ssh.knownhosts', targetLocation: "${env.HOME}/.ssh/known_hosts")]) {
117+
withCredentials([
118+
usernamePassword(credentialsId: 'ossrh.sonatype.org', passwordVariable: 'OSSRH_PASSWORD', usernameVariable: 'OSSRH_USER'),
119+
usernamePassword(credentialsId: 'gradle-plugin-portal-api-key', passwordVariable: 'PLUGIN_PORTAL_PASSWORD', usernameVariable: 'PLUGIN_PORTAL_USERNAME'),
120+
file(credentialsId: 'release.gpg.private-key', variable: 'RELEASE_GPG_PRIVATE_KEY_PATH'),
121+
string(credentialsId: 'release.gpg.passphrase', variable: 'RELEASE_GPG_PASSPHRASE')
122+
]) {
123+
sshagent(['ed25519.Hibernate-CI.github.com', 'hibernate.filemgmt.jboss.org', 'hibernate-ci.frs.sourceforge.net']) {
124+
// set release version
125+
// update changelog from JIRA
126+
// tags the version
127+
// changes the version to the provided development version
128+
sh ".release/scripts/prepare-release.sh ${env.PROJECT} ${env.RELEASE_VERSION} ${env.DEVELOPMENT_VERSION}"
129+
}
130+
}
131+
}
132+
}
133+
}
134+
}
135+
// Done through Jira Automation
136+
// stage('Jira release') {
137+
// steps {
138+
// script {
139+
// dir('.release/scripts') {
140+
// checkout scmGit(branches: [[name: '*/main']], extensions: [], userRemoteConfigs: [[credentialsId: 'ed25519.Hibernate-CI.github.com', url: 'https://github.com/hibernate/hibernate-release-scripts.git']])
141+
// }
142+
// withCredentials([usernameColonPassword(credentialsId: 'jira-automation', variable: 'JIRA_API_TOKEN')]) {
143+
// sh ".release/scripts/jira-release.sh ${env.SCRIPT_OPTIONS} ${env.JIRA_KEY} ${env.VERSION_BASIS} ${env.NEXT_VERSION_BASIS}"
144+
// }
145+
// }
146+
// }
147+
// }
148+
stage('Publish release') {
149+
steps {
150+
script {
151+
dir('.release/scripts') {
152+
checkout scmGit(branches: [[name: '*/main']], extensions: [], userRemoteConfigs: [[credentialsId: 'ed25519.Hibernate-CI.github.com', url: 'https://github.com/hibernate/hibernate-release-scripts.git']])
153+
}
154+
configFileProvider([configFile(fileId: 'release.config.ssh', targetLocation: "${env.HOME}/.ssh/config"), configFile(fileId: 'release.config.ssh.knownhosts', targetLocation: "${env.HOME}/.ssh/known_hosts")]) {
155+
withCredentials([
156+
usernamePassword(credentialsId: 'ossrh.sonatype.org', passwordVariable: 'OSSRH_PASSWORD', usernameVariable: 'OSSRH_USER'),
157+
usernamePassword(credentialsId: 'gradle-plugin-portal-api-key', passwordVariable: 'PLUGIN_PORTAL_PASSWORD', usernameVariable: 'PLUGIN_PORTAL_USERNAME'),
158+
file(credentialsId: 'release.gpg.private-key', variable: 'RELEASE_GPG_PRIVATE_KEY_PATH'), string(credentialsId: 'release.gpg.passphrase', variable: 'RELEASE_GPG_PASSPHRASE')
159+
]) {
160+
sshagent(['ed25519.Hibernate-CI.github.com', 'hibernate.filemgmt.jboss.org', 'hibernate-ci.frs.sourceforge.net']) {
161+
// performs documentation upload and Sonatype release
162+
// push to github
163+
sh ".release/scripts/publish.sh ${env.SCRIPT_OPTIONS} ${env.PROJECT} ${env.VERSION_BASIS} ${env.NEXT_VERSION_BASIS}"
164+
}
165+
}
166+
}
167+
}
168+
}
169+
}
170+
stage('Website release') {
171+
steps {
172+
script {
173+
dir('.release/scripts') {
174+
checkout scmGit(branches: [[name: '*/main']], extensions: [], userRemoteConfigs: [[credentialsId: 'ed25519.Hibernate-CI.github.com', url: 'https://github.com/hibernate/hibernate-release-scripts.git']])
175+
}
176+
configFileProvider([configFile(fileId: 'release.config.ssh', targetLocation: "${env.HOME}/.ssh/config"), configFile(fileId: 'release.config.ssh.knownhosts', targetLocation: "${env.HOME}/.ssh/known_hosts")]) {
177+
sshagent(['ed25519.Hibernate-CI.github.com', 'hibernate.filemgmt.jboss.org', 'hibernate-ci.frs.sourceforge.net']) {
178+
dir('.release/hibernate.org') {
179+
checkout scmGit(branches: [[name: '*/production']], extensions: [], userRemoteConfigs: [[credentialsId: 'ed25519.Hibernate-CI.github.com', url: 'https://github.com/hibernate/hibernate.org.git']])
180+
sh "../scripts/website-release.sh ${env.SCRIPT_OPTIONS} ${env.PROJECT} ${env.VERSION_BASIS}"
181+
}
182+
}
183+
}
184+
}
185+
}
186+
}
187+
stage('GitHub release') {
188+
steps {
189+
script {
190+
dir('.release/scripts') {
191+
checkout scmGit(branches: [[name: '*/main']], extensions: [], userRemoteConfigs: [[credentialsId: 'ed25519.Hibernate-CI.github.com', url: 'https://github.com/hibernate/hibernate-release-scripts.git']])
192+
}
193+
withCredentials([string(credentialsId: 'Hibernate-CI.github.com', variable: 'GITHUB_API_TOKEN')]) {
194+
sh ".release/scripts/github-release.sh ${env.SCRIPT_OPTIONS} ${env.PROJECT} ${env.RELEASE_VERSION}"
195+
}
196+
}
197+
}
198+
}
199+
}
200+
post {
201+
always {
202+
configFileProvider([configFile(fileId: 'job-configuration.yaml', variable: 'JOB_CONFIGURATION_FILE')]) {
203+
notifyBuildResult maintainers: (String) readYaml(file: env.JOB_CONFIGURATION_FILE).notification?.email?.recipients
204+
}
205+
}
206+
}
207+
}

gradle/javadoc.gradle

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,13 @@ tasks.named( "javadoc", Javadoc ) {
3636
stylesheetFile = rootProject.file( "shared/javadoc/stylesheet.css" )
3737
bottom = "Copyright &copy; 2001-$currentYear <a href=\"https://redhat.com\">Red Hat, Inc.</a> All Rights Reserved."
3838

39-
links = [
40-
'https://docs.oracle.com/en/java/javase/11/docs/api/',
41-
'https://jakarta.ee/specifications/bean-validation/3.0/apidocs/',
42-
'https://jakarta.ee/specifications/cdi/4.0/apidocs/',
43-
'https://jakarta.ee/specifications/platform/9/apidocs/',
44-
'https://www.javadoc.io/doc/javax.cache/cache-api/1.0.0/'
45-
]
39+
// The javadoc folder contains cached versions of the respective element-list files to avoid release issues when servers are down
40+
// When upgrading versions of the libraries, don't forget to update the file contents in the repository
41+
linksOffline 'https://docs.oracle.com/en/java/javase/11/docs/api/', "${project.rootDir}/javadoc/javase11"
42+
linksOffline 'https://jakarta.ee/specifications/bean-validation/3.0/apidocs/', "${project.rootDir}/javadoc/jakarta-validation-3.0"
43+
linksOffline 'https://jakarta.ee/specifications/cdi/4.0/apidocs/', "${project.rootDir}/javadoc/jakarta-cdi-4.0"
44+
linksOffline 'https://jakarta.ee/specifications/platform/9/apidocs/', "${project.rootDir}/javadoc/jakarta-platform-9"
45+
linksOffline 'https://www.javadoc.io/doc/javax.cache/cache-api/1.0.0/', "${project.rootDir}/javadoc/javax-cache-1.0"
4646

4747
tags(
4848
'todo:X',

javadoc/jakarta-cdi-4.0/element-list

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
module:jakarta.cdi
2+
jakarta.decorator
3+
jakarta.enterprise.context
4+
jakarta.enterprise.context.control
5+
jakarta.enterprise.context.spi
6+
jakarta.enterprise.event
7+
jakarta.enterprise.inject
8+
jakarta.enterprise.inject.build.compatible.spi
9+
jakarta.enterprise.inject.literal
10+
jakarta.enterprise.inject.se
11+
jakarta.enterprise.inject.spi
12+
jakarta.enterprise.inject.spi.configurator
13+
jakarta.enterprise.util
14+
module:jakarta.cdi.lang.model
15+
jakarta.enterprise.lang.model
16+
jakarta.enterprise.lang.model.declarations
17+
jakarta.enterprise.lang.model.types
Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
jakarta.activation
2+
jakarta.annotation
3+
jakarta.annotation.security
4+
jakarta.annotation.sql
5+
jakarta.batch.api
6+
jakarta.batch.api.chunk
7+
jakarta.batch.api.chunk.listener
8+
jakarta.batch.api.listener
9+
jakarta.batch.api.partition
10+
jakarta.batch.operations
11+
jakarta.batch.runtime
12+
jakarta.batch.runtime.context
13+
jakarta.decorator
14+
jakarta.ejb
15+
jakarta.ejb.embeddable
16+
jakarta.ejb.spi
17+
jakarta.el
18+
jakarta.enterprise.concurrent
19+
jakarta.enterprise.context
20+
jakarta.enterprise.context.control
21+
jakarta.enterprise.context.spi
22+
jakarta.enterprise.event
23+
jakarta.enterprise.inject
24+
jakarta.enterprise.inject.literal
25+
jakarta.enterprise.inject.se
26+
jakarta.enterprise.inject.spi
27+
jakarta.enterprise.inject.spi.configurator
28+
jakarta.enterprise.util
29+
jakarta.faces
30+
jakarta.faces.annotation
31+
jakarta.faces.application
32+
jakarta.faces.bean
33+
jakarta.faces.component
34+
jakarta.faces.component.behavior
35+
jakarta.faces.component.html
36+
jakarta.faces.component.search
37+
jakarta.faces.component.visit
38+
jakarta.faces.context
39+
jakarta.faces.convert
40+
jakarta.faces.el
41+
jakarta.faces.event
42+
jakarta.faces.flow
43+
jakarta.faces.flow.builder
44+
jakarta.faces.lifecycle
45+
jakarta.faces.model
46+
jakarta.faces.push
47+
jakarta.faces.render
48+
jakarta.faces.validator
49+
jakarta.faces.view
50+
jakarta.faces.view.facelets
51+
jakarta.faces.webapp
52+
jakarta.inject
53+
jakarta.interceptor
54+
jakarta.jms
55+
jakarta.json
56+
jakarta.json.bind
57+
jakarta.json.bind.adapter
58+
jakarta.json.bind.annotation
59+
jakarta.json.bind.config
60+
jakarta.json.bind.serializer
61+
jakarta.json.bind.spi
62+
jakarta.json.spi
63+
jakarta.json.stream
64+
jakarta.jws
65+
jakarta.jws.soap
66+
jakarta.mail
67+
jakarta.mail.event
68+
jakarta.mail.internet
69+
jakarta.mail.search
70+
jakarta.mail.util
71+
jakarta.persistence
72+
jakarta.persistence.criteria
73+
jakarta.persistence.metamodel
74+
jakarta.persistence.spi
75+
jakarta.resource
76+
jakarta.resource.cci
77+
jakarta.resource.spi
78+
jakarta.resource.spi.endpoint
79+
jakarta.resource.spi.security
80+
jakarta.resource.spi.work
81+
jakarta.security.auth.message
82+
jakarta.security.auth.message.callback
83+
jakarta.security.auth.message.config
84+
jakarta.security.auth.message.module
85+
jakarta.security.enterprise
86+
jakarta.security.enterprise.authentication.mechanism.http
87+
jakarta.security.enterprise.credential
88+
jakarta.security.enterprise.identitystore
89+
jakarta.security.jacc
90+
jakarta.servlet
91+
jakarta.servlet.annotation
92+
jakarta.servlet.descriptor
93+
jakarta.servlet.http
94+
jakarta.servlet.jsp
95+
jakarta.servlet.jsp.el
96+
jakarta.servlet.jsp.jstl.core
97+
jakarta.servlet.jsp.jstl.fmt
98+
jakarta.servlet.jsp.jstl.sql
99+
jakarta.servlet.jsp.jstl.tlv
100+
jakarta.servlet.jsp.tagext
101+
jakarta.transaction
102+
jakarta.validation
103+
jakarta.validation.bootstrap
104+
jakarta.validation.constraints
105+
jakarta.validation.constraintvalidation
106+
jakarta.validation.executable
107+
jakarta.validation.groups
108+
jakarta.validation.metadata
109+
jakarta.validation.spi
110+
jakarta.validation.valueextraction
111+
jakarta.websocket
112+
jakarta.websocket.server
113+
jakarta.ws.rs
114+
jakarta.ws.rs.client
115+
jakarta.ws.rs.container
116+
jakarta.ws.rs.core
117+
jakarta.ws.rs.ext
118+
jakarta.ws.rs.sse
119+
jakarta.xml.bind
120+
jakarta.xml.bind.annotation
121+
jakarta.xml.bind.annotation.adapters
122+
jakarta.xml.bind.attachment
123+
jakarta.xml.bind.helpers
124+
jakarta.xml.bind.util
125+
jakarta.xml.soap
126+
jakarta.xml.ws
127+
jakarta.xml.ws.handler
128+
jakarta.xml.ws.handler.soap
129+
jakarta.xml.ws.http
130+
jakarta.xml.ws.soap
131+
jakarta.xml.ws.spi
132+
jakarta.xml.ws.spi.http
133+
jakarta.xml.ws.wsaddressing
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
jakarta.validation
2+
jakarta.validation.bootstrap
3+
jakarta.validation.constraints
4+
jakarta.validation.constraintvalidation
5+
jakarta.validation.executable
6+
jakarta.validation.groups
7+
jakarta.validation.metadata
8+
jakarta.validation.spi
9+
jakarta.validation.valueextraction

0 commit comments

Comments
 (0)