Jenkinsfile
42f0a0db
 #!groovy
4d7721cd
 pipeline {
a95f16ca
     agent none
0ecd6ab3
 
a95f16ca
     options {
         buildDiscarder(logRotator(daysToKeepStr: '30'))
bf70a597
         timeout(time: 2, unit: 'HOURS')
a95f16ca
         timestamps()
     }
     parameters {
c18f793f
         booleanParam(name: 'unit_validate', defaultValue: true, description: 'amd64 (x86_64) unit tests and vendor check')
cd094422
         booleanParam(name: 'validate_force', defaultValue: false, description: 'force validation steps to be run, even if no changes were detected')
c18f793f
         booleanParam(name: 'amd64', defaultValue: true, description: 'amd64 (x86_64) Build/Test')
5bf33adb
         booleanParam(name: 'rootless', defaultValue: true, description: 'amd64 (x86_64) Build/Test (Rootless mode)')
9d5361de
         booleanParam(name: 'arm64', defaultValue: true, description: 'ARM (arm64) Build/Test')
c18f793f
         booleanParam(name: 's390x', defaultValue: true, description: 'IBM Z (s390x) Build/Test')
         booleanParam(name: 'ppc64le', defaultValue: true, description: 'PowerPC (ppc64le) Build/Test')
039eb05a
         booleanParam(name: 'windowsRS1', defaultValue: false, description: 'Windows 2016 (RS1) Build/Test')
ca3e230b
         booleanParam(name: 'windowsRS5', defaultValue: true, description: 'Windows 2019 (RS5) Build/Test')
d6a91ca7
         booleanParam(name: 'dco', defaultValue: true, description: 'Run the DCO check')
a95f16ca
     }
a28f2a23
     environment {
a2ad56df
         DOCKER_BUILDKIT     = '1'
e856b46c
         DOCKER_EXPERIMENTAL = '1'
781e79d1
         DOCKER_GRAPHDRIVER  = 'overlay2'
a2ad56df
         APT_MIRROR          = 'cdn-fastly.deb.debian.org'
         CHECK_CONFIG_COMMIT = '78405559cfe5987174aa2cb6463b9b2c1b917255'
d723643d
         TESTDEBUG           = '0'
bf70a597
         TIMEOUT             = '120m'
a28f2a23
     }
a95f16ca
     stages {
85bcc524
         stage('pr-hack') {
             when { changeRequest() }
             steps {
                 script {
                     echo "Workaround for PR auto-cancel feature. Borrowed from https://issues.jenkins-ci.org/browse/JENKINS-43353"
                     def buildNumber = env.BUILD_NUMBER as int
                     if (buildNumber > 1) milestone(buildNumber - 1)
                     milestone(buildNumber)
                 }
             }
         }
d6f7909c
         stage('DCO-check') {
             when {
                 beforeAgent true
d6a91ca7
                 expression { params.dco }
d6f7909c
             }
85bcc524
             agent { label 'amd64 && ubuntu-1804 && overlay2' }
d6f7909c
             steps {
                 sh '''
                 docker run --rm \
                   -v "$WORKSPACE:/workspace" \
7c5fd83c
                   -e VALIDATE_REPO=${GIT_URL} \
                   -e VALIDATE_BRANCH=${CHANGE_TARGET} \
                   alpine sh -c 'apk add --no-cache -q bash git openssh-client && cd /workspace && hack/validate/dco'
d6f7909c
                 '''
             }
         }
a95f16ca
         stage('Build') {
             parallel {
f51c1397
                 stage('unit-validate') {
a95f16ca
                     when {
                         beforeAgent true
f51c1397
                         expression { params.unit_validate }
a95f16ca
                     }
                     agent { label 'amd64 && ubuntu-1804 && overlay2' }
cd094422
                     environment {
                         // On master ("non-pull-request"), force running some validation checks (vendor, swagger),
                         // even if no files were changed. This allows catching problems caused by pull-requests
                         // that were merged out-of-sequence.
                         TEST_FORCE_VALIDATE = sh returnStdout: true, script: 'if [ "${BRANCH_NAME%%-*}" != "PR" ] || [ "${CHANGE_TARGET:-master}" != "master" ] || [ "${validate_force}" = "true" ]; then echo "1"; fi'
                     }
4d7721cd
 
79713d8d
                     stages {
38977965
                         stage("Print info") {
                             steps {
                                 sh 'docker version'
                                 sh 'docker info'
a2ad56df
                                 sh '''
                                 echo "check-config.sh version: ${CHECK_CONFIG_COMMIT}"
                                 curl -fsSL -o ${WORKSPACE}/check-config.sh "https://raw.githubusercontent.com/moby/moby/${CHECK_CONFIG_COMMIT}/contrib/check-config.sh" \
                                 && bash ${WORKSPACE}/check-config.sh || true
                                 '''
38977965
                             }
                         }
79713d8d
                         stage("Build dev image") {
                             steps {
6523ced9
                                 sh 'docker build --force-rm --build-arg APT_MIRROR -t docker:${GIT_COMMIT} .'
79713d8d
                             }
                         }
f411be20
                         stage("Validate") {
                             steps {
                                 sh '''
                                 docker run --rm -t --privileged \
                                   -v "$WORKSPACE/bundles:/go/src/github.com/docker/docker/bundles" \
                                   -v "$WORKSPACE/.git:/go/src/github.com/docker/docker/.git" \
                                   --name docker-pr$BUILD_NUMBER \
e856b46c
                                   -e DOCKER_EXPERIMENTAL \
f411be20
                                   -e DOCKER_GITCOMMIT=${GIT_COMMIT} \
                                   -e DOCKER_GRAPHDRIVER \
cd094422
                                   -e TEST_FORCE_VALIDATE \
7019b60d
                                   -e VALIDATE_REPO=${GIT_URL} \
                                   -e VALIDATE_BRANCH=${CHANGE_TARGET} \
f411be20
                                   docker:${GIT_COMMIT} \
                                   hack/validate/default
                                 '''
                             }
                         }
ad28fec1
                         stage("Docker-py") {
                             steps {
                                 sh '''
                                 docker run --rm -t --privileged \
                                   -v "$WORKSPACE/bundles:/go/src/github.com/docker/docker/bundles" \
                                   --name docker-pr$BUILD_NUMBER \
e856b46c
                                   -e DOCKER_EXPERIMENTAL \
ad28fec1
                                   -e DOCKER_GITCOMMIT=${GIT_COMMIT} \
                                   -e DOCKER_GRAPHDRIVER \
7019b60d
                                   -e VALIDATE_REPO=${GIT_URL} \
                                   -e VALIDATE_BRANCH=${CHANGE_TARGET} \
ad28fec1
                                   docker:${GIT_COMMIT} \
                                   hack/make.sh \
4ddb40ee
                                     dynbinary-daemon \
ad28fec1
                                     test-docker-py
                                 '''
                             }
5969bbee
                             post {
                                 always {
                                     junit testResults: 'bundles/test-docker-py/junit-report.xml', allowEmptyResults: true
8b6da9d8
 
                                     sh '''
                                     echo "Ensuring container killed."
                                     docker rm -vf docker-pr$BUILD_NUMBER || true
                                     '''
 
                                     sh '''
                                     echo 'Chowning /workspace to jenkins user'
                                     docker run --rm -v "$WORKSPACE:/workspace" busybox chown -R "$(id -u):$(id -g)" /workspace
                                     '''
 
a76ff632
                                     catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE', message: 'Failed to create bundles.tar.gz') {
                                         sh '''
                                         bundleName=docker-py
                                         echo "Creating ${bundleName}-bundles.tar.gz"
                                         tar -czf ${bundleName}-bundles.tar.gz bundles/test-docker-py/*.xml bundles/test-docker-py/*.log
                                         '''
 
                                         archiveArtifacts artifacts: '*-bundles.tar.gz', allowEmptyArchive: true
                                     }
5969bbee
                                 }
                             }
ad28fec1
                         }
e554fb23
                         stage("Static") {
251c8dca
                             steps {
                                 sh '''
                                 docker run --rm -t --privileged \
                                   -v "$WORKSPACE/bundles:/go/src/github.com/docker/docker/bundles" \
                                   --name docker-pr$BUILD_NUMBER \
                                   -e DOCKER_GITCOMMIT=${GIT_COMMIT} \
                                   -e DOCKER_GRAPHDRIVER \
                                   docker:${GIT_COMMIT} \
                                   hack/make.sh binary-daemon
                                 '''
                             }
                         }
                         stage("Cross") {
                             steps {
                                 sh '''
                                 docker run --rm -t --privileged \
                                   -v "$WORKSPACE/bundles:/go/src/github.com/docker/docker/bundles" \
                                   --name docker-pr$BUILD_NUMBER \
                                   -e DOCKER_GITCOMMIT=${GIT_COMMIT} \
                                   -e DOCKER_GRAPHDRIVER \
                                   docker:${GIT_COMMIT} \
                                   hack/make.sh cross
                                 '''
                             }
                         }
                         // needs to be last stage that calls make.sh for the junit report to work
f51c1397
                         stage("Unit tests") {
79713d8d
                             steps {
                                 sh '''
                                 docker run --rm -t --privileged \
                                   -v "$WORKSPACE/bundles:/go/src/github.com/docker/docker/bundles" \
                                   --name docker-pr$BUILD_NUMBER \
e856b46c
                                   -e DOCKER_EXPERIMENTAL \
be0e6e9d
                                   -e DOCKER_GITCOMMIT=${GIT_COMMIT} \
781e79d1
                                   -e DOCKER_GRAPHDRIVER \
7019b60d
                                   -e VALIDATE_REPO=${GIT_URL} \
                                   -e VALIDATE_BRANCH=${CHANGE_TARGET} \
be0e6e9d
                                   docker:${GIT_COMMIT} \
79713d8d
                                   hack/test/unit
                                 '''
                             }
7f9328ad
                             post {
                                 always {
                                     junit testResults: 'bundles/junit-report.xml', allowEmptyResults: true
                                 }
                             }
79713d8d
                         }
f51c1397
                         stage("Validate vendor") {
                             steps {
                                 sh '''
                                 docker run --rm -t --privileged \
                                   -v "$WORKSPACE/.git:/go/src/github.com/docker/docker/.git" \
f2e09aff
                                   --name docker-pr$BUILD_NUMBER \
e856b46c
                                   -e DOCKER_EXPERIMENTAL \
f51c1397
                                   -e DOCKER_GITCOMMIT=${GIT_COMMIT} \
781e79d1
                                   -e DOCKER_GRAPHDRIVER \
cd094422
                                   -e TEST_FORCE_VALIDATE \
7019b60d
                                   -e VALIDATE_REPO=${GIT_URL} \
                                   -e VALIDATE_BRANCH=${CHANGE_TARGET} \
f51c1397
                                   docker:${GIT_COMMIT} \
                                   hack/validate/vendor
                                 '''
                             }
                         }
a95f16ca
                     }
79713d8d
 
a95f16ca
                     post {
                         always {
                             sh '''
                             echo 'Ensuring container killed.'
                             docker rm -vf docker-pr$BUILD_NUMBER || true
b04c769d
                             '''
 
                             sh '''
a95f16ca
                             echo 'Chowning /workspace to jenkins user'
                             docker run --rm -v "$WORKSPACE:/workspace" busybox chown -R "$(id -u):$(id -g)" /workspace
79713d8d
                             '''
 
a76ff632
                             catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE', message: 'Failed to create bundles.tar.gz') {
                                 sh '''
                                 bundleName=unit
                                 echo "Creating ${bundleName}-bundles.tar.gz"
                                 tar -czvf ${bundleName}-bundles.tar.gz bundles/junit-report.xml bundles/go-test-report.json bundles/profile.out
                                 '''
a0bf935f
 
a76ff632
                                 archiveArtifacts artifacts: '*-bundles.tar.gz', allowEmptyArchive: true
                             }
a0bf935f
                         }
                         cleanup {
                             sh 'make clean'
a95f16ca
                             deleteDir()
                         }
                     }
                 }
c18f793f
                 stage('amd64') {
a95f16ca
                     when {
                         beforeAgent true
c18f793f
                         expression { params.amd64 }
a95f16ca
                     }
                     agent { label 'amd64 && ubuntu-1804 && overlay2' }
4d7721cd
 
79713d8d
                     stages {
38977965
                         stage("Print info") {
                             steps {
                                 sh 'docker version'
                                 sh 'docker info'
a2ad56df
                                 sh '''
                                 echo "check-config.sh version: ${CHECK_CONFIG_COMMIT}"
                                 curl -fsSL -o ${WORKSPACE}/check-config.sh "https://raw.githubusercontent.com/moby/moby/${CHECK_CONFIG_COMMIT}/contrib/check-config.sh" \
                                 && bash ${WORKSPACE}/check-config.sh || true
                                 '''
38977965
                             }
                         }
79713d8d
                         stage("Build dev image") {
                             steps {
                                 sh '''
                                 # todo: include ip_vs in base image
                                 sudo modprobe ip_vs
d6a91ca7
 
be0e6e9d
                                 docker build --force-rm --build-arg APT_MIRROR -t docker:${GIT_COMMIT} .
79713d8d
                                 '''
                             }
                         }
                         stage("Run tests") {
                             steps {
e554fb23
                                 sh '''#!/bin/bash
                                 # bash is needed so 'jobs -p' works properly
                                 # it also accepts setting inline envvars for functions without explicitly exporting
b280ea11
                                 set -x
d6a91ca7
 
e554fb23
                                 run_tests() {
                                         [ -n "$TESTDEBUG" ] && rm= || rm=--rm;
                                         docker run $rm -t --privileged \
3262a69b
                                           -v "$WORKSPACE/bundles/${TEST_INTEGRATION_DEST}:/go/src/github.com/docker/docker/bundles" \
                                           -v "$WORKSPACE/bundles/dynbinary-daemon:/go/src/github.com/docker/docker/bundles/dynbinary-daemon" \
e554fb23
                                           -v "$WORKSPACE/.git:/go/src/github.com/docker/docker/.git" \
                                           --name "$CONTAINER_NAME" \
                                           -e KEEPBUNDLE=1 \
                                           -e TESTDEBUG \
                                           -e TESTFLAGS \
                                           -e TEST_SKIP_INTEGRATION \
                                           -e TEST_SKIP_INTEGRATION_CLI \
                                           -e DOCKER_GITCOMMIT=${GIT_COMMIT} \
                                           -e DOCKER_GRAPHDRIVER \
bf70a597
                                           -e TIMEOUT \
7019b60d
                                           -e VALIDATE_REPO=${GIT_URL} \
                                           -e VALIDATE_BRANCH=${CHANGE_TARGET} \
e554fb23
                                           docker:${GIT_COMMIT} \
                                           hack/make.sh \
                                             "$1" \
                                             test-integration
                                 }
 
                                 trap "exit" INT TERM
                                 trap 'pids=$(jobs -p); echo "Remaining pids to kill: [$pids]"; [ -z "$pids" ] || kill $pids' EXIT
 
                                 CONTAINER_NAME=docker-pr$BUILD_NUMBER
 
79713d8d
                                 docker run --rm -t --privileged \
                                   -v "$WORKSPACE/bundles:/go/src/github.com/docker/docker/bundles" \
                                   -v "$WORKSPACE/.git:/go/src/github.com/docker/docker/.git" \
e554fb23
                                   --name ${CONTAINER_NAME}-build \
e856b46c
                                   -e DOCKER_EXPERIMENTAL \
be0e6e9d
                                   -e DOCKER_GITCOMMIT=${GIT_COMMIT} \
781e79d1
                                   -e DOCKER_GRAPHDRIVER \
be0e6e9d
                                   docker:${GIT_COMMIT} \
f411be20
                                   hack/make.sh \
e554fb23
                                     dynbinary-daemon
 
                                 # flaky + integration
                                 TEST_INTEGRATION_DEST=1 CONTAINER_NAME=${CONTAINER_NAME}-1 TEST_SKIP_INTEGRATION_CLI=1 run_tests test-integration-flaky &
 
                                 # integration-cli first set
f1c1cd43
                                 TEST_INTEGRATION_DEST=2 CONTAINER_NAME=${CONTAINER_NAME}-2 TEST_SKIP_INTEGRATION=1 TESTFLAGS="-test.run Test(DockerSuite|DockerNetworkSuite|DockerHubPullSuite|DockerRegistrySuite|DockerSchema1RegistrySuite|DockerRegistryAuthTokenSuite|DockerRegistryAuthHtpasswdSuite)/" run_tests &
e554fb23
 
                                 # integration-cli second set
f1c1cd43
                                 TEST_INTEGRATION_DEST=3 CONTAINER_NAME=${CONTAINER_NAME}-3 TEST_SKIP_INTEGRATION=1 TESTFLAGS="-test.run Test(DockerSwarmSuite|DockerDaemonSuite|DockerExternalVolumeSuite)/" run_tests &
e554fb23
 
                                 c=0
                                 for job in $(jobs -p); do
                                         wait ${job} || c=$?
                                 done
                                 exit $c
79713d8d
                                 '''
                             }
f3be6b34
                             post {
                                 always {
                                     junit testResults: 'bundles/**/*-report.xml', allowEmptyResults: true
                                 }
                             }
79713d8d
                         }
a95f16ca
                     }
79713d8d
 
a95f16ca
                     post {
                         always {
                             sh '''
                             echo "Ensuring container killed."
f3d8b8ae
                             cids=$(docker ps -aq -f name=docker-pr${BUILD_NUMBER}-*)
                             [ -n "$cids" ] && docker rm -vf $cids || true
b04c769d
                             '''
 
                             sh '''
a95f16ca
                             echo "Chowning /workspace to jenkins user"
                             docker run --rm -v "$WORKSPACE:/workspace" busybox chown -R "$(id -u):$(id -g)" /workspace
                             '''
79713d8d
 
a76ff632
                             catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE', message: 'Failed to create bundles.tar.gz') {
                                 sh '''
c18f793f
                                 bundleName=amd64
a76ff632
                                 echo "Creating ${bundleName}-bundles.tar.gz"
                                 # exclude overlay2 directories
f3be6b34
                                 find bundles -path '*/root/*overlay2' -prune -o -type f \\( -name '*-report.json' -o -name '*.log' -o -name '*.prof' -o -name '*-report.xml' \\) -print | xargs tar -czf ${bundleName}-bundles.tar.gz
a76ff632
                                 '''
a0bf935f
 
a76ff632
                                 archiveArtifacts artifacts: '*-bundles.tar.gz', allowEmptyArchive: true
                             }
a0bf935f
                         }
                         cleanup {
                             sh 'make clean'
a95f16ca
                             deleteDir()
                         }
                     }
                 }
5bf33adb
                 stage('rootless') {
                     when {
                         beforeAgent true
                         expression { params.rootless }
                     }
                     agent { label 'amd64 && ubuntu-1804 && overlay2' }
                     stages {
                         stage("Print info") {
                             steps {
                                 sh 'docker version'
                                 sh 'docker info'
                                 sh '''
                                 echo "check-config.sh version: ${CHECK_CONFIG_COMMIT}"
                                 curl -fsSL -o ${WORKSPACE}/check-config.sh "https://raw.githubusercontent.com/moby/moby/${CHECK_CONFIG_COMMIT}/contrib/check-config.sh" \
                                 && bash ${WORKSPACE}/check-config.sh || true
                                 '''
                             }
                         }
                         stage("Build dev image") {
                             steps {
                                 sh '''
                                 docker build --force-rm --build-arg APT_MIRROR -t docker:${GIT_COMMIT} .
                                 '''
                             }
                         }
                         stage("Integration tests") {
                             environment {
                                 DOCKER_ROOTLESS = '1'
                                 TEST_SKIP_INTEGRATION_CLI = '1'
                             }
                             steps {
                                 sh '''
                                 docker run --rm -t --privileged \
                                   -v "$WORKSPACE/bundles:/go/src/github.com/docker/docker/bundles" \
                                   --name docker-pr$BUILD_NUMBER \
                                   -e DOCKER_GITCOMMIT=${GIT_COMMIT} \
                                   -e DOCKER_GRAPHDRIVER \
                                   -e DOCKER_EXPERIMENTAL \
                                   -e DOCKER_ROOTLESS \
                                   -e TEST_SKIP_INTEGRATION_CLI \
                                   -e TIMEOUT \
                                   -e VALIDATE_REPO=${GIT_URL} \
                                   -e VALIDATE_BRANCH=${CHANGE_TARGET} \
                                   docker:${GIT_COMMIT} \
                                   hack/make.sh \
                                     dynbinary \
                                     test-integration
                                 '''
                             }
                             post {
                                 always {
                                     junit testResults: 'bundles/**/*-report.xml', allowEmptyResults: true
                                 }
                             }
                         }
                     }
 
                     post {
                         always {
                             sh '''
                             echo "Ensuring container killed."
                             docker rm -vf docker-pr$BUILD_NUMBER || true
                             '''
 
                             sh '''
                             echo "Chowning /workspace to jenkins user"
                             docker run --rm -v "$WORKSPACE:/workspace" busybox chown -R "$(id -u):$(id -g)" /workspace
                             '''
 
                             catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE', message: 'Failed to create bundles.tar.gz') {
                                 sh '''
                                 bundleName=amd64-rootless
                                 echo "Creating ${bundleName}-bundles.tar.gz"
                                 # exclude overlay2 directories
                                 find bundles -path '*/root/*overlay2' -prune -o -type f \\( -name '*-report.json' -o -name '*.log' -o -name '*.prof' -o -name '*-report.xml' \\) -print | xargs tar -czf ${bundleName}-bundles.tar.gz
                                 '''
 
                                 archiveArtifacts artifacts: '*-bundles.tar.gz', allowEmptyArchive: true
                             }
                         }
                         cleanup {
                             sh 'make clean'
                             deleteDir()
                         }
                     }
                 }
 
