timeout(time: 6, unit: 'HOURS') { node('kitchen-slave') { timestamps { ansiColor('xterm') { withEnv([ 'SALT_KITCHEN_PLATFORMS=/var/jenkins/workspace/nox-platforms.yml', 'SALT_KITCHEN_VERIFIER=/var/jenkins/workspace/nox-verifier.yml', 'SALT_KITCHEN_DRIVER=/var/jenkins/workspace/driver.yml', 'NOX_ENV_NAME=runtests-zeromq', 'NOX_PASSTHROUGH_OPTS=--ssh-tests', 'NOX_ENABLE_FROM_FILENAMES=true', 'GOLDEN_IMAGES_CI_BRANCH=2017.7', 'CODECOV_FLAGS=ubuntu1604,py3', 'PATH=/usr/local/rbenv/shims/:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin', 'RBENV_VERSION=2.4.2', 'TEST_SUITE=py3', 'TEST_PLATFORM=ubuntu-1604', 'PY_COLORS=1', ]) { stage('checkout-scm') { cleanWs notFailBuild: true checkout scm } try { stage('github-pending') { githubNotify credentialsId: 'test-jenkins-credentials', description: "running ${TEST_SUITE}-${TEST_PLATFORM}...", status: 'PENDING', context: "jenkins/pr/${TEST_SUITE}-${TEST_PLATFORM}" } stage('setup-bundle') { sh 'bundle install --with ec2 windows --without opennebula docker' } try { stage('run kitchen') { withCredentials([ [$class: 'AmazonWebServicesCredentialsBinding', accessKeyVariable: 'AWS_ACCESS_KEY_ID', credentialsId: 'AWS_ACCESS_KEY_ID', secretKeyVariable: 'AWS_SECRET_ACCESS_KEY'] ]) { sshagent(credentials: ['jenkins-testing-ssh-key']) { sh 'ssh-add ~/.ssh/jenkins-testing.pem' sh 'bundle exec kitchen converge $TEST_SUITE-$TEST_PLATFORM || bundle exec kitchen converge $TEST_SUITE-$TEST_PLATFORM' sh 'bundle exec kitchen verify $TEST_SUITE-$TEST_PLATFORM' } } } } finally { stage('cleanup kitchen') { script { withCredentials([ [$class: 'AmazonWebServicesCredentialsBinding', accessKeyVariable: 'AWS_ACCESS_KEY_ID', credentialsId: 'AWS_ACCESS_KEY_ID', secretKeyVariable: 'AWS_SECRET_ACCESS_KEY'] ]) { sshagent(credentials: ['jenkins-testing-ssh-key']) { sh 'ssh-add ~/.ssh/jenkins-testing.pem' sh 'bundle exec kitchen destroy $TEST_SUITE-$TEST_PLATFORM' } } } archiveArtifacts artifacts: 'artifacts/*,artifacts/**/*' } stage('report code coverage') { script { withCredentials([[$class: 'StringBinding', credentialsId: 'codecov-upload-token-salt', variable: 'CODECOV_TOKEN']]) { sh ''' if [ -f artifacts/coverage/coverage.xml ]; then curl -L https://codecov.io/bash | /bin/sh -s -- -R $(pwd) -s artifacts/coverage/ -F "${CODECOV_FLAGS}" fi ''' } } } } } catch (Exception e) { currentBuild.result = 'FAILURE' } finally { try { junit 'artifacts/xml-unittests-output/*.xml' } finally { cleanWs notFailBuild: true def currentResult = currentBuild.result ?: 'SUCCESS' if (currentResult == 'SUCCESS') { githubNotify credentialsId: 'test-jenkins-credentials', description: "The ${TEST_SUITE}-${TEST_PLATFORM} job has passed", status: 'SUCCESS', context: "jenkins/pr/${TEST_SUITE}-${TEST_PLATFORM}" } else { githubNotify credentialsId: 'test-jenkins-credentials', description: "The ${TEST_SUITE}-${TEST_PLATFORM} job has failed", status: 'FAILURE', context: "jenkins/pr/${TEST_SUITE}-${TEST_PLATFORM}" try { slackSend channel: "#jenkins-prod-pr", color: '#FF0000', message: "FAILED: PR-Job: '${env.JOB_NAME} [${env.BUILD_NUMBER}]' (${env.BUILD_URL})" } catch (Exception e) { sh 'echo Failed to send the Slack notification' } } } } } } } } }