Jenkinsfile 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. #!groovy
  2. pipeline {
  3. agent none
  4. options {
  5. buildDiscarder(logRotator(daysToKeepStr: '30'))
  6. timeout(time: 2, unit: 'HOURS')
  7. timestamps()
  8. }
  9. parameters {
  10. booleanParam(name: 'arm64', defaultValue: true, description: 'ARM (arm64) Build/Test')
  11. booleanParam(name: 'dco', defaultValue: true, description: 'Run the DCO check')
  12. }
  13. environment {
  14. DOCKER_BUILDKIT = '1'
  15. DOCKER_EXPERIMENTAL = '1'
  16. DOCKER_GRAPHDRIVER = 'overlay2'
  17. CHECK_CONFIG_COMMIT = '33a3680e08d1007e72c3b3f1454f823d8e9948ee'
  18. TESTDEBUG = '0'
  19. TIMEOUT = '120m'
  20. }
  21. stages {
  22. stage('pr-hack') {
  23. when { changeRequest() }
  24. steps {
  25. script {
  26. echo "Workaround for PR auto-cancel feature. Borrowed from https://issues.jenkins-ci.org/browse/JENKINS-43353"
  27. def buildNumber = env.BUILD_NUMBER as int
  28. if (buildNumber > 1) milestone(buildNumber - 1)
  29. milestone(buildNumber)
  30. }
  31. }
  32. }
  33. stage('DCO-check') {
  34. when {
  35. beforeAgent true
  36. expression { params.dco }
  37. }
  38. agent { label 'arm64 && ubuntu-2004' }
  39. steps {
  40. sh '''
  41. docker run --rm \
  42. -v "$WORKSPACE:/workspace" \
  43. -e VALIDATE_REPO=${GIT_URL} \
  44. -e VALIDATE_BRANCH=${CHANGE_TARGET} \
  45. alpine sh -c 'apk add --no-cache -q bash git openssh-client && git config --system --add safe.directory /workspace && cd /workspace && hack/validate/dco'
  46. '''
  47. }
  48. }
  49. stage('Build') {
  50. parallel {
  51. stage('arm64') {
  52. when {
  53. beforeAgent true
  54. expression { params.arm64 }
  55. }
  56. agent { label 'arm64 && ubuntu-2004' }
  57. environment {
  58. TEST_SKIP_INTEGRATION_CLI = '1'
  59. }
  60. stages {
  61. stage("Print info") {
  62. steps {
  63. sh 'docker version'
  64. sh 'docker info'
  65. sh '''
  66. echo "check-config.sh version: ${CHECK_CONFIG_COMMIT}"
  67. curl -fsSL -o ${WORKSPACE}/check-config.sh "https://raw.githubusercontent.com/moby/moby/${CHECK_CONFIG_COMMIT}/contrib/check-config.sh" \
  68. && bash ${WORKSPACE}/check-config.sh || true
  69. '''
  70. }
  71. }
  72. stage("Build dev image") {
  73. steps {
  74. sh 'docker build --force-rm -t docker:${GIT_COMMIT} .'
  75. }
  76. }
  77. stage("Unit tests") {
  78. steps {
  79. sh '''
  80. sudo modprobe ip6table_filter
  81. '''
  82. sh '''
  83. docker run --rm -t --privileged \
  84. -v "$WORKSPACE/bundles:/go/src/github.com/docker/docker/bundles" \
  85. --name docker-pr$BUILD_NUMBER \
  86. -e DOCKER_EXPERIMENTAL \
  87. -e DOCKER_GITCOMMIT=${GIT_COMMIT} \
  88. -e DOCKER_GRAPHDRIVER \
  89. -e VALIDATE_REPO=${GIT_URL} \
  90. -e VALIDATE_BRANCH=${CHANGE_TARGET} \
  91. docker:${GIT_COMMIT} \
  92. hack/test/unit
  93. '''
  94. }
  95. post {
  96. always {
  97. junit testResults: 'bundles/junit-report*.xml', allowEmptyResults: true
  98. }
  99. }
  100. }
  101. stage("Integration tests") {
  102. environment { TEST_SKIP_INTEGRATION_CLI = '1' }
  103. steps {
  104. sh '''
  105. docker run --rm -t --privileged \
  106. -v "$WORKSPACE/bundles:/go/src/github.com/docker/docker/bundles" \
  107. --name docker-pr$BUILD_NUMBER \
  108. -e DOCKER_EXPERIMENTAL \
  109. -e DOCKER_GITCOMMIT=${GIT_COMMIT} \
  110. -e DOCKER_GRAPHDRIVER \
  111. -e TESTDEBUG \
  112. -e TEST_INTEGRATION_USE_SNAPSHOTTER \
  113. -e TEST_SKIP_INTEGRATION_CLI \
  114. -e TIMEOUT \
  115. -e VALIDATE_REPO=${GIT_URL} \
  116. -e VALIDATE_BRANCH=${CHANGE_TARGET} \
  117. docker:${GIT_COMMIT} \
  118. hack/make.sh \
  119. dynbinary \
  120. test-integration
  121. '''
  122. }
  123. post {
  124. always {
  125. junit testResults: 'bundles/**/*-report.xml', allowEmptyResults: true
  126. }
  127. }
  128. }
  129. }
  130. post {
  131. always {
  132. sh '''
  133. echo "Ensuring container killed."
  134. docker rm -vf docker-pr$BUILD_NUMBER || true
  135. '''
  136. sh '''
  137. echo "Chowning /workspace to jenkins user"
  138. docker run --rm -v "$WORKSPACE:/workspace" busybox chown -R "$(id -u):$(id -g)" /workspace
  139. '''
  140. catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE', message: 'Failed to create bundles.tar.gz') {
  141. sh '''
  142. bundleName=arm64-integration
  143. echo "Creating ${bundleName}-bundles.tar.gz"
  144. # exclude overlay2 directories
  145. 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
  146. '''
  147. archiveArtifacts artifacts: '*-bundles.tar.gz', allowEmptyArchive: true
  148. }
  149. }
  150. cleanup {
  151. sh 'make clean'
  152. deleteDir()
  153. }
  154. }
  155. }
  156. }
  157. }
  158. }
  159. }