pipeline{ agent none stages { stage ('Master build') { 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') { steps { cancelPreviousBuilds() } } stage ('Checkout') { steps { checkout scm } } stage ('Run Cargo tests') { steps { sh "scripts/dev_cli.sh tests --cargo" } } stage ('Run unit tests') { steps { sh "scripts/dev_cli.sh tests --unit" } } stage ('Run OpenAPI tests') { steps { sh "scripts/run_openapi_tests.sh" } } } } stage ('Worker build') { agent { node { label 'bionic' } } options { timeout(time: 1, unit: 'HOURS') } stages { stage ('Checkout') { steps { checkout scm } } stage ('Install system packages') { steps { sh "sudo DEBIAN_FRONTEND=noninteractive apt-get install -yq build-essential mtools libssl-dev pkg-config" sh "sudo apt-get install -yq flex bison libelf-dev qemu-utils qemu-system libglib2.0-dev libpixman-1-dev libseccomp-dev libcap-ng-dev socat" } } stage ('Install Rust') { steps { sh "nohup curl https://sh.rustup.rs -sSf | sh -s -- -y" } } stage ('Run integration tests') { steps { sh "sudo mount -t tmpfs tmpfs /tmp" sh "scripts/run_integration_tests.sh" } } } } } } 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() } } }