From bb2562b7774caf0b5037c5cd10f5fe07f75ed92f Mon Sep 17 00:00:00 2001 From: Mick Semb Wever Date: Sat, 4 Jul 2020 23:19:17 +0200 Subject: [PATCH] Jenkinsfile fixes for wrong test reports being copied, and reports getting clobbered - copy artifacts from specific build numbers, not lastest stage builds - presend script to avoid threads in the builds mailing list - Suffix "cassandra.testtag" value to the testsuite name, so testsuite elements are separated cleanly patch by Mick Semb Wever; reviewed by Berenguer Blasi for CASSANDRA-15925 --- .jenkins/Jenkinsfile | 326 ++++++++---------- .../CassandraXMLJUnitResultFormatter.java | 4 +- 2 files changed, 138 insertions(+), 192 deletions(-) diff --git a/.jenkins/Jenkinsfile b/.jenkins/Jenkinsfile index 77c111ccff..dc5982ab59 100644 --- a/.jenkins/Jenkinsfile +++ b/.jenkins/Jenkinsfile @@ -37,236 +37,182 @@ pipeline { } } stage('Test') { - parallel { - stage('JVM DTests') { - steps { - warnError('Tests unstable') { - build job: "${env.JOB_NAME}-jvm-dtest" - } - } - post { - success { - warnError('missing test xml files') { - script { - copyTestResults('jvm-dtest') - } - } - } - unstable { - warnError('missing test xml files') { - script { - copyTestResults('jvm-dtest') - } - } - } + 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') } } - stage('units') { - steps { - warnError('Tests unstable') { - build job: "${env.JOB_NAME}-test" + post { + always { + warnError('missing test xml files') { + script { + copyTestResults('jvm-dtest', jvm_dtest.getNumber()) + } } - } - post { - success { - warnError('missing test xml files') { - script { - copyTestResults('test') - } - } - } - unstable { - warnError('missing test xml files') { - script { - copyTestResults('test') - } - } - } } } - stage('long units') { - steps { - warnError('Tests unstable') { - build job: "${env.JOB_NAME}-long-test" - } - } - post { - success { - warnError('missing test xml files') { - script { - copyTestResults('long-test') - } - } - } - unstable { - warnError('missing test xml files') { - script { - copyTestResults('long-test') - } - } - } + } + stage('units') { + steps { + script { + test = build job: "${env.JOB_NAME}-test", propagate: false + if (test.result != 'SUCCESS') unstable('unit test failures') } } - stage('burn') { - steps { - warnError('Tests unstable') { - build job: "${env.JOB_NAME}-test-burn" + post { + always { + warnError('missing test xml files') { + script { + copyTestResults('test', test.getNumber()) + } } } - post { - success { - warnError('missing test xml files') { - script { - copyTestResults('test-burn') - } - } - } - unstable { - warnError('missing test xml files') { - script { - copyTestResults('test-burn') - } - } - } - } } - stage('compression') { - steps { - warnError('Tests unstable') { - build job: "${env.JOB_NAME}-test-compression" + } + stage('long units') { + steps { + script { + long_test = build job: "${env.JOB_NAME}-long-test", propagate: false + if (long_test.result != 'SUCCESS') unstable('long unit test failures') + } + } + post { + always { + warnError('missing test xml files') { + script { + copyTestResults('long-test', long_test.getNumber()) + } } } - post { - success { - warnError('missing test xml files') { - script { - copyTestResults('test-compression') - } - } - } - unstable { - warnError('missing test xml files') { - script { - copyTestResults('test-compression') - } + } + } + stage('burn') { + steps { + script { + burn = build job: "${env.JOB_NAME}-test-burn", propagate: false + if (burn.result != 'SUCCESS') unstable('burn test failures') + } + } + post { + always { + warnError('missing test xml files') { + script { + copyTestResults('test-burn', burn.getNumber()) + } + } + } + } + } + stage('compression') { + steps { + script { + compression = build job: "${env.JOB_NAME}-test-compression", propagate: false + if (compression.result != 'SUCCESS') unstable('compression failures') + } + } + post { + always { + warnError('missing test xml files') { + script { + copyTestResults('test-compression', compression.getNumber()) + } + } + } + } + } + } + } + stage('Distributed Test') { + parallel { + stage('dtest') { + steps { + script { + dtest = build job: "${env.JOB_NAME}-dtest", propagate: false + if (dtest.result != 'SUCCESS') unstable('dtest failures') + } + } + post { + always { + warnError('missing test xml files') { + script { + copyTestResults('dtest', dtest.getNumber()) + } + } + } + } + } + stage('dtest-large') { + steps { + script { + dtest_large = build job: "${env.JOB_NAME}-dtest-large", propagate: false + if (dtest_large.result != 'SUCCESS') unstable('dtest-large failures') + } + } + post { + always { + warnError('missing test xml files') { + script { + copyTestResults('dtest-large', dtest_large.getNumber()) } } } } } - } - stage('Distributed Test') { - parallel { - stage('dtest') { - steps { - warnError('Tests unstable') { - build job: "${env.JOB_NAME}-dtest" - } + stage('dtest-novnode') { + steps { + script { + dtest_novnode = build job: "${env.JOB_NAME}-dtest-novnode", propagate: false + if (dtest_novnode.result != 'SUCCESS') unstable('dtest-novnode failures') } - post { - success { - warnError('missing test xml files') { - script { - copyTestResults('dtest') - } - } - } - unstable { - warnError('missing test xml files') { - script { - copyTestResults('dtest') - } + } + post { + always { + warnError('missing test xml files') { + script { + copyTestResults('dtest-novnode', dtest_novnode.getNumber()) } } } } - stage('dtest-large') { - steps { - warnError('Tests unstable') { - build job: "${env.JOB_NAME}-dtest-large" - } - } - post { - success { - warnError('missing test xml files') { - script { - copyTestResults('dtest-large') - } - } - } - unstable { - warnError('missing test xml files') { - script { - copyTestResults('dtest-large') - } - } - } + } + stage('dtest-offheap') { + steps { + script { + dtest_offheap = build job: "${env.JOB_NAME}-dtest-offheap", propagate: false + if (dtest_offheap.result != 'SUCCESS') unstable('dtest-offheap failures') } } - stage('dtest-novnode') { - steps { - warnError('Tests unstable') { - build job: "${env.JOB_NAME}-dtest-novnode" - } - } - post { - success { - warnError('missing test xml files') { - script { - copyTestResults('dtest-novnode') - } - } - } - unstable { - warnError('missing test xml files') { - script { - copyTestResults('dtest-novnode') - } - } - } - } - } - stage('dtest-offheap') { - steps { - warnError('Tests unstable') { - build job: "${env.JOB_NAME}-dtest-offheap" - } - } - post { - success { - warnError('missing test xml files') { - script { - copyTestResults('dtest-offheap') - } - } - } - unstable { - warnError('missing test xml files') { - script { - copyTestResults('dtest-offheap') - } + post { + always { + warnError('missing test xml files') { + script { + copyTestResults('dtest-offheap', dtest_offheap.getNumber()) } } } } } } + } stage('Summary') { steps { sh "rm -fR cassandra-builds" - sh "git clone https://gitbox.apache.org/repos/asf/cassandra-builds.git" + sh "git clone --depth 1 --single-branch https://gitbox.apache.org/repos/asf/cassandra-builds.git" sh "./cassandra-builds/build-scripts/cassandra-test-report.sh" junit testResults: '**/build/test/**/TEST*.xml,**/cqlshlib.xml,**/nosetests.xml', testDataPublishers: [[$class: 'StabilityTestDataPublisher']] - // the following should fail on any installation other than builds.apache.org + // the following should fail on any installation other than ci-cassandra.apache.org // TODO: keep jenkins infrastructure related settings in `cassandra_job_dsl_seed.groovy` warnError('cannot send notifications') { script { changes = formatChanges(currentBuild.changeSets) echo "changes: ${changes}" } - slackSend channel: '#cassandra-builds', message: ":apache: <${env.BUILD_URL}|${currentBuild.fullDisplayName}> completed: ${currentBuild.result}. ${env.GIT_COMMIT}\n${changes}" - emailext to: 'builds@cassandra.apache.org', subject: "Build complete: ${currentBuild.fullDisplayName} [${currentBuild.result}] ${env.GIT_COMMIT}", body: ''' + slackSend channel: '#cassandra-builds', message: ":apache: <${env.BUILD_URL}|${currentBuild.fullDisplayName}> completed: ${currentBuild.result}. \n${changes}" + emailext to: 'builds@cassandra.apache.org', subject: "Build complete: ${currentBuild.fullDisplayName} [${currentBuild.result}] ${env.GIT_COMMIT}", presendScript: '${FILE,path="cassandra-builds/jenkins-dsl/cassandra_email_presend.groovy"}', body: ''' ------------------------------------------------------------------------------- Build ${ENV,var="JOB_NAME"} #${BUILD_NUMBER} ${BUILD_STATUS} URL: ${BUILD_URL} @@ -290,12 +236,12 @@ ${FILE,path="cassandra-test-report.txt"} } } -def copyTestResults(target) { +def copyTestResults(target, build_number) { step([$class: 'CopyArtifact', projectName: "${env.JOB_NAME}-${target}", optional: true, fingerprintArtifacts: true, - selector: [$class: 'StatusBuildSelector', stable: false], + selector: specific("${build_number}"), target: target]); } diff --git a/test/unit/org/apache/cassandra/CassandraXMLJUnitResultFormatter.java b/test/unit/org/apache/cassandra/CassandraXMLJUnitResultFormatter.java index 066315da3c..40cfe5e288 100644 --- a/test/unit/org/apache/cassandra/CassandraXMLJUnitResultFormatter.java +++ b/test/unit/org/apache/cassandra/CassandraXMLJUnitResultFormatter.java @@ -143,8 +143,8 @@ public class CassandraXMLJUnitResultFormatter implements JUnitResultFormatter, X doc = getDocumentBuilder().newDocument(); rootElement = doc.createElement(TESTSUITE); String n = suite.getName(); -// if (n != null && !tag.isEmpty()) -// n = n + "-" + tag; + if (n != null && !tag.isEmpty()) + n = n + "-" + tag; rootElement.setAttribute(ATTR_NAME, n == null ? UNKNOWN : n); //add the timestamp