c18f793f
                 stage('s390x') {
a95f16ca
                     when {
                         beforeAgent true
c18f793f
                         expression { params.s390x }
a95f16ca
                     }
c239bbbc
                     agent { label 's390x-ubuntu-1804' }
79713d8d
 
                     stages {
38977965
                         stage("Print info") {
                             steps {
                                 sh 'docker version'
                                 sh 'docker info'
a2ad56df
                                 sh '''
                                 echo "check-config.sh version: ${CHECK_CONFIG_COMMIT}"
                                 curl -fsSL -o ${WORKSPACE}/check-config.sh "https://raw.githubusercontent.com/moby/moby/${CHECK_CONFIG_COMMIT}/contrib/check-config.sh" \
                                 && bash ${WORKSPACE}/check-config.sh || true
                                 '''
38977965
                             }
                         }
79713d8d
                         stage("Build dev image") {
                             steps {
                                 sh '''
c239bbbc
                                 docker build --force-rm --build-arg APT_MIRROR -t docker:${GIT_COMMIT} .
79713d8d
                                 '''
                             }
                         }
1e8ede51
                         stage("Unit tests") {
                             steps {
                                 sh '''
                                 docker run --rm -t --privileged \
                                   -v "$WORKSPACE/bundles:/go/src/github.com/docker/docker/bundles" \
                                   --name docker-pr$BUILD_NUMBER \
e856b46c
                                   -e DOCKER_EXPERIMENTAL \
1e8ede51
                                   -e DOCKER_GITCOMMIT=${GIT_COMMIT} \
                                   -e DOCKER_GRAPHDRIVER \
7019b60d
                                   -e VALIDATE_REPO=${GIT_URL} \
                                   -e VALIDATE_BRANCH=${CHANGE_TARGET} \
1e8ede51
                                   docker:${GIT_COMMIT} \
                                   hack/test/unit
                                 '''
                             }
e2f5b78e
                             post {
                                 always {
                                     junit testResults: 'bundles/junit-report.xml', allowEmptyResults: true
                                 }
                             }
1e8ede51
                         }
                         stage("Integration tests") {
4e2f39cf
                             environment { TEST_SKIP_INTEGRATION_CLI = '1' }
79713d8d
                             steps {
                                 sh '''
                                 docker run --rm -t --privileged \
                                   -v "$WORKSPACE/bundles:/go/src/github.com/docker/docker/bundles" \
f814e046
                                   --name docker-pr$BUILD_NUMBER \
e856b46c
                                   -e DOCKER_EXPERIMENTAL \
f814e046
                                   -e DOCKER_GITCOMMIT=${GIT_COMMIT} \
                                   -e DOCKER_GRAPHDRIVER \
d723643d
                                   -e TESTDEBUG \
4e2f39cf
                                   -e TEST_SKIP_INTEGRATION_CLI \
bf70a597
                                   -e TIMEOUT \
7019b60d
                                   -e VALIDATE_REPO=${GIT_URL} \
                                   -e VALIDATE_BRANCH=${CHANGE_TARGET} \
f814e046
                                   docker:${GIT_COMMIT} \
1e8ede51
                                   hack/make.sh \
                                     dynbinary \
                                     test-integration
79713d8d
                                 '''
                             }
f3be6b34
                             post {
                                 always {
                                     junit testResults: 'bundles/**/*-report.xml', allowEmptyResults: true
                                 }
                             }
79713d8d
                         }
a95f16ca
                     }
79713d8d
 
a95f16ca
                     post {
                         always {
                             sh '''
                             echo "Ensuring container killed."
f2e09aff
                             docker rm -vf docker-pr$BUILD_NUMBER || true
b04c769d
                             '''
 
                             sh '''
a95f16ca
                             echo "Chowning /workspace to jenkins user"
9f0e10fe
                             docker run --rm -v "$WORKSPACE:/workspace" busybox chown -R "$(id -u):$(id -g)" /workspace
a95f16ca
                             '''
79713d8d
 
a76ff632
                             catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE', message: 'Failed to create bundles.tar.gz') {
                                 sh '''
                                 bundleName=s390x-integration
                                 echo "Creating ${bundleName}-bundles.tar.gz"
                                 # exclude overlay2 directories
f3be6b34
                                 find bundles -path '*/root/*overlay2' -prune -o -type f \\( -name '*-report.json' -o -name '*.log' -o -name '*.prof' -o -name '*-report.xml' \\) -print | xargs tar -czf ${bundleName}-bundles.tar.gz
a76ff632
                                 '''
a0bf935f
 
a76ff632
                                 archiveArtifacts artifacts: '*-bundles.tar.gz', allowEmptyArchive: true
                             }
a0bf935f
                         }
                         cleanup {
                             sh 'make clean'
a95f16ca
                             deleteDir()
                         }
                     }
                 }
