diff --git a/.jenkins/Jenkinsfile b/.jenkins/Jenkinsfile index e03366bda0..884c1ffbfe 100644 --- a/.jenkins/Jenkinsfile +++ b/.jenkins/Jenkinsfile @@ -29,37 +29,38 @@ pipeline { stage('Init') { steps { cleanWs() + script { + currentBuild.result='SUCCESS' + } } } stage('Build') { steps { - build job: "${env.JOB_NAME}-artifacts" + script { + def attempt = 1 + retry(2) { + if (attempt > 1) { + sleep(60 * attempt) + } + attempt = attempt + 1 + build job: "${env.JOB_NAME}-artifacts" + } + } } } stage('Test') { parallel { - stage('JVM DTests') { - steps { - script { - jvm_dtest = build job: "${env.JOB_NAME}-jvm-dtest", propagate: false - if (jvm_dtest.result != 'SUCCESS') unstable('jvm-dtest failures') - if (jvm_dtest.result == 'FAILURE') currentBuild.result='FAILURE' - } - } - post { - always { - warnError('missing test xml files') { - script { - copyTestResults('jvm-dtest', jvm_dtest.getNumber()) - } - } - } - } - } stage('units') { steps { script { - test = build job: "${env.JOB_NAME}-test", propagate: false + def attempt = 1 + retry(2) { + if (attempt > 1) { + sleep(60 * attempt) + } + attempt = attempt + 1 + test = build job: "${env.JOB_NAME}-test", propagate: false + } if (test.result != 'SUCCESS') unstable('unit test failures') if (test.result == 'FAILURE') currentBuild.result='FAILURE' } @@ -77,7 +78,14 @@ pipeline { stage('long units') { steps { script { - long_test = build job: "${env.JOB_NAME}-long-test", propagate: false + def attempt = 1 + retry(2) { + if (attempt > 1) { + sleep(60 * attempt) + } + attempt = attempt + 1 + long_test = build job: "${env.JOB_NAME}-long-test", propagate: false + } if (long_test.result != 'SUCCESS') unstable('long unit test failures') if (long_test.result == 'FAILURE') currentBuild.result='FAILURE' } @@ -95,7 +103,14 @@ pipeline { stage('burn') { steps { script { - burn = build job: "${env.JOB_NAME}-test-burn", propagate: false + def attempt = 1 + retry(2) { + if (attempt > 1) { + sleep(60 * attempt) + } + attempt = attempt + 1 + burn = build job: "${env.JOB_NAME}-test-burn", propagate: false + } if (burn.result != 'SUCCESS') unstable('burn test failures') if (burn.result == 'FAILURE') currentBuild.result='FAILURE' } @@ -113,7 +128,14 @@ pipeline { stage('compression') { steps { script { - compression = build job: "${env.JOB_NAME}-test-compression", propagate: false + def attempt = 1 + retry(2) { + if (attempt > 1) { + sleep(60 * attempt) + } + attempt = attempt + 1 + compression = build job: "${env.JOB_NAME}-test-compression", propagate: false + } if (compression.result != 'SUCCESS') unstable('compression failures') if (compression.result == 'FAILURE') currentBuild.result='FAILURE' } @@ -132,10 +154,42 @@ pipeline { } stage('Distributed Test') { parallel { + stage('JVM DTests') { + steps { + script { + def attempt = 1 + retry(2) { + if (attempt > 1) { + sleep(60 * attempt) + } + attempt = attempt + 1 + jvm_dtest = build job: "${env.JOB_NAME}-jvm-dtest", propagate: false + } + if (jvm_dtest.result != 'SUCCESS') unstable('jvm-dtest failures') + if (jvm_dtest.result == 'FAILURE') currentBuild.result='FAILURE' + } + } + post { + always { + warnError('missing test xml files') { + script { + copyTestResults('jvm-dtest', jvm_dtest.getNumber()) + } + } + } + } + } stage('dtest') { steps { script { - dtest = build job: "${env.JOB_NAME}-dtest", propagate: false + def attempt = 1 + retry(2) { + if (attempt > 1) { + sleep(60 * attempt) + } + attempt = attempt + 1 + dtest = build job: "${env.JOB_NAME}-dtest", propagate: false + } if (dtest.result != 'SUCCESS') unstable('dtest failures') if (dtest.result == 'FAILURE') currentBuild.result='FAILURE' } @@ -153,7 +207,14 @@ pipeline { stage('dtest-large') { steps { script { - dtest_large = build job: "${env.JOB_NAME}-dtest-large", propagate: false + def attempt = 1 + retry(2) { + if (attempt > 1) { + sleep(60 * attempt) + } + attempt = attempt + 1 + dtest_large = build job: "${env.JOB_NAME}-dtest-large", propagate: false + } if (dtest_large.result != 'SUCCESS') unstable('dtest-large failures') if (dtest_large.result == 'FAILURE') currentBuild.result='FAILURE' } @@ -171,7 +232,14 @@ pipeline { stage('dtest-novnode') { steps { script { - dtest_novnode = build job: "${env.JOB_NAME}-dtest-novnode", propagate: false + def attempt = 1 + retry(2) { + if (attempt > 1) { + sleep(60 * attempt) + } + attempt = attempt + 1 + dtest_novnode = build job: "${env.JOB_NAME}-dtest-novnode", propagate: false + } if (dtest_novnode.result != 'SUCCESS') unstable('dtest-novnode failures') if (dtest_novnode.result == 'FAILURE') currentBuild.result='FAILURE' } @@ -189,7 +257,14 @@ pipeline { stage('dtest-offheap') { steps { script { - dtest_offheap = build job: "${env.JOB_NAME}-dtest-offheap", propagate: false + def attempt = 1 + retry(2) { + if (attempt > 1) { + sleep(60 * attempt) + } + attempt = attempt + 1 + dtest_offheap = build job: "${env.JOB_NAME}-dtest-offheap", propagate: false + } if (dtest_offheap.result != 'SUCCESS') unstable('dtest-offheap failures') if (dtest_offheap.result == 'FAILURE') currentBuild.result='FAILURE' } @@ -235,14 +310,15 @@ ${FAILED_TESTS,maxTests=500,showMessage=false,showStack=false} For complete test report and logs see https://nightlies.apache.org/cassandra/${JOB_NAME}/${BUILD_NUMBER}/ ''' } - sh "echo \"cassandra-builds at: `git -C cassandra-builds log -1 --pretty=format:'%h %an %ad %s'`\" > builds.head" - sh "find . -type f -name \\*.head -exec cat {} \\;" + sh "echo \"summary) cassandra-builds: `git -C cassandra-builds log -1 --pretty=format:'%H %an %ad %s'`\" > builds.head" + sh "./cassandra-builds/jenkins-dsl/print-shas.sh" sh "xz TESTS-TestSuites.xml" - sh "echo \"For test report and logs see https://nightlies.apache.org/cassandra/${JOB_NAME}/${BUILD_NUMBER}/\"" + sh "wget --retry-connrefused --waitretry=1 \"\${BUILD_URL}/timestamps/?time=HH:mm:ss&timeZone=UTC&appendLog\" -qO - > console.log || echo wget failed" + sh "xz console.log" } post { always { - sshPublisher(publishers: [sshPublisherDesc(configName: 'Nightlies', transfers: [sshTransfer(remoteDirectory: 'cassandra/${JOB_NAME}/${BUILD_NUMBER}/', sourceFiles: 'TESTS-TestSuites.xml.xz')])]) + sshPublisher(publishers: [sshPublisherDesc(configName: 'Nightlies', transfers: [sshTransfer(remoteDirectory: 'cassandra/${JOB_NAME}/${BUILD_NUMBER}/', sourceFiles: 'console.log.xz,TESTS-TestSuites.xml.xz')])]) } } }