HHH-17981 Automate maintenance releases for 6.4
This commit is contained in:
parent
7401c19196
commit
66dbb7a1fc
|
@ -7,9 +7,6 @@
|
|||
name: Hibernate ORM build-Atlas
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- '6.4'
|
||||
pull_request:
|
||||
branches:
|
||||
- '6.4'
|
||||
|
|
|
@ -7,9 +7,6 @@
|
|||
name: Hibernate ORM build
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- '6.4'
|
||||
pull_request:
|
||||
branches:
|
||||
- '6.4'
|
||||
|
|
|
@ -26,28 +26,13 @@ this.helper = new JobHelper(this)
|
|||
helper.runWithNotification {
|
||||
stage('Configure') {
|
||||
this.environments = [
|
||||
// new BuildEnvironment( dbName: 'h2' ),
|
||||
// new BuildEnvironment( dbName: 'hsqldb' ),
|
||||
// new BuildEnvironment( dbName: 'derby' ),
|
||||
// new BuildEnvironment( dbName: 'mysql' ),
|
||||
// new BuildEnvironment( dbName: 'mariadb' ),
|
||||
// new BuildEnvironment( dbName: 'postgresql' ),
|
||||
// new BuildEnvironment( dbName: 'edb' ),
|
||||
// new BuildEnvironment( dbName: 'oracle' ),
|
||||
// new BuildEnvironment( dbName: 'db2' ),
|
||||
// new BuildEnvironment( dbName: 'mssql' ),
|
||||
// new BuildEnvironment( dbName: 'sybase' ),
|
||||
// Don't build with HANA by default, but only do it nightly until we receive a 3rd instance
|
||||
// new BuildEnvironment( dbName: 'hana_cloud', dbLockableResource: 'hana-cloud', dbLockResourceAsHost: true ),
|
||||
new BuildEnvironment( node: 's390x' ),
|
||||
new BuildEnvironment( dbName: 'tidb', node: 'tidb',
|
||||
notificationRecipients: 'tidb_hibernate@pingcap.com' ),
|
||||
new BuildEnvironment( dbName: 'sybase_jconn' ),
|
||||
new BuildEnvironment( testJdkVersion: '17' ),
|
||||
new BuildEnvironment( testJdkVersion: '21' ),
|
||||
// We want to enable preview features when testing newer builds of OpenJDK:
|
||||
// even if we don't use these features, just enabling them can cause side effects
|
||||
// and it's useful to test that.
|
||||
new BuildEnvironment( testJdkVersion: '20', testJdkLauncherArgs: '--enable-preview' ),
|
||||
new BuildEnvironment( testJdkVersion: '21', testJdkLauncherArgs: '--enable-preview' ),
|
||||
new BuildEnvironment( testJdkVersion: '22', testJdkLauncherArgs: '--enable-preview' ),
|
||||
// The following JDKs aren't supported by Hibernate ORM out-of-the box yet:
|
||||
// they require the use of -Dnet.bytebuddy.experimental=true.
|
||||
|
@ -56,18 +41,6 @@ stage('Configure') {
|
|||
new BuildEnvironment( testJdkVersion: '23', testJdkLauncherArgs: '--enable-preview -Dnet.bytebuddy.experimental=true' )
|
||||
];
|
||||
|
||||
if ( env.CHANGE_ID ) {
|
||||
if ( pullRequest.labels.contains( 'cockroachdb' ) ) {
|
||||
this.environments.add( new BuildEnvironment( dbName: 'cockroachdb', node: 'cockroachdb', longRunning: true ) )
|
||||
}
|
||||
if ( pullRequest.labels.contains( 'hana' ) ) {
|
||||
this.environments.add( new BuildEnvironment( dbName: 'hana_cloud', dbLockableResource: 'hana-cloud', dbLockResourceAsHost: true ) )
|
||||
}
|
||||
if ( pullRequest.labels.contains( 'sybase' ) ) {
|
||||
this.environments.add( new BuildEnvironment( dbName: 'sybase_jconn' ) )
|
||||
}
|
||||
}
|
||||
|
||||
helper.configure {
|
||||
file 'job-configuration.yaml'
|
||||
// We don't require the following, but the build helper plugin apparently does
|
||||
|
@ -91,19 +64,21 @@ stage('Configure') {
|
|||
|
||||
// Avoid running the pipeline on branch indexing
|
||||
if (currentBuild.getBuildCauses().toString().contains('BranchIndexingCause')) {
|
||||
print "INFO: Build skipped due to trigger being Branch Indexing"
|
||||
print "INFO: Build skipped due to trigger being Branch Indexing"
|
||||
currentBuild.result = 'NOT_BUILT'
|
||||
return
|
||||
}
|
||||
// This is a limited maintenance branch, so don't run this on pushes to the branch, only on PRs
|
||||
if ( !env.CHANGE_ID ) {
|
||||
print "INFO: Build skipped because this job should only run for pull request, not for branch pushes"
|
||||
currentBuild.result = 'NOT_BUILT'
|
||||
return
|
||||
}
|
||||
|
||||
stage('Build') {
|
||||
Map<String, Closure> executions = [:]
|
||||
Map<String, Map<String, String>> state = [:]
|
||||
environments.each { BuildEnvironment buildEnv ->
|
||||
// Don't build environments for newer JDKs when this is a PR
|
||||
if ( helper.scmSource.pullRequest && buildEnv.testJdkVersion ) {
|
||||
return
|
||||
}
|
||||
state[buildEnv.tag] = [:]
|
||||
executions.put(buildEnv.tag, {
|
||||
runBuildOnNode(buildEnv.node ?: NODE_PATTERN_BASE) {
|
||||
|
@ -194,6 +169,9 @@ stage('Build') {
|
|||
}
|
||||
})
|
||||
}
|
||||
executions.put('Hibernate Search Update Dependency', {
|
||||
build job: '/hibernate-search-dependency-update/7.1', propagate: true, parameters: [string(name: 'UPDATE_JOB', value: 'orm6.4'), string(name: 'ORM_REPOSITORY', value: helper.scmSource.remoteUrl), string(name: 'ORM_PULL_REQUEST_ID', value: helper.scmSource.pullRequest.id)]
|
||||
})
|
||||
parallel(executions)
|
||||
}
|
||||
|
||||
|
|
|
@ -2,21 +2,15 @@
|
|||
|
||||
// Avoid running the pipeline on branch indexing
|
||||
if (currentBuild.getBuildCauses().toString().contains('BranchIndexingCause')) {
|
||||
print "INFO: Build skipped due to trigger being Branch Indexing"
|
||||
print "INFO: Build skipped due to trigger being Branch Indexing"
|
||||
currentBuild.result = 'NOT_BUILT'
|
||||
return
|
||||
return
|
||||
}
|
||||
def throttleCount
|
||||
// Don't build the TCK on PRs, unless they use the tck label
|
||||
if ( env.CHANGE_ID != null ) {
|
||||
if ( !pullRequest.labels.contains( 'tck' ) ) {
|
||||
print "INFO: Build skipped because pull request doesn't have 'tck' label"
|
||||
return
|
||||
}
|
||||
throttleCount = 20
|
||||
}
|
||||
else {
|
||||
throttleCount = 1
|
||||
// This is a limited maintenance branch, so don't run this on pushes to the branch, only on PRs
|
||||
if ( !env.CHANGE_ID ) {
|
||||
print "INFO: Build skipped because this job should only run for pull request, not for branch pushes"
|
||||
currentBuild.result = 'NOT_BUILT'
|
||||
return
|
||||
}
|
||||
|
||||
pipeline {
|
||||
|
@ -27,7 +21,6 @@ pipeline {
|
|||
jdk 'OpenJDK 11 Latest'
|
||||
}
|
||||
options {
|
||||
rateLimitBuilds(throttle: [count: throttleCount, durationName: 'day', userBoost: true])
|
||||
buildDiscarder(logRotator(numToKeepStr: '3', artifactNumToKeepStr: '3'))
|
||||
disableConcurrentBuilds(abortPrevious: true)
|
||||
}
|
||||
|
|
|
@ -1,99 +0,0 @@
|
|||
@Library('hibernate-jenkins-pipeline-helpers@1.5') _
|
||||
|
||||
// Avoid running the pipeline on branch indexing
|
||||
if (currentBuild.getBuildCauses().toString().contains('BranchIndexingCause')) {
|
||||
print "INFO: Build skipped due to trigger being Branch Indexing"
|
||||
currentBuild.result = 'NOT_BUILT'
|
||||
return
|
||||
}
|
||||
|
||||
pipeline {
|
||||
agent {
|
||||
label 'LongDuration'
|
||||
}
|
||||
tools {
|
||||
jdk 'OpenJDK 11 Latest'
|
||||
}
|
||||
options {
|
||||
rateLimitBuilds(throttle: [count: 1, durationName: 'day', userBoost: true])
|
||||
buildDiscarder(logRotator(numToKeepStr: '3', artifactNumToKeepStr: '3'))
|
||||
disableConcurrentBuilds(abortPrevious: true)
|
||||
}
|
||||
parameters {
|
||||
choice(name: 'IMAGE_JDK', choices: ['jdk11'], description: 'The JDK base image version to use for the TCK image.')
|
||||
string(name: 'TCK_VERSION', defaultValue: '3.1.0', description: 'The version of the Jakarta JPA TCK i.e. `2.2.0` or `3.0.1`')
|
||||
string(name: 'TCK_SHA'/* Avoid default since the version is non-final, defaultValue: '33c8a9380fbdf223e84113a4e20866b42ba2b60a46f1d8ac25d240f0bc919294'*/, description: 'The SHA256 of the Jakarta JPA TCK that is distributed under https://download.eclipse.org/jakartaee/persistence/3.0/jakarta-persistence-tck-${TCK_VERSION}.zip.sha256')
|
||||
booleanParam(name: 'NO_SLEEP', defaultValue: true, description: 'Whether the NO_SLEEP patch should be applied to speed up the TCK execution')
|
||||
}
|
||||
stages {
|
||||
stage('Build') {
|
||||
steps {
|
||||
script {
|
||||
// Don't build the TCK on PRs, unless they use the tck label
|
||||
if ( env.CHANGE_ID && !pullRequest.labels.contains( 'tck' ) ) {
|
||||
print "INFO: Build skipped because pull request doesn't have 'tck' label"
|
||||
currentBuild.result = 'NOT_BUILT'
|
||||
return
|
||||
}
|
||||
docker.withRegistry('https://index.docker.io/v1/', 'hibernateci.hub.docker.com') {
|
||||
docker.image('openjdk:11-jdk').pull()
|
||||
}
|
||||
}
|
||||
dir('hibernate') {
|
||||
checkout scm
|
||||
sh './gradlew publishToMavenLocal -PmavenMirror=nexus-load-balancer-c4cf05fd92f43ef8.elb.us-east-1.amazonaws.com -DjakartaJpaVersion=3.2.0-SNAPSHOT'
|
||||
script {
|
||||
env.HIBERNATE_VERSION = sh (
|
||||
script: "grep hibernateVersion gradle/version.properties|cut -d'=' -f2",
|
||||
returnStdout: true
|
||||
).trim()
|
||||
}
|
||||
}
|
||||
dir('tck') {
|
||||
checkout changelog: false, poll: false, scm: [$class: 'GitSCM', branches: [[name: '*/main']], extensions: [], userRemoteConfigs: [[url: 'https://github.com/hibernate/jakarta-tck-runner.git']]]
|
||||
sh """ \
|
||||
cd jpa-3.2; docker build -f Dockerfile.${params.IMAGE_JDK} -t jakarta-tck-runner --build-arg TCK_VERSION=${params.TCK_VERSION} --build-arg TCK_SHA=${params.TCK_SHA} .
|
||||
"""
|
||||
}
|
||||
}
|
||||
}
|
||||
stage('Run TCK') {
|
||||
steps {
|
||||
sh """ \
|
||||
rm -Rf ./results
|
||||
docker rm -f tck || true
|
||||
docker volume rm -f tck-vol || true
|
||||
docker volume create tck-vol
|
||||
docker run -v ~/.m2/repository/org/hibernate:/root/.m2/repository/org/hibernate:z -v tck-vol:/tck/persistence-tck/tmp/:z -e NO_SLEEP=${params.NO_SLEEP} -e HIBERNATE_VERSION=$HIBERNATE_VERSION --name tck jakarta-tck-runner
|
||||
docker cp tck:/tck/persistence-tck/tmp/ ./results
|
||||
"""
|
||||
archiveArtifacts artifacts: 'results/**'
|
||||
script {
|
||||
failures = sh (
|
||||
script: """ \
|
||||
set +x
|
||||
while read line; do
|
||||
if [[ "\$line" != *"Passed." ]]; then
|
||||
echo "\$line"
|
||||
fi
|
||||
done <results/JTreport/text/summary.txt
|
||||
""",
|
||||
returnStdout: true
|
||||
).trim()
|
||||
if ( !failures.isEmpty() ) {
|
||||
echo "Some TCK tests failed:"
|
||||
echo failures
|
||||
currentBuild.result = 'FAILURE'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
post {
|
||||
always {
|
||||
configFileProvider([configFile(fileId: 'job-configuration.yaml', variable: 'JOB_CONFIGURATION_FILE')]) {
|
||||
notifyBuildResult maintainers: (String) readYaml(file: env.JOB_CONFIGURATION_FILE).notification?.email?.recipients
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,64 @@
|
|||
@Library('hibernate-jenkins-pipeline-helpers@1.5') _
|
||||
|
||||
// Avoid running the pipeline on branch indexing
|
||||
if (currentBuild.getBuildCauses().toString().contains('BranchIndexingCause')) {
|
||||
print "INFO: Build skipped due to trigger being Branch Indexing"
|
||||
currentBuild.result = 'NOT_BUILT'
|
||||
return
|
||||
}
|
||||
// This is a limited maintenance branch, so don't run this on pushes to the branch, only on PRs
|
||||
if ( !env.CHANGE_ID ) {
|
||||
print "INFO: Build skipped because this job should only run for pull request, not for branch pushes"
|
||||
currentBuild.result = 'NOT_BUILT'
|
||||
return
|
||||
}
|
||||
|
||||
pipeline {
|
||||
agent {
|
||||
label 'LongDuration'
|
||||
}
|
||||
tools {
|
||||
jdk 'OpenJDK 17 Latest'
|
||||
}
|
||||
options {
|
||||
buildDiscarder(logRotator(numToKeepStr: '3', artifactNumToKeepStr: '3'))
|
||||
disableConcurrentBuilds(abortPrevious: true)
|
||||
}
|
||||
stages {
|
||||
stage('Build') {
|
||||
steps {
|
||||
script {
|
||||
sh './gradlew publishToMavenLocal -PmavenMirror=nexus-load-balancer-c4cf05fd92f43ef8.elb.us-east-1.amazonaws.com --no-daemon'
|
||||
script {
|
||||
env.HIBERNATE_VERSION = sh (
|
||||
script: "grep hibernateVersion gradle/version.properties|cut -d'=' -f2",
|
||||
returnStdout: true
|
||||
).trim()
|
||||
}
|
||||
dir('.release/quarkus') {
|
||||
sh "git clone -b 3.8 --single-branch https://github.com/quarkusio/quarkus.git . || git reset --hard && git clean -fx && git pull"
|
||||
sh "sed -i 's@<hibernate-orm.version>.*</hibernate-orm.version>@<hibernate-orm.version>${env.HIBERNATE_VERSION}</hibernate-orm.version>@' bom/application/pom.xml"
|
||||
// Need to override the default maven configuration this way, because there is no other way to do it
|
||||
sh "sed -i 's/-Xmx5g/-Xmx1920m/' ./.mvn/jvm.config"
|
||||
sh "echo -e '\\n-XX:MaxMetaspaceSize=768m'>>./.mvn/jvm.config"
|
||||
sh "./mvnw -pl !docs -Dquickly install"
|
||||
// Need to kill the gradle daemons started during the Maven install run
|
||||
sh "sudo pkill -f '.*GradleDaemon.*' || true"
|
||||
// Need to override the default maven configuration this way, because there is no other way to do it
|
||||
sh "sed -i 's/-Xmx1920m/-Xmx1340m/' ./.mvn/jvm.config"
|
||||
sh "sed -i 's/MaxMetaspaceSize=768m/MaxMetaspaceSize=512m/' ./.mvn/jvm.config"
|
||||
def excludes = "'!integration-tests/kafka-oauth-keycloak,!integration-tests/kafka-sasl-elytron,!integration-tests/hibernate-search-orm-opensearch,!integration-tests/maven,!integration-tests/quartz,!integration-tests/reactive-messaging-kafka,!integration-tests/resteasy-reactive-kotlin/standard,!integration-tests/opentelemetry-reactive-messaging,!integration-tests/virtual-threads/kafka-virtual-threads,!integration-tests/smallrye-jwt-oidc-webapp,!docs'"
|
||||
sh "TESTCONTAINERS_RYUK_CONTAINER_PRIVILEGED=true ./mvnw -pl :quarkus-hibernate-orm -amd -pl ${excludes} verify -Dstart-containers -Dtest-containers -Dskip.gradle.build"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
post {
|
||||
always {
|
||||
configFileProvider([configFile(fileId: 'job-configuration.yaml', variable: 'JOB_CONFIGURATION_FILE')]) {
|
||||
notifyBuildResult maintainers: (String) readYaml(file: env.JOB_CONFIGURATION_FILE).notification?.email?.recipients
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -58,11 +58,12 @@ pipeline {
|
|||
steps {
|
||||
script {
|
||||
// Avoid doing a release for commits from a release
|
||||
def lastCommitter = sh(script: 'git show -s --format=\'%an\'', returnStdout: true)
|
||||
def secondLastCommitter = sh(script: 'git show -s --format=\'%an\' HEAD~1', returnStdout: true)
|
||||
def lastCommitter = sh(script: 'git show -s --format=\'%an\'', returnStdout: true).trim()
|
||||
def secondLastCommitter = sh(script: 'git show -s --format=\'%an\' HEAD~1', returnStdout: true).trim()
|
||||
if (lastCommitter == 'Hibernate-CI' && secondLastCommitter == 'Hibernate-CI') {
|
||||
print "INFO: Build skipped because last commits were for the previous release"
|
||||
currentBuild.result = 'ABORTED'
|
||||
print "INFO: Release skipped because last commits were for the previous release"
|
||||
currentBuild.getRawBuild().getExecutor().interrupt(Result.NOT_BUILT)
|
||||
sleep(1) // Interrupt is not blocking and does not take effect immediately.
|
||||
return
|
||||
}
|
||||
|
||||
|
|
|
@ -1,326 +0,0 @@
|
|||
/*
|
||||
* Hibernate, Relational Persistence for Idiomatic Java
|
||||
*
|
||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||
*/
|
||||
|
||||
import groovy.transform.Field
|
||||
import io.jenkins.blueocean.rest.impl.pipeline.PipelineNodeGraphVisitor
|
||||
import io.jenkins.blueocean.rest.impl.pipeline.FlowNodeWrapper
|
||||
import org.jenkinsci.plugins.workflow.support.steps.build.RunWrapper
|
||||
|
||||
/*
|
||||
* See https://github.com/hibernate/hibernate-jenkins-pipeline-helpers
|
||||
*/
|
||||
@Library('hibernate-jenkins-pipeline-helpers@1.5') _
|
||||
import org.hibernate.jenkins.pipeline.helpers.job.JobHelper
|
||||
|
||||
@Field final String DEFAULT_JDK_VERSION = '11'
|
||||
@Field final String DEFAULT_JDK_TOOL = "OpenJDK ${DEFAULT_JDK_VERSION} Latest"
|
||||
@Field final String NODE_PATTERN_BASE = 'Worker&&Containers'
|
||||
@Field List<BuildEnvironment> environments
|
||||
|
||||
this.helper = new JobHelper(this)
|
||||
|
||||
helper.runWithNotification {
|
||||
stage('Configure') {
|
||||
this.environments = [
|
||||
// Minimum supported versions
|
||||
new BuildEnvironment( dbName: 'hsqldb_2_6' ),
|
||||
new BuildEnvironment( dbName: 'mysql_8_0' ),
|
||||
new BuildEnvironment( dbName: 'mariadb_10_4' ),
|
||||
new BuildEnvironment( dbName: 'postgresql_12' ),
|
||||
new BuildEnvironment( dbName: 'edb_12' ),
|
||||
new BuildEnvironment( dbName: 'oracle_21' ), // Did not find an image for Oracle-XE 19c
|
||||
new BuildEnvironment( dbName: 'db2_10_5', longRunning: true ),
|
||||
new BuildEnvironment( dbName: 'mssql_2017' ), // Unfortunately there is no SQL Server 2008 image, so we have to test with 2017
|
||||
// new BuildEnvironment( dbName: 'sybase_16' ), // There only is a Sybase ASE 16 image, so no pint in testing that nightly
|
||||
new BuildEnvironment( dbName: 'sybase_jconn' ),
|
||||
// Long running databases
|
||||
new BuildEnvironment( dbName: 'cockroachdb', node: 'cockroachdb', longRunning: true ),
|
||||
new BuildEnvironment( dbName: 'hana_cloud', dbLockableResource: 'hana-cloud', dbLockResourceAsHost: true )
|
||||
];
|
||||
|
||||
helper.configure {
|
||||
file 'job-configuration.yaml'
|
||||
// We don't require the following, but the build helper plugin apparently does
|
||||
jdk {
|
||||
defaultTool DEFAULT_JDK_TOOL
|
||||
}
|
||||
maven {
|
||||
defaultTool 'Apache Maven 3.8'
|
||||
}
|
||||
}
|
||||
properties([
|
||||
buildDiscarder(
|
||||
logRotator(daysToKeepStr: '30', numToKeepStr: '10')
|
||||
),
|
||||
rateLimitBuilds(throttle: [count: 1, durationName: 'day', userBoost: true]),
|
||||
// If two builds are about the same branch or pull request,
|
||||
// the older one will be aborted when the newer one starts.
|
||||
disableConcurrentBuilds(abortPrevious: true),
|
||||
helper.generateNotificationProperty()
|
||||
])
|
||||
}
|
||||
|
||||
// Avoid running the pipeline on branch indexing
|
||||
if (currentBuild.getBuildCauses().toString().contains('BranchIndexingCause')) {
|
||||
print "INFO: Build skipped due to trigger being Branch Indexing"
|
||||
currentBuild.result = 'NOT_BUILT'
|
||||
return
|
||||
}
|
||||
|
||||
stage('Build') {
|
||||
Map<String, Closure> executions = [:]
|
||||
Map<String, Map<String, String>> state = [:]
|
||||
environments.each { BuildEnvironment buildEnv ->
|
||||
// Don't build environments for newer JDKs when this is a PR
|
||||
if ( helper.scmSource.pullRequest && buildEnv.testJdkVersion ) {
|
||||
return
|
||||
}
|
||||
state[buildEnv.tag] = [:]
|
||||
executions.put(buildEnv.tag, {
|
||||
runBuildOnNode(buildEnv.node ?: NODE_PATTERN_BASE) {
|
||||
def testJavaHome
|
||||
if ( buildEnv.testJdkVersion ) {
|
||||
testJavaHome = tool(name: "OpenJDK ${buildEnv.testJdkVersion} Latest", type: 'jdk')
|
||||
}
|
||||
def javaHome = tool(name: DEFAULT_JDK_TOOL, type: 'jdk')
|
||||
// Use withEnv instead of setting env directly, as that is global!
|
||||
// See https://github.com/jenkinsci/pipeline-plugin/blob/master/TUTORIAL.md
|
||||
withEnv(["JAVA_HOME=${javaHome}", "PATH+JAVA=${javaHome}/bin"]) {
|
||||
state[buildEnv.tag]['additionalOptions'] = ''
|
||||
if ( testJavaHome ) {
|
||||
state[buildEnv.tag]['additionalOptions'] = state[buildEnv.tag]['additionalOptions'] +
|
||||
" -Ptest.jdk.version=${buildEnv.testJdkVersion} -Porg.gradle.java.installations.paths=${javaHome},${testJavaHome}"
|
||||
}
|
||||
if ( buildEnv.testJdkLauncherArgs ) {
|
||||
state[buildEnv.tag]['additionalOptions'] = state[buildEnv.tag]['additionalOptions'] +
|
||||
" -Ptest.jdk.launcher.args=${buildEnv.testJdkLauncherArgs}"
|
||||
}
|
||||
state[buildEnv.tag]['containerName'] = null;
|
||||
stage('Checkout') {
|
||||
checkout scm
|
||||
}
|
||||
try {
|
||||
stage('Start database') {
|
||||
switch (buildEnv.dbName) {
|
||||
case "hsqldb_2_6":
|
||||
state[buildEnv.tag]['additionalOptions'] = state[buildEnv.tag]['additionalOptions'] +
|
||||
" -Pgradle.libs.versions.hsqldb=2.6.1"
|
||||
break;
|
||||
case "mysql_8_0":
|
||||
docker.withRegistry('https://index.docker.io/v1/', 'hibernateci.hub.docker.com') {
|
||||
docker.image('mysql:8.0.31').pull()
|
||||
}
|
||||
sh "./docker_db.sh mysql_8_0"
|
||||
state[buildEnv.tag]['containerName'] = "mysql"
|
||||
break;
|
||||
case "mariadb_10_4":
|
||||
docker.withRegistry('https://index.docker.io/v1/', 'hibernateci.hub.docker.com') {
|
||||
docker.image('mariadb:10.4.31').pull()
|
||||
}
|
||||
sh "./docker_db.sh mariadb_10_4"
|
||||
state[buildEnv.tag]['containerName'] = "mariadb"
|
||||
break;
|
||||
case "postgresql_12":
|
||||
// use the postgis image to enable the PGSQL GIS (spatial) extension
|
||||
docker.withRegistry('https://index.docker.io/v1/', 'hibernateci.hub.docker.com') {
|
||||
docker.image('postgis/postgis:12-3.4').pull()
|
||||
}
|
||||
sh "./docker_db.sh postgresql_12"
|
||||
state[buildEnv.tag]['containerName'] = "postgres"
|
||||
break;
|
||||
case "edb_12":
|
||||
docker.image('quay.io/enterprisedb/edb-postgres-advanced:12.16-3.3-postgis').pull()
|
||||
sh "./docker_db.sh edb_12"
|
||||
state[buildEnv.tag]['containerName'] = "edb"
|
||||
break;
|
||||
case "oracle_21":
|
||||
docker.withRegistry('https://index.docker.io/v1/', 'hibernateci.hub.docker.com') {
|
||||
docker.image('gvenzl/oracle-xe:21.3.0-full').pull()
|
||||
}
|
||||
sh "./docker_db.sh oracle_21"
|
||||
state[buildEnv.tag]['containerName'] = "oracle"
|
||||
break;
|
||||
case "db2_10_5":
|
||||
docker.withRegistry('https://index.docker.io/v1/', 'hibernateci.hub.docker.com') {
|
||||
docker.image('ibmoms/db2express-c@sha256:a499afd9709a1f69fb41703e88def9869955234c3525547e2efc3418d1f4ca2b').pull()
|
||||
}
|
||||
sh "./docker_db.sh db2_10_5"
|
||||
state[buildEnv.tag]['containerName'] = "db2"
|
||||
break;
|
||||
case "mssql_2017":
|
||||
docker.image('mcr.microsoft.com/mssql/server@sha256:7d194c54e34cb63bca083542369485c8f4141596805611e84d8c8bab2339eede').pull()
|
||||
sh "./docker_db.sh mssql_2017"
|
||||
state[buildEnv.tag]['containerName'] = "mssql"
|
||||
break;
|
||||
case "sybase_jconn":
|
||||
docker.withRegistry('https://index.docker.io/v1/', 'hibernateci.hub.docker.com') {
|
||||
docker.image('nguoianphu/docker-sybase').pull()
|
||||
}
|
||||
sh "./docker_db.sh sybase"
|
||||
state[buildEnv.tag]['containerName'] = "sybase"
|
||||
break;
|
||||
case "cockroachdb":
|
||||
docker.withRegistry('https://index.docker.io/v1/', 'hibernateci.hub.docker.com') {
|
||||
docker.image('cockroachdb/cockroach:v23.1.12').pull()
|
||||
}
|
||||
sh "./docker_db.sh cockroachdb"
|
||||
state[buildEnv.tag]['containerName'] = "cockroach"
|
||||
break;
|
||||
}
|
||||
}
|
||||
stage('Test') {
|
||||
String cmd = "./ci/build.sh ${buildEnv.additionalOptions ?: ''} ${state[buildEnv.tag]['additionalOptions'] ?: ''}"
|
||||
withEnv(["RDBMS=${buildEnv.dbName}"]) {
|
||||
try {
|
||||
if (buildEnv.dbLockableResource == null) {
|
||||
withCredentials([file(credentialsId: 'sybase-jconnect-driver', variable: 'jconnect_driver')]) {
|
||||
sh 'cp -f $jconnect_driver ./drivers/jconn4.jar'
|
||||
timeout( [time: buildEnv.longRunning ? 480 : 120, unit: 'MINUTES'] ) {
|
||||
sh cmd
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
lock(label: buildEnv.dbLockableResource, quantity: 1, variable: 'LOCKED_RESOURCE') {
|
||||
if ( buildEnv.dbLockResourceAsHost ) {
|
||||
cmd += " -DdbHost=${LOCKED_RESOURCE}"
|
||||
}
|
||||
timeout( [time: buildEnv.longRunning ? 480 : 120, unit: 'MINUTES'] ) {
|
||||
sh cmd
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
finally {
|
||||
junit '**/target/test-results/test/*.xml,**/target/test-results/testKitTest/*.xml'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
finally {
|
||||
if ( state[buildEnv.tag]['containerName'] != null ) {
|
||||
sh "docker rm -f ${state[buildEnv.tag]['containerName']}"
|
||||
}
|
||||
// Skip this for PRs
|
||||
if ( !env.CHANGE_ID && buildEnv.notificationRecipients != null ) {
|
||||
handleNotifications(currentBuild, buildEnv)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
parallel(executions)
|
||||
}
|
||||
|
||||
} // End of helper.runWithNotification
|
||||
|
||||
// Job-specific helpers
|
||||
|
||||
class BuildEnvironment {
|
||||
String testJdkVersion
|
||||
String testJdkLauncherArgs
|
||||
String dbName = 'h2'
|
||||
String node
|
||||
String dbLockableResource
|
||||
boolean dbLockResourceAsHost
|
||||
String additionalOptions
|
||||
String notificationRecipients
|
||||
boolean longRunning
|
||||
|
||||
String toString() { getTag() }
|
||||
String getTag() { "${node ? node + "_" : ''}${testJdkVersion ? 'jdk_' + testJdkVersion + '_' : '' }${dbName}" }
|
||||
}
|
||||
|
||||
void runBuildOnNode(String label, Closure body) {
|
||||
node( label ) {
|
||||
pruneDockerContainers()
|
||||
try {
|
||||
body()
|
||||
}
|
||||
finally {
|
||||
// If this is a PR, we clean the workspace at the end
|
||||
if ( env.CHANGE_BRANCH != null ) {
|
||||
cleanWs()
|
||||
}
|
||||
pruneDockerContainers()
|
||||
}
|
||||
}
|
||||
}
|
||||
void pruneDockerContainers() {
|
||||
if ( !sh( script: 'command -v docker || true', returnStdout: true ).trim().isEmpty() ) {
|
||||
sh 'docker container prune -f || true'
|
||||
sh 'docker image prune -f || true'
|
||||
sh 'docker network prune -f || true'
|
||||
sh 'docker volume prune -f || true'
|
||||
}
|
||||
}
|
||||
|
||||
void handleNotifications(currentBuild, buildEnv) {
|
||||
def currentResult = getParallelResult(currentBuild, buildEnv.tag)
|
||||
boolean success = currentResult == 'SUCCESS' || currentResult == 'UNKNOWN'
|
||||
def previousResult = currentBuild.previousBuild == null ? null : getParallelResult(currentBuild.previousBuild, buildEnv.tag)
|
||||
|
||||
// Ignore success after success
|
||||
if ( !( success && previousResult == 'SUCCESS' ) ) {
|
||||
def subject
|
||||
def body
|
||||
if ( success ) {
|
||||
if ( previousResult != 'SUCCESS' && previousResult != null ) {
|
||||
subject = "${env.JOB_NAME} - Build ${env.BUILD_NUMBER} - Fixed"
|
||||
body = """<p>${env.JOB_NAME} - Build ${env.BUILD_NUMBER} - Fixed:</p>
|
||||
<p>Check console output at <a href='${env.BUILD_URL}'>${env.BUILD_URL}</a> to view the results.</p>"""
|
||||
}
|
||||
else {
|
||||
subject = "${env.JOB_NAME} - Build ${env.BUILD_NUMBER} - Success"
|
||||
body = """<p>${env.JOB_NAME} - Build ${env.BUILD_NUMBER} - Success:</p>
|
||||
<p>Check console output at <a href='${env.BUILD_URL}'>${env.BUILD_URL}</a> to view the results.</p>"""
|
||||
}
|
||||
}
|
||||
else if (currentBuild.rawBuild.getActions(jenkins.model.InterruptedBuildAction.class).isEmpty()) {
|
||||
// If there are interrupted build actions, this means the build was cancelled, probably superseded
|
||||
// Thanks to https://issues.jenkins.io/browse/JENKINS-43339 for the "hack" to determine this
|
||||
if ( currentResult == 'FAILURE' ) {
|
||||
if ( previousResult != null && previousResult == "FAILURE" ) {
|
||||
subject = "${env.JOB_NAME} - Build ${env.BUILD_NUMBER} - Still failing"
|
||||
body = """<p>${env.JOB_NAME} - Build ${env.BUILD_NUMBER} - Still failing:</p>
|
||||
<p>Check console output at <a href='${env.BUILD_URL}'>${env.BUILD_URL}</a> to view the results.</p>"""
|
||||
}
|
||||
else {
|
||||
subject = "${env.JOB_NAME} - Build ${env.BUILD_NUMBER} - Failure"
|
||||
body = """<p>${env.JOB_NAME} - Build ${env.BUILD_NUMBER} - Failure:</p>
|
||||
<p>Check console output at <a href='${env.BUILD_URL}'>${env.BUILD_URL}</a> to view the results.</p>"""
|
||||
}
|
||||
}
|
||||
else {
|
||||
subject = "${env.JOB_NAME} - Build ${env.BUILD_NUMBER} - ${currentResult}"
|
||||
body = """<p>${env.JOB_NAME} - Build ${env.BUILD_NUMBER} - ${currentResult}:</p>
|
||||
<p>Check console output at <a href='${env.BUILD_URL}'>${env.BUILD_URL}</a> to view the results.</p>"""
|
||||
}
|
||||
}
|
||||
|
||||
emailext(
|
||||
subject: subject,
|
||||
body: body,
|
||||
to: buildEnv.notificationRecipients
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@NonCPS
|
||||
String getParallelResult( RunWrapper build, String parallelBranchName ) {
|
||||
def visitor = new PipelineNodeGraphVisitor( build.rawBuild )
|
||||
def branch = visitor.pipelineNodes.find{ it.type == FlowNodeWrapper.NodeType.PARALLEL && parallelBranchName == it.displayName }
|
||||
if ( branch == null ) {
|
||||
echo "Couldn't find parallel branch name '$parallelBranchName'. Available parallel branch names:"
|
||||
visitor.pipelineNodes.findAll{ it.type == FlowNodeWrapper.NodeType.PARALLEL }.each{
|
||||
echo " - ${it.displayName}"
|
||||
}
|
||||
return null;
|
||||
}
|
||||
return branch.status.result
|
||||
}
|
Loading…
Reference in New Issue