c18f793f
                 stage('s390x integration-cli') {
bdc1c1a0
                     when {
                         beforeAgent true
e653943e
                         not { changeRequest() }
c18f793f
                         expression { params.s390x }
bdc1c1a0
                     }
c239bbbc
                     agent { label 's390x-ubuntu-1804' }
bdc1c1a0
 
                     stages {
                         stage("Print info") {
                             steps {
                                 sh 'docker version'
                                 sh 'docker info'
                                 sh '''
                                 echo "check-config.sh version: ${CHECK_CONFIG_COMMIT}"
                                 curl -fsSL -o ${WORKSPACE}/check-config.sh "https://raw.githubusercontent.com/moby/moby/${CHECK_CONFIG_COMMIT}/contrib/check-config.sh" \
                                 && bash ${WORKSPACE}/check-config.sh || true
                                 '''
                             }
                         }
                         stage("Build dev image") {
                             steps {
                                 sh '''
c239bbbc
                                 docker build --force-rm --build-arg APT_MIRROR -t docker:${GIT_COMMIT} .
bdc1c1a0
                                 '''
                             }
                         }
                         stage("Integration-cli tests") {
4e2f39cf
                             environment { TEST_SKIP_INTEGRATION = '1' }
bdc1c1a0
                             steps {
                                 sh '''
                                 docker run --rm -t --privileged \
                                   -v "$WORKSPACE/bundles:/go/src/github.com/docker/docker/bundles" \
                                   --name docker-pr$BUILD_NUMBER \
                                   -e DOCKER_GITCOMMIT=${GIT_COMMIT} \
                                   -e DOCKER_GRAPHDRIVER \
4e2f39cf
                                   -e TEST_SKIP_INTEGRATION \
bf70a597
                                   -e TIMEOUT \
7019b60d
                                   -e VALIDATE_REPO=${GIT_URL} \
                                   -e VALIDATE_BRANCH=${CHANGE_TARGET} \
bdc1c1a0
                                   docker:${GIT_COMMIT} \
                                   hack/make.sh \
                                     dynbinary \
                                     test-integration
                                 '''
                             }
f3be6b34
                             post {
                                 always {
                                     junit testResults: 'bundles/**/*-report.xml', allowEmptyResults: true
                                 }
                             }
bdc1c1a0
                         }
                     }
 
                     post {
                         always {
                             sh '''
                             echo "Ensuring container killed."
                             docker rm -vf docker-pr$BUILD_NUMBER || true
                             '''
 
                             sh '''
                             echo "Chowning /workspace to jenkins user"
                             docker run --rm -v "$WORKSPACE:/workspace" busybox chown -R "$(id -u):$(id -g)" /workspace
                             '''
 
a76ff632
                             catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE', message: 'Failed to create bundles.tar.gz') {
                                 sh '''
                                 bundleName=s390x-integration-cli
                                 echo "Creating ${bundleName}-bundles.tar.gz"
                                 # exclude overlay2 directories
f3be6b34
                                 find bundles -path '*/root/*overlay2' -prune -o -type f \\( -name '*-report.json' -o -name '*.log' -o -name '*.prof' -o -name '*-report.xml' \\) -print | xargs tar -czf ${bundleName}-bundles.tar.gz
a76ff632
                                 '''
bdc1c1a0
 
a76ff632
                                 archiveArtifacts artifacts: '*-bundles.tar.gz', allowEmptyArchive: true
                             }
bdc1c1a0
                         }
                         cleanup {
                             sh 'make clean'
                             deleteDir()
                         }
                     }
                 }
