From a82219200265a34a9216780ebcbcb83904cef7ae Mon Sep 17 00:00:00 2001 From: Christian Beikov Date: Fri, 8 Apr 2022 10:39:36 +0200 Subject: [PATCH] Try to get rid of global state issues in Jenkinsfile --- Jenkinsfile | 147 +++++++++++++++++++++++++++------------------------- 1 file changed, 77 insertions(+), 70 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 19454fbd34..3909ac7442 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -74,10 +74,10 @@ if (currentBuild.getBuildCauses().toString().contains('BranchIndexingCause')) { stage('Build') { Map executions = [:] + Map> state = [:] environments.each { BuildEnvironment buildEnv -> // Don't build environments for newer JDKs when this is a PR - def isNewerJdk = buildEnv.getVersion() != defaultJdk - if ( isNewerJdk ) { + if ( buildEnv.getVersion() != defaultJdk ) { if ( helper.scmSource.pullRequest ) { return } @@ -87,11 +87,13 @@ stage('Build') { // 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=${tool buildEnv.buildJdkTool}", "PATH+JAVA=${tool buildEnv.buildJdkTool}/bin", "TEST_JAVA_HOME=${tool buildEnv.testJdkTool}"]) { - def additionalOptions = "" - if ( isNewerJdk ) { - additionalOptions = " -Ptest.jdk.version=${buildEnv.getTestVersion()} -Porg.gradle.java.installations.paths=${JAVA_HOME},${TEST_JAVA_HOME}" + if ( buildEnv.getVersion() != defaultJdk ) { + state[buildEnv.tag]['additionalOptions'] = " -Ptest.jdk.version=${buildEnv.getTestVersion()} -Porg.gradle.java.installations.paths=${JAVA_HOME},${TEST_JAVA_HOME}"; } - def containerName = null + else { + state[buildEnv.tag]['additionalOptions'] = ""; + } + state[buildEnv.tag]['containerName'] = null; stage('Checkout') { checkout scm } @@ -103,14 +105,14 @@ stage('Build') { docker.image('mysql:8.0.21').pull() } sh "./docker_db.sh mysql_8_0" - containerName = "mysql" + state[buildEnv.tag]['containerName'] = "mysql" break; case "mariadb": docker.withRegistry('https://index.docker.io/v1/', 'hibernateci.hub.docker.com') { docker.image('mariadb:10.5.8').pull() } sh "./docker_db.sh mariadb" - containerName = "mariadb" + state[buildEnv.tag]['containerName'] = "mariadb" break; case "postgresql_9_5": // use the postgis image to enable the PGSQL GIS (spatial) extension @@ -118,7 +120,7 @@ stage('Build') { docker.image('postgis/postgis:9.5-2.5').pull() } sh "./docker_db.sh postgresql_9_5" - containerName = "postgres" + state[buildEnv.tag]['containerName'] = "postgres" break; case "postgresql_13": // use the postgis image to enable the PGSQL GIS (spatial) extension @@ -126,33 +128,33 @@ stage('Build') { docker.image('postgis/postgis:13-3.1').pull() } sh "./docker_db.sh postgresql_13" - containerName = "postgres" + state[buildEnv.tag]['containerName'] = "postgres" break; case "oracle": docker.withRegistry('https://index.docker.io/v1/', 'hibernateci.hub.docker.com') { docker.image('quillbuilduser/oracle-18-xe').pull() } sh "./docker_db.sh oracle_18" - containerName = "oracle" + state[buildEnv.tag]['containerName'] = "oracle" break; case "db2": docker.withRegistry('https://index.docker.io/v1/', 'hibernateci.hub.docker.com') { docker.image('ibmcom/db2:11.5.7.0').pull() } sh "./docker_db.sh db2" - containerName = "db2" + state[buildEnv.tag]['containerName'] = "db2" break; case "mssql": docker.image('mcr.microsoft.com/mssql/server:2017-CU13').pull() sh "./docker_db.sh mssql" - containerName = "mssql" + state[buildEnv.tag]['containerName'] = "mssql" break; case "sybase": docker.withRegistry('https://index.docker.io/v1/', 'hibernateci.hub.docker.com') { docker.image('nguoianphu/docker-sybase').pull() } sh "./docker_db.sh sybase" - containerName = "sybase" + state[buildEnv.tag]['containerName'] = "sybase" break; case "edb": docker.withRegistry('https://containers.enterprisedb.com', 'hibernateci.containers.enterprisedb.com') { @@ -162,7 +164,7 @@ stage('Build') { docker.image('containers.enterprisedb.com/edb/edb-as-lite:v11').pull() } sh "./docker_db.sh edb" - containerName = "edb" + state[buildEnv.tag]['containerName'] = "edb" break; } } @@ -171,88 +173,46 @@ stage('Build') { case "h2": case "derby": case "hsqldb": - runTest("-Pdb=${buildEnv.dbName}${additionalOptions}") + runTest("-Pdb=${buildEnv.dbName}${state[buildEnv.tag]['additionalOptions']}") break; case "mysql8": - runTest("-Pdb=mysql_ci${additionalOptions}") + runTest("-Pdb=mysql_ci${state[buildEnv.tag]['additionalOptions']}") break; case "tidb": - runTest("-Pdb=tidb -DdbHost=localhost:4000${additionalOptions}", 'TIDB') + runTest("-Pdb=tidb -DdbHost=localhost:4000${state[buildEnv.tag]['additionalOptions']}", 'TIDB') break; case "postgresql_9_5": case "postgresql_13": - runTest("-Pdb=pgsql_ci${additionalOptions}") + runTest("-Pdb=pgsql_ci${state[buildEnv.tag]['additionalOptions']}") break; case "oracle": - runTest("-Pdb=oracle_ci -PexcludeTests=**.LockTest.testQueryTimeout*${additionalOptions}") + runTest("-Pdb=oracle_ci -PexcludeTests=**.LockTest.testQueryTimeout*${state[buildEnv.tag]['additionalOptions']}") break; case "oracle_ee": - runTest("-Pdb=oracle_jenkins${additionalOptions}", 'ORACLE_RDS') + runTest("-Pdb=oracle_jenkins${state[buildEnv.tag]['additionalOptions']}", 'ORACLE_RDS') break; case "hana": - runTest("-Pdb=hana_jenkins${additionalOptions}", 'HANA') + runTest("-Pdb=hana_jenkins${state[buildEnv.tag]['additionalOptions']}", 'HANA') break; case "edb": - runTest("-Pdb=edb_ci -DdbHost=localhost:5433${additionalOptions}") + runTest("-Pdb=edb_ci -DdbHost=localhost:5433${state[buildEnv.tag]['additionalOptions']}") break; case "s390x": - runTest("-Pdb=h2${additionalOptions}") + runTest("-Pdb=h2${state[buildEnv.tag]['additionalOptions']}") break; default: - runTest("-Pdb=${buildEnv.dbName}_ci${additionalOptions}") + runTest("-Pdb=${buildEnv.dbName}_ci${state[buildEnv.tag]['additionalOptions']}") break; } } } finally { - if ( containerName != null ) { - sh "docker rm -f ${containerName}" + 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 ) { - boolean success = currentBuild.result == 'SUCCESS' - String previousResult = currentBuild.previousBuild == null ? null : currentBuild.previousBuild.result == 'SUCCESS' - - // 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 = """

${env.JOB_NAME} - Build ${env.BUILD_NUMBER} - Fixed:

-

Check console output at ${env.BUILD_URL} to view the results.

""" - } - else { - subject = "${env.JOB_NAME} - Build ${env.BUILD_NUMBER} - Success" - body = """

${env.JOB_NAME} - Build ${env.BUILD_NUMBER} - Success:

-

Check console output at ${env.BUILD_URL} to view the results.

""" - } - } - else if ( currentBuild.result == 'FAILURE' ) { - if ( previousResult != null && previousResult == "FAILURE" ) { - subject = "${env.JOB_NAME} - Build ${env.BUILD_NUMBER} - Still failing" - body = """

${env.JOB_NAME} - Build ${env.BUILD_NUMBER} - Still failing:

-

Check console output at ${env.BUILD_URL} to view the results.

""" - } - else { - subject = "${env.JOB_NAME} - Build ${env.BUILD_NUMBER} - Failure" - body = """

${env.JOB_NAME} - Build ${env.BUILD_NUMBER} - Failure:

-

Check console output at ${env.BUILD_URL} to view the results.

""" - } - } - else { - subject = "${env.JOB_NAME} - Build ${env.BUILD_NUMBER} - ${currentBuild.result}" - body = """

${env.JOB_NAME} - Build ${env.BUILD_NUMBER} - ${currentBuild.result}:

-

Check console output at ${env.BUILD_URL} to view the results.

""" - } - - emailext( - subject: subject, - body: body, - to: buildEnv.notificationRecipients - ) - } + handleNotifications(currentBuild, buildEnv) } } } @@ -347,4 +307,51 @@ void runTest(String goal, String lockableResource = null, boolean clean = true) finally { junit '**/target/test-results/test/*.xml' } +} + + +void handleNotifications(currentBuild, buildEnv) { + boolean success = currentBuild.result == 'SUCCESS' + String previousResult = currentBuild.previousBuild == null ? null : currentBuild.previousBuild.result == 'SUCCESS' + + // 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 = """

${env.JOB_NAME} - Build ${env.BUILD_NUMBER} - Fixed:

+

Check console output at ${env.BUILD_URL} to view the results.

""" + } + else { + subject = "${env.JOB_NAME} - Build ${env.BUILD_NUMBER} - Success" + body = """

${env.JOB_NAME} - Build ${env.BUILD_NUMBER} - Success:

+

Check console output at ${env.BUILD_URL} to view the results.

""" + } + } + else if ( currentBuild.result == 'FAILURE' ) { + if ( previousResult != null && previousResult == "FAILURE" ) { + subject = "${env.JOB_NAME} - Build ${env.BUILD_NUMBER} - Still failing" + body = """

${env.JOB_NAME} - Build ${env.BUILD_NUMBER} - Still failing:

+

Check console output at ${env.BUILD_URL} to view the results.

""" + } + else { + subject = "${env.JOB_NAME} - Build ${env.BUILD_NUMBER} - Failure" + body = """

${env.JOB_NAME} - Build ${env.BUILD_NUMBER} - Failure:

+

Check console output at ${env.BUILD_URL} to view the results.

""" + } + } + else { + subject = "${env.JOB_NAME} - Build ${env.BUILD_NUMBER} - ${currentBuild.result}" + body = """

${env.JOB_NAME} - Build ${env.BUILD_NUMBER} - ${currentBuild.result}:

+

Check console output at ${env.BUILD_URL} to view the results.

""" + } + + emailext( + subject: subject, + body: body, + to: buildEnv.notificationRecipients + ) + } } \ No newline at end of file