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
This commit is contained in:
Mick Semb Wever 2020-07-04 23:19:17 +02:00
parent d584003966
commit bb2562b777
No known key found for this signature in database
GPG Key ID: E91335D77E3E87CB
2 changed files with 138 additions and 192 deletions

326
.jenkins/Jenkinsfile vendored
View File

@ -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}. <https://github.com/apache/cassandra/commit/${env.GIT_COMMIT}|${env.GIT_COMMIT}>\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]);
}

View File

@ -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