c18f793f
                 stage('ppc64le') {
a95f16ca
                     when {
                         beforeAgent true
c18f793f
                         expression { params.ppc64le }
a95f16ca
                     }
                     agent { label 'ppc64le-ubuntu-1604' }
c1102830
                     // ppc64le machines run on Docker 18.06, and buildkit has some
                     // bugs on that version. Build and use buildx instead.
                     environment {
                         USE_BUILDX      = '1'
                         DOCKER_BUILDKIT = '0'
                     }
79713d8d
 
                     stages {
38977965
                         stage("Print info") {
                             steps {
                                 sh 'docker version'
                                 sh 'docker info'
a2ad56df
                                 sh '''
                                 echo "check-config.sh version: ${CHECK_CONFIG_COMMIT}"
                                 curl -fsSL -o ${WORKSPACE}/check-config.sh "https://raw.githubusercontent.com/moby/moby/${CHECK_CONFIG_COMMIT}/contrib/check-config.sh" \
                                 && bash ${WORKSPACE}/check-config.sh || true
                                 '''
38977965
                             }
                         }
79713d8d
                         stage("Build dev image") {
                             steps {
c04ea113
                                 sh '''
                                 make bundles/buildx
                                 bundles/buildx build --load --force-rm --build-arg APT_MIRROR -t docker:${GIT_COMMIT} .
                                 '''
79713d8d
                             }
                         }
1e8ede51
                         stage("Unit tests") {
                             steps {
                                 sh '''
                                 docker run --rm -t --privileged \
                                   -v "$WORKSPACE/bundles:/go/src/github.com/docker/docker/bundles" \
                                   --name docker-pr$BUILD_NUMBER \
e856b46c
                                   -e DOCKER_EXPERIMENTAL \
1e8ede51
                                   -e DOCKER_GITCOMMIT=${GIT_COMMIT} \
                                   -e DOCKER_GRAPHDRIVER \
7019b60d
                                   -e VALIDATE_REPO=${GIT_URL} \
                                   -e VALIDATE_BRANCH=${CHANGE_TARGET} \
1e8ede51
                                   docker:${GIT_COMMIT} \
                                   hack/test/unit
                                 '''
                             }
e2f5b78e
                             post {
                                 always {
                                     junit testResults: 'bundles/junit-report.xml', allowEmptyResults: true
                                 }
                             }
1e8ede51
                         }
                         stage("Integration tests") {
3564b03f
                             environment { TEST_SKIP_INTEGRATION_CLI = '1' }
79713d8d
                             steps {
                                 sh '''
                                 docker run --rm -t --privileged \
                                   -v "$WORKSPACE/bundles:/go/src/github.com/docker/docker/bundles" \
f814e046
                                   --name docker-pr$BUILD_NUMBER \
e856b46c
                                   -e DOCKER_EXPERIMENTAL \
f814e046
                                   -e DOCKER_GITCOMMIT=${GIT_COMMIT} \
                                   -e DOCKER_GRAPHDRIVER \
d723643d
                                   -e TESTDEBUG \
3564b03f
                                   -e TEST_SKIP_INTEGRATION_CLI \
bf70a597
                                   -e TIMEOUT \
7019b60d
                                   -e VALIDATE_REPO=${GIT_URL} \
                                   -e VALIDATE_BRANCH=${CHANGE_TARGET} \
f814e046
                                   docker:${GIT_COMMIT} \
1e8ede51
                                   hack/make.sh \
                                     dynbinary \
                                     test-integration
79713d8d
                                 '''
                             }
f3be6b34
                             post {
                                 always {
                                     junit testResults: 'bundles/**/*-report.xml', allowEmptyResults: true
                                 }
                             }
79713d8d
                         }
a95f16ca
                     }
79713d8d
 
a95f16ca
                     post {
                         always {
                             sh '''
                             echo "Ensuring container killed."
337d03a5
                             docker rm -vf docker-pr$BUILD_NUMBER || true
b04c769d
                             '''
 
                             sh '''
a95f16ca
                             echo "Chowning /workspace to jenkins user"
9f0e10fe
                             docker run --rm -v "$WORKSPACE:/workspace" busybox chown -R "$(id -u):$(id -g)" /workspace
a95f16ca
                             '''
79713d8d
 
a76ff632
                             catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE', message: 'Failed to create bundles.tar.gz') {
                                 sh '''
c18f793f
                                 bundleName=ppc64le-integration
a76ff632
                                 echo "Creating ${bundleName}-bundles.tar.gz"
                                 # exclude overlay2 directories
f3be6b34
                                 find bundles -path '*/root/*overlay2' -prune -o -type f \\( -name '*-report.json' -o -name '*.log' -o -name '*.prof' -o -name '*-report.xml' \\) -print | xargs tar -czf ${bundleName}-bundles.tar.gz
a76ff632
                                 '''
a0bf935f
 
a76ff632
                                 archiveArtifacts artifacts: '*-bundles.tar.gz', allowEmptyArchive: true
                             }
a0bf935f
                         }
                         cleanup {
                             sh 'make clean'
a95f16ca
                             deleteDir()
                         }
                     }
                 }
