mirror of
https://github.com/cloud-hypervisor/cloud-hypervisor.git
synced 2024-08-21 15:31:15 +00:00
If we rely on timeouts at the top level we can get builds being aborted simply because they took too long to be scheduled rather than because the actual integration tests took too long. Signed-off-by: Rob Bradford <robert.bradford@intel.com>
216 lines
5.1 KiB
Groovy
216 lines
5.1 KiB
Groovy
pipeline{
|
|
agent none
|
|
stages {
|
|
stage ('Early checks') {
|
|
agent { node { label 'master' } }
|
|
stages {
|
|
stage ('Check for RFC/WIP builds') {
|
|
when {
|
|
changeRequest comparator: 'REGEXP', title: '.*(rfc|RFC|wip|WIP).*'
|
|
beforeAgent true
|
|
}
|
|
steps {
|
|
error("Failing as this is marked as a WIP or RFC PR.")
|
|
}
|
|
}
|
|
stage ('Cancel older builds') {
|
|
when { not { branch 'master' } }
|
|
steps {
|
|
cancelPreviousBuilds()
|
|
}
|
|
}
|
|
}
|
|
}
|
|
stage ('Build') {
|
|
failFast true
|
|
parallel {
|
|
stage ('Worker build') {
|
|
agent { node { label 'groovy' } }
|
|
stages {
|
|
stage ('Checkout') {
|
|
steps {
|
|
checkout scm
|
|
}
|
|
}
|
|
stage ('Run OpenAPI tests') {
|
|
steps {
|
|
sh "scripts/run_openapi_tests.sh"
|
|
}
|
|
}
|
|
stage ('Run unit tests') {
|
|
steps {
|
|
sh "scripts/dev_cli.sh tests --unit"
|
|
}
|
|
}
|
|
stage ('Run integration tests') {
|
|
options {
|
|
timeout(time: 1, unit: 'HOURS')
|
|
}
|
|
steps {
|
|
sh "scripts/dev_cli.sh tests --integration"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
stage ('AArch64 worker build') {
|
|
agent { node { label 'bionic-arm64' } }
|
|
stages {
|
|
stage ('Checkout') {
|
|
steps {
|
|
checkout scm
|
|
}
|
|
}
|
|
stage ('Run unit tests') {
|
|
steps {
|
|
sh "scripts/dev_cli.sh tests --unit"
|
|
}
|
|
}
|
|
stage ('Run integration tests') {
|
|
options {
|
|
timeout(time: 1, unit: 'HOURS')
|
|
}
|
|
steps {
|
|
sh "scripts/dev_cli.sh tests --integration"
|
|
}
|
|
}
|
|
}
|
|
post {
|
|
always {
|
|
sh "sudo chown -R jenkins.jenkins ${WORKSPACE}"
|
|
deleteDir()
|
|
}
|
|
}
|
|
}
|
|
stage ('Worker build (musl)') {
|
|
agent { node { label 'groovy' } }
|
|
stages {
|
|
stage ('Checkout') {
|
|
steps {
|
|
checkout scm
|
|
}
|
|
}
|
|
stage ('Run unit tests for musl') {
|
|
steps {
|
|
sh "scripts/dev_cli.sh tests --unit --libc musl"
|
|
}
|
|
}
|
|
stage ('Run integration tests for musl') {
|
|
options {
|
|
timeout(time: 1, unit: 'HOURS')
|
|
}
|
|
steps {
|
|
sh "scripts/dev_cli.sh tests --integration --libc musl"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
stage ('Worker build SGX') {
|
|
agent { node { label 'bionic-sgx' } }
|
|
when { branch 'master' }
|
|
stages {
|
|
stage ('Checkout') {
|
|
steps {
|
|
checkout scm
|
|
}
|
|
}
|
|
stage ('Run SGX integration tests') {
|
|
options {
|
|
timeout(time: 1, unit: 'HOURS')
|
|
}
|
|
steps {
|
|
sh "scripts/dev_cli.sh tests --integration-sgx"
|
|
}
|
|
}
|
|
stage ('Run SGX integration tests for musl') {
|
|
options {
|
|
timeout(time: 1, unit: 'HOURS')
|
|
}
|
|
steps {
|
|
sh "scripts/dev_cli.sh tests --integration-sgx --libc musl"
|
|
}
|
|
}
|
|
}
|
|
post {
|
|
always {
|
|
sh "sudo chown -R jenkins.jenkins ${WORKSPACE}"
|
|
deleteDir()
|
|
}
|
|
}
|
|
}
|
|
stage ('Worker build - Windows guest') {
|
|
agent { node { label 'groovy-win' } }
|
|
stages {
|
|
stage ('Checkout') {
|
|
steps {
|
|
checkout scm
|
|
}
|
|
}
|
|
stage ('Download assets') {
|
|
steps {
|
|
sh "mkdir ${env.HOME}/workloads"
|
|
azureDownload(storageCredentialId: 'ch-image-store',
|
|
containerName: 'private-images',
|
|
includeFilesPattern: 'OVMF.fd',
|
|
downloadType: 'container',
|
|
downloadDirLoc: "${env.HOME}/workloads")
|
|
azureDownload(storageCredentialId: 'ch-image-store',
|
|
containerName: 'private-images',
|
|
includeFilesPattern: 'windows-server-2019.raw',
|
|
downloadType: 'container',
|
|
downloadDirLoc: "${env.HOME}/workloads")
|
|
}
|
|
}
|
|
stage ('Run Windows guest integration tests') {
|
|
options {
|
|
timeout(time: 1, unit: 'HOURS')
|
|
}
|
|
steps {
|
|
sh "scripts/dev_cli.sh tests --integration-windows"
|
|
}
|
|
}
|
|
stage ('Run Windows guest integration tests for musl') {
|
|
options {
|
|
timeout(time: 1, unit: 'HOURS')
|
|
}
|
|
steps {
|
|
sh "scripts/dev_cli.sh tests --integration-windows --libc musl"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
post {
|
|
regression {
|
|
script {
|
|
if (env.BRANCH_NAME == 'master') {
|
|
slackSend (color: '#ff0000', message: '"master" branch build is now failing')
|
|
}
|
|
}
|
|
}
|
|
fixed {
|
|
script {
|
|
if (env.BRANCH_NAME == 'master') {
|
|
slackSend (color: '#00ff00', message: '"master" branch build is now fixed')
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
def cancelPreviousBuilds() {
|
|
// Check for other instances of this particular build, cancel any that are older than the current one
|
|
def jobName = env.JOB_NAME
|
|
def currentBuildNumber = env.BUILD_NUMBER.toInteger()
|
|
def currentJob = Jenkins.instance.getItemByFullName(jobName)
|
|
|
|
// Loop through all instances of this particular job/branch
|
|
for (def build : currentJob.builds) {
|
|
if (build.isBuilding() && (build.number.toInteger() < currentBuildNumber)) {
|
|
echo "Older build still queued. Sending kill signal to build number: ${build.number}"
|
|
build.doStop()
|
|
}
|
|
}
|
|
}
|