#!groovy // // // Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. build_and_test = ''' mkdir -p ${COUCHDB_IO_LOG_DIR} ${platform} cd ${platform} rm -rf build mkdir build cd build tar -xf ${WORKSPACE}/apache-couchdb-*.tar.gz cd apache-couchdb-* ./configure --spidermonkey-version ${sm_ver} make check || (make build-report && false) ''' make_packages = ''' cd ${platform} git clone https://github.com/apache/couchdb-pkg rm -rf couchdb mkdir couchdb cp ${WORKSPACE}/apache-couchdb-*.tar.gz couchdb tar -xf ${WORKSPACE}/apache-couchdb-*.tar.gz -C couchdb cd couchdb-pkg make ''' cleanup_and_save = ''' rm -rf ${WORKSPACE}/pkgs/${platform} mkdir -p ${WORKSPACE}/pkgs/${platform} mv ${WORKSPACE}/${platform}/rpmbuild/RPMS/$(arch)/*rpm ${WORKSPACE}/pkgs/${platform} || true mv ${WORKSPACE}/${platform}/couchdb/*.deb ${WORKSPACE}/pkgs/${platform} || true ''' update_qemu = ''' docker run --rm --privileged multiarch/qemu-user-static --reset -p yes ''' pipeline { // no top-level agent; agents must be declared for each stage agent none environment { COUCHAUTH = credentials('couchdb_vm2_couchdb') recipient = 'notifications@couchdb.apache.org' COUCHDB_IO_LOG_DIR = '/tmp/couchjslogs' // Following fix an issue with git <= 2.6.5 where no committer // name or email are present for reflog, required for git clone GIT_COMMITTER_NAME = 'Jenkins User' GIT_COMMITTER_EMAIL = 'couchdb@apache.org' // https://github.com/jenkins-infra/jenkins.io/blob/master/Jenkinsfile#64 // We need the jenkins user mapped inside of the image // npm config cache below deals with /home/jenkins not mapping correctly // inside the image DOCKER_ARGS = '-e npm_config_cache=npm-cache -e HOME=. -v=/etc/passwd:/etc/passwd -v /etc/group:/etc/group' } options { buildDiscarder(logRotator(numToKeepStr: '10', artifactNumToKeepStr: '10')) // This fails the build immediately if any parallel step fails parallelsAlwaysFailFast() preserveStashes(buildCount: 10) timeout(time: 3, unit: 'HOURS') timestamps() } stages { stage('Build Release Tarball') { agent { docker { label 'docker' image 'apache/couchdbci-debian:buster-erlang-20.3.8.26-1' args "${DOCKER_ARGS}" registryUrl 'https://docker.io/' registryCredentialsId 'dockerhub_creds' } } options { timeout(time: 15, unit: "MINUTES") } steps { sh ''' set rm -rf apache-couchdb-* ./configure make dist chmod -R a+w * . ''' } post { success { stash includes: 'apache-couchdb-*.tar.gz', name: 'tarball' archiveArtifacts artifacts: 'apache-couchdb-*.tar.gz', fingerprint: true } cleanup { // UGH see https://issues.jenkins-ci.org/browse/JENKINS-41894 sh 'rm -rf ${WORKSPACE}/*' } } } // stage Build Release Tarball // TODO Rework once Improved Docker Pipeline Engine is released // https://issues.jenkins-ci.org/browse/JENKINS-47962 // https://issues.jenkins-ci.org/browse/JENKINS-48050 stage('Test and Package') { options { skipDefaultCheckout() timeout(time: 90, unit: "MINUTES") } parallel { stage('FreeBSD') { agent { label 'freebsd' } steps { // deleteDir is OK here because we're not inside of a Docker container! deleteDir() unstash 'tarball' withEnv(['HOME='+pwd()]) { sh ''' mkdir -p $COUCHDB_IO_LOG_DIR # Build CouchDB from tarball & test mkdir build cd build tar -xf $WORKSPACE/apache-couchdb-*.tar.gz cd apache-couchdb-* ./configure gmake check || (build-aux/logfile-uploader.py && false) # No package build for FreeBSD at this time ''' } // withEnv } // steps post { always { junit '**/.eunit/*.xml, **/_build/*/lib/couchdbtest/*.xml, **/src/mango/nosetests.xml, **/test/javascript/junit.xml' } cleanup { sh 'killall -9 beam.smp || true' sh 'rm -rf ${WORKSPACE}/* ${COUCHDB_IO_LOG_DIR} || true' } } // post } // stage FreeBSD stage('macOS') { agent { label 'macos' } steps { // deleteDir is OK here because we're not inside of a Docker container! deleteDir() unstash 'tarball' withEnv(['HOME='+pwd()]) { sh ''' PATH=/usr/local/bin:$PATH export PATH mkdir -p $COUCHDB_IO_LOG_DIR # Build CouchDB from tarball & test mkdir build cd build tar -xzf $WORKSPACE/apache-couchdb-*.tar.gz cd apache-couchdb-* ./configure --spidermonkey-version 60 make check || (build-aux/logfile-uploader.py && false) # No package build for macOS at this time ''' } // withEnv } // steps post { always { junit '**/.eunit/*.xml, **/_build/*/lib/couchdbtest/*.xml, **/src/mango/nosetests.xml, **/test/javascript/junit.xml' } cleanup { sh 'killall -9 beam.smp || true' sh 'rm -rf ${WORKSPACE}/* ${COUCHDB_IO_LOG_DIR} || true' } } // post } // stage macOS stage('CentOS 7') { agent { docker { image 'apache/couchdbci-centos:7-erlang-20.3.8.26-1' label 'docker' args "${DOCKER_ARGS}" registryUrl 'https://docker.io/' registryCredentialsId 'dockerhub_creds' } } environment { platform = 'centos7' sm_ver = '1.8.5' } stages { stage('Build from tarball & test') { steps { unstash 'tarball' sh( script: build_and_test ) } post { always { junit '**/.eunit/*.xml, **/_build/*/lib/couchdbtest/*.xml, **/src/mango/nosetests.xml, **/test/javascript/junit.xml' } } } stage('Build CouchDB packages') { steps { unstash 'tarball' sh( script: make_packages ) sh( script: cleanup_and_save ) } post { success { archiveArtifacts artifacts: 'pkgs/**', fingerprint: true } } } } // stages post { cleanup { sh 'rm -rf ${WORKSPACE}/*' } } // post } // stage stage('CentOS 8') { agent { docker { image 'apache/couchdbci-centos:8-erlang-20.3.8.26-1' label 'docker' args "${DOCKER_ARGS}" registryUrl 'https://docker.io/' registryCredentialsId 'dockerhub_creds' } } environment { platform = 'centos8' sm_ver = '60' } stages { stage('Build from tarball & test') { steps { unstash 'tarball' sh( script: build_and_test ) } post { always { junit '**/.eunit/*.xml, **/_build/*/lib/couchdbtest/*.xml, **/src/mango/nosetests.xml, **/test/javascript/junit.xml' } } } stage('Build CouchDB packages') { steps { unstash 'tarball' sh( script: make_packages ) sh( script: cleanup_and_save ) } post { success { archiveArtifacts artifacts: 'pkgs/**', fingerprint: true } } } } // stages post { cleanup { sh 'rm -rf ${WORKSPACE}/*' } } // post } // stage stage('Ubuntu Xenial') { agent { docker { image 'apache/couchdbci-ubuntu:xenial-erlang-20.3.8.26-1' label 'docker' args "${DOCKER_ARGS}" registryUrl 'https://docker.io/' registryCredentialsId 'dockerhub_creds' } } environment { platform = 'xenial' sm_ver = '1.8.5' } stages { stage('Build from tarball & test') { steps { unstash 'tarball' sh( script: build_and_test ) } post { always { junit '**/.eunit/*.xml, **/_build/*/lib/couchdbtest/*.xml, **/src/mango/nosetests.xml, **/test/javascript/junit.xml' } } } stage('Build CouchDB packages') { steps { sh( script: make_packages ) sh( script: cleanup_and_save ) } post { success { archiveArtifacts artifacts: 'pkgs/**', fingerprint: true } } } } // stages post { cleanup { sh 'rm -rf ${WORKSPACE}/*' } } // post } // stage stage('Ubuntu Bionic') { agent { docker { image 'apache/couchdbci-ubuntu:bionic-erlang-20.3.8.26-1' label 'docker' args "${DOCKER_ARGS}" registryUrl 'https://docker.io/' registryCredentialsId 'dockerhub_creds' } } environment { platform = 'bionic' sm_ver = '1.8.5' } stages { stage('Build from tarball & test') { steps { unstash 'tarball' sh( script: build_and_test ) } post { always { junit '**/.eunit/*.xml, **/_build/*/lib/couchdbtest/*.xml, **/src/mango/nosetests.xml, **/test/javascript/junit.xml' } } } stage('Build CouchDB packages') { steps { sh( script: make_packages ) sh( script: cleanup_and_save ) } post { success { archiveArtifacts artifacts: 'pkgs/**', fingerprint: true } } } } // stages post { cleanup { sh 'rm -rf ${WORKSPACE}/*' } } // post } // stage stage('Ubuntu Focal') { agent { docker { image 'apache/couchdbci-ubuntu:focal-erlang-20.3.8.26-1' label 'docker' args "${DOCKER_ARGS}" registryUrl 'https://docker.io/' registryCredentialsId 'dockerhub_creds' } } environment { platform = 'focal' sm_ver = '68' } stages { stage('Build from tarball & test') { steps { unstash 'tarball' sh( script: build_and_test ) } post { always { junit '**/.eunit/*.xml, **/_build/*/lib/couchdbtest/*.xml, **/src/mango/nosetests.xml, **/test/javascript/junit.xml' } } } stage('Build CouchDB packages') { steps { sh( script: make_packages ) sh( script: cleanup_and_save ) } post { success { archiveArtifacts artifacts: 'pkgs/**', fingerprint: true } } } } // stages post { cleanup { sh 'rm -rf ${WORKSPACE}/*' } } // post } // stage stage('Debian Stretch') { agent { docker { image 'apache/couchdbci-debian:stretch-erlang-20.3.8.26-1' label 'docker' args "${DOCKER_ARGS}" registryUrl 'https://docker.io/' registryCredentialsId 'dockerhub_creds' } } environment { platform = 'stretch' sm_ver = '1.8.5' } stages { stage('Build from tarball & test') { steps { unstash 'tarball' sh( script: build_and_test ) } post { always { junit '**/.eunit/*.xml, **/_build/*/lib/couchdbtest/*.xml, **/src/mango/nosetests.xml, **/test/javascript/junit.xml' } } } stage('Build CouchDB packages') { steps { sh( script: make_packages ) sh( script: cleanup_and_save ) } post { success { archiveArtifacts artifacts: 'pkgs/**', fingerprint: true } } } } // stages post { cleanup { sh 'rm -rf ${WORKSPACE}/*' } } // post } // stage stage('Debian Buster amd64') { agent { docker { image 'apache/couchdbci-debian:buster-erlang-20.3.8.26-1' label 'docker' args "${DOCKER_ARGS}" registryUrl 'https://docker.io/' registryCredentialsId 'dockerhub_creds' } } environment { platform = 'buster' sm_ver = '60' } stages { stage('Build from tarball & test') { steps { unstash 'tarball' sh( script: build_and_test ) } post { always { junit '**/.eunit/*.xml, **/_build/*/lib/couchdbtest/*.xml, **/src/mango/nosetests.xml, **/test/javascript/junit.xml' } } } stage('Build CouchDB packages') { steps { sh( script: make_packages ) sh( script: cleanup_and_save ) } post { success { archiveArtifacts artifacts: 'pkgs/**', fingerprint: true } } } } // stages post { cleanup { sh 'rm -rf ${WORKSPACE}/*' } } // post } // stage stage('Debian Buster arm64v8') { agent { docker { image 'apache/couchdbci-debian:arm64v8-buster-erlang-20.3.8.26-1' label 'arm64v8' args "${DOCKER_ARGS}" registryUrl 'https://docker.io/' registryCredentialsId 'dockerhub_creds' } } environment { platform = 'buster' sm_ver = '1.8.5' } stages { stage('Build from tarball & test') { steps { unstash 'tarball' sh( script: build_and_test ) } post { always { junit '**/.eunit/*.xml, **/_build/*/lib/couchdbtest/*.xml, **/src/mango/nosetests.xml, **/test/javascript/junit.xml' } } } stage('Build CouchDB packages') { steps { sh( script: make_packages ) sh( script: cleanup_and_save ) } post { success { archiveArtifacts artifacts: 'pkgs/**', fingerprint: true } } } } // stages post { cleanup { sh 'rm -rf ${WORKSPACE}/*' } } // post } // stage stage('Debian Buster ppc64le') { agent { docker { image 'apache/couchdbci-debian:ppc64le-buster-erlang-20.3.8.26-1' label 'ppc64le' args "${DOCKER_ARGS}" registryUrl 'https://docker.io/' registryCredentialsId 'dockerhub_creds' } } environment { platform = 'buster' sm_ver = '60' } stages { stage('Build from tarball & test') { steps { unstash 'tarball' sh( script: build_and_test ) } post { always { junit '**/.eunit/*.xml, **/_build/*/lib/couchdbtest/*.xml, **/src/mango/nosetests.xml, **/test/javascript/junit.xml' } } } stage('Build CouchDB packages') { steps { sh( script: make_packages ) sh( script: cleanup_and_save ) } post { success { archiveArtifacts artifacts: 'pkgs/**', fingerprint: true } } } } // stages post { cleanup { sh 'rm -rf ${WORKSPACE}/*' } } // post } // stage // stage('Debian Buster s390x') { // agent { // docker { // image 'apache/couchdbci-debian:s390x-buster-erlang-20.3.8.26-1' // label 's390x' // args "${DOCKER_ARGS}" // registryUrl 'https://docker.io/' // registryCredentialsId 'dockerhub_creds' // } // } // environment { // platform = 'buster' // sm_ver = '60' // } // stages { // stage('Build from tarball & test') { // steps { // unstash 'tarball' // sh( script: build_and_test ) // } // post { // always { // junit '**/.eunit/*.xml, **/_build/*/lib/couchdbtest/*.xml, **/src/mango/nosetests.xml, **/test/javascript/junit.xml' // } // } // } // stage('Build CouchDB packages') { // steps { // sh( script: make_packages ) // sh( script: cleanup_and_save ) // } // post { // success { // archiveArtifacts artifacts: 'pkgs/**', fingerprint: true // } // } // } // } // stages // post { // cleanup { // sh 'rm -rf ${WORKSPACE}/*' // } // } // post // } // stage /* * Example of how to do a qemu-based run, please leave here */ /* stage('Debian Buster arm64v8') { // the process is convoluted to ensure we have the latest qemu static binaries on the node first // before trying to run a foreign docker container type. Alternately ensuring the `update_qemu` // container is run on every Jenkins agent *after every restart of the Docker daemon* would work. agent { any { } } options { timeout(time: 120, unit: "MINUTES") } environment { platform = 'aarch64-debian-stretch' sm_ver = '60' } stages { stage('Install latest qemu binaries') { steps { sh( script: update_qemu ) } } stage('Pull latest docker image') { steps { sh "docker pull apache/couchdbci-debian:arm64v8-buster-erlang-20.3.8.26-1" } } stage('Build from tarball & test & packages') { steps { withDockerContainer(image: "apache/couchdbci-debian:arm64v8-buster-erlang-20.3.8.26-1", args: "${DOCKER_ARGS}") { unstash 'tarball' withEnv(['MIX_HOME='+pwd(), 'HEX_HOME='+pwd()]) { sh( script: build_and_test ) sh( script: make_packages ) sh( script: cleanup_and_save ) } } } post { always { */ // junit '**/.eunit/*.xml, **/_build/*/lib/couchdbtest/*.xml, **/src/mango/nosetests.xml, **/test/javascript/junit.xml' /* } success { archiveArtifacts artifacts: 'pkgs/**', fingerprint: true } } } } // stages post { cleanup { sh 'rm -rf ${WORKSPACE}/*' } } // post } // stage */ } // parallel } // stage "Test and Package" stage('Publish') { when { expression { return env.BRANCH_NAME ==~ /master|2.*.x|3.*.x|4.*.x|jenkins-.*/ } } agent { docker { image 'apache/couchdbci-debian:buster-erlang-20.3.8.26-1' label 'docker' args "${DOCKER_ARGS}" registryUrl 'https://docker.io/' registryCredentialsId 'dockerhub_creds' } } options { skipDefaultCheckout() timeout(time: 90, unit: "MINUTES") } steps { withCredentials([sshUserPrivateKey(credentialsId: 'jenkins-key', keyFileVariable: 'KEY')]) { sh 'rm -rf ${WORKSPACE}/*' unstash 'tarball' unarchive mapping: ['pkgs/' : '.'] echo 'Retrieving & cleaning current repo-nightly tree...' sh ''' rsync -avz -e "ssh -o StrictHostKeyChecking=no -i $KEY" jenkins@repo-nightly.couchdb.org:/var/www/html/$BRANCH_NAME . || mkdir -p $BRANCH_NAME rm -rf $BRANCH_NAME/debian/* $BRANCH_NAME/el6/* $BRANCH_NAME/el7/* $BRANCH_NAME/el8/* mkdir -p $BRANCH_NAME/debian $BRANCH_NAME/el6 $BRANCH_NAME/el7 $BRANCH_NAME/el8 $BRANCH_NAME/source rsync -avz -e "ssh -o StrictHostKeyChecking=no -i $KEY" jenkins@repo-nightly.couchdb.org:/var/www/html/js . ''' echo 'Building Debian repo...' sh ''' git clone https://github.com/apache/couchdb-pkg cp js/debian-stretch/*.deb pkgs/stretch reprepro -b couchdb-pkg/repo includedeb stretch pkgs/stretch/*.deb cp js/debian-buster/*.deb pkgs/stretch reprepro -b couchdb-pkg/repo includedeb buster pkgs/buster/*.deb cp js/ubuntu-xenial/*.deb pkgs/xenial reprepro -b couchdb-pkg/repo includedeb xenial pkgs/xenial/*.deb cp js/ubuntu-bionic/*.deb pkgs/bionic reprepro -b couchdb-pkg/repo includedeb bionic pkgs/bionic/*.deb reprepro -b couchdb-pkg/repo includedeb focal pkgs/focal/*.deb ''' echo 'Building CentOS repos...' sh ''' cp js/centos-7/*rpm pkgs/centos7 cp js/centos-8/*rpm pkgs/centos8 cd pkgs/centos7 && createrepo --database . cd ../centos8 && createrepo --database . ''' echo 'Building tree to upload...' sh ''' mv couchdb-pkg/repo/pool $BRANCH_NAME/debian mv couchdb-pkg/repo/dists $BRANCH_NAME/debian mv pkgs/centos7/* $BRANCH_NAME/el7 mv pkgs/centos8/* $BRANCH_NAME/el8 mv apache-couchdb-*.tar.gz $BRANCH_NAME/source cd $BRANCH_NAME/source ls -1tr | head -n -10 | xargs -d '\n' rm -f -- cd ../.. ''' echo 'rsyncing tree to repo-nightly...' sh ''' rsync -avz --delete -e "ssh -o StrictHostKeyChecking=no -i $KEY" $BRANCH_NAME jenkins@repo-nightly.couchdb.org:/var/www/html rm -rf $BRANCH_NAME couchdb-pkg *.tar.gz ''' } // withCredentials } // steps } // stage } // stages post { success { mail to: "${env.recipient}", replyTo: "${env.recipient}", subject: "[Jenkins] SUCCESS: ${currentBuild.fullDisplayName}", body: "Yay, we passed. ${env.RUN_DISPLAY_URL}" } unstable { mail to: "${env.recipient}", replyTo: "${env.recipient}", subject: "[Jenkins] SUCCESS: ${currentBuild.fullDisplayName}", body: "Eep! Build is unstable... ${env.RUN_DISPLAY_URL}" } failure { mail to: "${env.recipient}", replyTo: "${env.recipient}", subject: "[Jenkins] FAILURE: ${currentBuild.fullDisplayName}", body: "Boo, we failed. ${env.RUN_DISPLAY_URL}" } } } // pipeline