c18f793f
                 stage('ppc64le integration-cli') {
c2f9d583
                     when {
                         beforeAgent true
e653943e
                         not { changeRequest() }
c18f793f
                         expression { params.ppc64le }
c2f9d583
                     }
                     agent { label 'ppc64le-ubuntu-1604' }
c1102830
                     // ppc64le machines run on Docker 18.06, and buildkit has some
                     // bugs on that version. Build and use buildx instead.
                     environment {
                         USE_BUILDX      = '1'
                         DOCKER_BUILDKIT = '0'
                     }
c2f9d583
 
                     stages {
                         stage("Print info") {
                             steps {
                                 sh 'docker version'
                                 sh 'docker info'
                                 sh '''
                                 echo "check-config.sh version: ${CHECK_CONFIG_COMMIT}"
                                 curl -fsSL -o ${WORKSPACE}/check-config.sh "https://raw.githubusercontent.com/moby/moby/${CHECK_CONFIG_COMMIT}/contrib/check-config.sh" \
                                 && bash ${WORKSPACE}/check-config.sh || true
                                 '''
                             }
                         }
                         stage("Build dev image") {
                             steps {
c04ea113
                                 sh '''
                                 make bundles/buildx
                                 bundles/buildx build --load --force-rm --build-arg APT_MIRROR -t docker:${GIT_COMMIT} .
                                 '''
c2f9d583
                             }
                         }
                         stage("Integration-cli tests") {
3564b03f
                             environment { TEST_SKIP_INTEGRATION = '1' }
c2f9d583
                             steps {
                                 sh '''
                                 docker run --rm -t --privileged \
                                   -v "$WORKSPACE/bundles:/go/src/github.com/docker/docker/bundles" \
                                   --name docker-pr$BUILD_NUMBER \
                                   -e DOCKER_GITCOMMIT=${GIT_COMMIT} \
                                   -e DOCKER_GRAPHDRIVER \
3564b03f
                                   -e TEST_SKIP_INTEGRATION \
bf70a597
                                   -e TIMEOUT \
7019b60d
                                   -e VALIDATE_REPO=${GIT_URL} \
                                   -e VALIDATE_BRANCH=${CHANGE_TARGET} \
c2f9d583
                                   docker:${GIT_COMMIT} \
                                   hack/make.sh \
                                     dynbinary \
                                     test-integration
                                 '''
                             }
f3be6b34
                             post {
                                 always {
                                     junit testResults: 'bundles/**/*-report.xml', allowEmptyResults: true
                                 }
                             }
c2f9d583
                         }
                     }
 
                     post {
                         always {
                             sh '''
                             echo "Ensuring container killed."
                             docker rm -vf docker-pr$BUILD_NUMBER || true
                             '''
 
                             sh '''
                             echo "Chowning /workspace to jenkins user"
                             docker run --rm -v "$WORKSPACE:/workspace" busybox chown -R "$(id -u):$(id -g)" /workspace
                             '''
 
a76ff632
                             catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE', message: 'Failed to create bundles.tar.gz') {
                                 sh '''
c18f793f
                                 bundleName=ppc64le-integration-cli
a76ff632
                                 echo "Creating ${bundleName}-bundles.tar.gz"
                                 # exclude overlay2 directories
f3be6b34
                                 find bundles -path '*/root/*overlay2' -prune -o -type f \\( -name '*-report.json' -o -name '*.log' -o -name '*.prof' -o -name '*-report.xml' \\) -print | xargs tar -czf ${bundleName}-bundles.tar.gz
a76ff632
                                 '''
c2f9d583
 
a76ff632
                                 archiveArtifacts artifacts: '*-bundles.tar.gz', allowEmptyArchive: true
                             }
c2f9d583
                         }
                         cleanup {
                             sh 'make clean'
                             deleteDir()
                         }
                     }
                 }
9d5361de
                 stage('arm64') {
402c7b1b
                     when {
                         beforeAgent true
9d5361de
                         expression { params.arm64 }
402c7b1b
                     }
eda98ad0
                     agent { label 'arm64 && linux' }
86e0c5a0
                     environment {
                         TEST_SKIP_INTEGRATION_CLI = '1'
                     }
 
58d57c76
                     stages {
                         stage("Print info") {
                             steps {
                                 sh 'docker version'
                                 sh 'docker info'
                                 sh '''
                                 echo "check-config.sh version: ${CHECK_CONFIG_COMMIT}"
                                 curl -fsSL -o ${WORKSPACE}/check-config.sh "https://raw.githubusercontent.com/moby/moby/${CHECK_CONFIG_COMMIT}/contrib/check-config.sh" \
                                 && bash ${WORKSPACE}/check-config.sh || true
                                 '''
                             }
                         }
                         stage("Build dev image") {
                             steps {
a0d670e5
                                 sh 'docker build --force-rm --build-arg APT_MIRROR -t docker:${GIT_COMMIT} .'
58d57c76
                             }
                         }
                         stage("Unit tests") {
                             steps {
                                 sh '''
                                 docker run --rm -t --privileged \
                                   -v "$WORKSPACE/bundles:/go/src/github.com/docker/docker/bundles" \
                                   --name docker-pr$BUILD_NUMBER \
a0d670e5
                                   -e DOCKER_EXPERIMENTAL \
58d57c76
                                   -e DOCKER_GITCOMMIT=${GIT_COMMIT} \
                                   -e DOCKER_GRAPHDRIVER \
a0d670e5
                                   -e VALIDATE_REPO=${GIT_URL} \
                                   -e VALIDATE_BRANCH=${CHANGE_TARGET} \
58d57c76
                                   docker:${GIT_COMMIT} \
                                   hack/test/unit
                                 '''
                             }
a0d670e5
                             post {
                                 always {
                                     junit testResults: 'bundles/junit-report.xml', allowEmptyResults: true
                                 }
                             }
58d57c76
                         }
                         stage("Integration tests") {
a0d670e5
                             environment { TEST_SKIP_INTEGRATION_CLI = '1' }
58d57c76
                             steps {
                                 sh '''
                                 docker run --rm -t --privileged \
                                   -v "$WORKSPACE/bundles:/go/src/github.com/docker/docker/bundles" \
                                   --name docker-pr$BUILD_NUMBER \
a0d670e5
                                   -e DOCKER_EXPERIMENTAL \
58d57c76
                                   -e DOCKER_GITCOMMIT=${GIT_COMMIT} \
                                   -e DOCKER_GRAPHDRIVER \
a0d670e5
                                   -e TESTDEBUG \
58d57c76
                                   -e TEST_SKIP_INTEGRATION_CLI \
a0d670e5
                                   -e TIMEOUT \
                                   -e VALIDATE_REPO=${GIT_URL} \
                                   -e VALIDATE_BRANCH=${CHANGE_TARGET} \
58d57c76
                                   docker:${GIT_COMMIT} \
                                   hack/make.sh \
                                     dynbinary \
                                     test-integration
                                 '''
                             }
a0d670e5
                             post {
                                 always {
                                     junit testResults: 'bundles/**/*-report.xml', allowEmptyResults: true
                                 }
                             }
58d57c76
                         }
402c7b1b
                     }
a0d670e5
 
402c7b1b
                     post {
                         always {
                             sh '''
                             echo "Ensuring container killed."
86e0c5a0
                             docker rm -vf docker-pr$BUILD_NUMBER || true
                             '''
402c7b1b
 
86e0c5a0
                             sh '''
402c7b1b
                             echo "Chowning /workspace to jenkins user"
86e0c5a0
                             docker run --rm -v "$WORKSPACE:/workspace" busybox chown -R "$(id -u):$(id -g)" /workspace
402c7b1b
                             '''
86e0c5a0
 
a0d670e5
                             catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE', message: 'Failed to create bundles.tar.gz') {
                                 sh '''
                                 bundleName=arm64-integration
                                 echo "Creating ${bundleName}-bundles.tar.gz"
                                 # exclude overlay2 directories
                                 find bundles -path '*/root/*overlay2' -prune -o -type f \\( -name '*-report.json' -o -name '*.log' -o -name '*.prof' -o -name '*-report.xml' \\) -print | xargs tar -czf ${bundleName}-bundles.tar.gz
                                 '''
86e0c5a0
 
a0d670e5
                                 archiveArtifacts artifacts: '*-bundles.tar.gz', allowEmptyArchive: true
                             }
402c7b1b
                         }
58d57c76
                         cleanup {
                             sh 'make clean'
                             deleteDir()
                         }
402c7b1b
                     }
                 }
c18f793f
                 stage('win-RS1') {
a95f16ca
                     when {
                         beforeAgent true
039eb05a
                         // Skip this stage on PRs unless the windowsRS1 checkbox is selected
                         anyOf {
                             not { changeRequest() }
                             expression { params.windowsRS1 }
                         }
a95f16ca
                     }
ca3e230b
                     environment {
                         DOCKER_BUILDKIT        = '0'
1fbadd76
                         DOCKER_DUT_DEBUG       = '1'
ca3e230b
                         SKIP_VALIDATION_TESTS  = '1'
                         SOURCES_DRIVE          = 'd'
                         SOURCES_SUBDIR         = 'gopath'
                         TESTRUN_DRIVE          = 'd'
48662075
                         TESTRUN_SUBDIR         = "CI"
ca3e230b
                         WINDOWS_BASE_IMAGE     = 'mcr.microsoft.com/windows/servercore'
                         WINDOWS_BASE_IMAGE_TAG = 'ltsc2016'
                     }
a95f16ca
                     agent {
                         node {
ca3e230b
                             customWorkspace 'd:\\gopath\\src\\github.com\\docker\\docker'
                             label 'windows-2016'
a95f16ca
                         }
                     }
79713d8d
                     stages {
38977965
                         stage("Print info") {
                             steps {
                                 sh 'docker version'
                                 sh 'docker info'
                             }
                         }
79713d8d
                         stage("Run tests") {
                             steps {
                                 powershell '''
                                 $ErrorActionPreference = 'Stop'
ca3e230b
                                 [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
b323c6e9
                                 Invoke-WebRequest https://github.com/moby/docker-ci-zap/blob/master/docker-ci-zap.exe?raw=true -OutFile C:/Windows/System32/docker-ci-zap.exe
ca3e230b
                                 ./hack/ci/windows.ps1
79713d8d
                                 exit $LastExitCode
                                 '''
                             }
                         }
a95f16ca
                     }
6ee61f54
                     post {
                         always {
8d2e1ee5
                             junit testResults: 'bundles/junit-report-*.xml', allowEmptyResults: true
6ee61f54
                             catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE', message: 'Failed to create bundles.tar.gz') {
                                 powershell '''
82b5ff80
                                 cd $env:WORKSPACE
6ee61f54
                                 $bundleName="windowsRS1-integration"
                                 Write-Host -ForegroundColor Green "Creating ${bundleName}-bundles.zip"
 
                                 # archiveArtifacts does not support env-vars to , so save the artifacts in a fixed location
82b5ff80
                                 Compress-Archive -Path "bundles/CIDUT.out", "bundles/CIDUT.err", "bundles/junit-report-*.xml" -CompressionLevel Optimal -DestinationPath "${bundleName}-bundles.zip"
6ee61f54
                                 '''
 
                                 archiveArtifacts artifacts: '*-bundles.zip', allowEmptyArchive: true
                             }
                         }
                         cleanup {
                             sh 'make clean'
                             deleteDir()
                         }
                     }
a95f16ca
                 }
c18f793f
                 stage('win-RS5') {
a95f16ca
                     when {
                         beforeAgent true
                         expression { params.windowsRS5 }
                     }
ca3e230b
                     environment {
                         DOCKER_BUILDKIT        = '0'
1fbadd76
                         DOCKER_DUT_DEBUG       = '1'
ca3e230b
                         SKIP_VALIDATION_TESTS  = '1'
                         SOURCES_DRIVE          = 'd'
                         SOURCES_SUBDIR         = 'gopath'
                         TESTRUN_DRIVE          = 'd'
48662075
                         TESTRUN_SUBDIR         = "CI"
ca3e230b
                         WINDOWS_BASE_IMAGE     = 'mcr.microsoft.com/windows/servercore'
8a52139a
                         WINDOWS_BASE_IMAGE_TAG = 'ltsc2019'
ca3e230b
                     }
a95f16ca
                     agent {
                         node {
ca3e230b
                             customWorkspace 'd:\\gopath\\src\\github.com\\docker\\docker'
                             label 'windows-2019'
a95f16ca
                         }
                     }
79713d8d
                     stages {
38977965
                         stage("Print info") {
                             steps {
                                 sh 'docker version'
                                 sh 'docker info'
                             }
                         }
79713d8d
                         stage("Run tests") {
                             steps {
                                 powershell '''
                                 $ErrorActionPreference = 'Stop'
b323c6e9
                                 Invoke-WebRequest https://github.com/moby/docker-ci-zap/blob/master/docker-ci-zap.exe?raw=true -OutFile C:/Windows/System32/docker-ci-zap.exe
ca3e230b
                                 ./hack/ci/windows.ps1
79713d8d
                                 exit $LastExitCode
                                 '''
                             }
                         }
a95f16ca
                     }
6ee61f54
                     post {
                         always {
8d2e1ee5
                             junit testResults: 'bundles/junit-report-*.xml', allowEmptyResults: true
6ee61f54
                             catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE', message: 'Failed to create bundles.tar.gz') {
                                 powershell '''
82b5ff80
                                 cd $env:WORKSPACE
6ee61f54
                                 $bundleName="windowsRS5-integration"
                                 Write-Host -ForegroundColor Green "Creating ${bundleName}-bundles.zip"
 
                                 # archiveArtifacts does not support env-vars to , so save the artifacts in a fixed location
82b5ff80
                                 Compress-Archive -Path "bundles/CIDUT.out", "bundles/CIDUT.err", "bundles/junit-report-*.xml" -CompressionLevel Optimal -DestinationPath "${bundleName}-bundles.zip"
6ee61f54
                                 '''
 
                                 archiveArtifacts artifacts: '*-bundles.zip', allowEmptyArchive: true
                             }
                         }
                         cleanup {
                             sh 'make clean'
                             deleteDir()
                         }
                     }
a95f16ca
                 }
4d7721cd
             }
         }
     }
9d98458f
 }