| #!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 --with-curl --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 ${platform} PLATFORM=${platform} |
| ''' |
| |
| 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 'couchdbdev/debian-stretch-erlang-20.3.8.25-1:latest' |
| args "${DOCKER_ARGS}" |
| alwaysPull true |
| } |
| } |
| options { |
| timeout(time: 15, unit: "MINUTES") |
| } |
| steps { |
| sh ''' |
| set |
| rm -rf apache-couchdb-* |
| ./configure --with-curl |
| 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 --with-curl |
| 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 --with-curl --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 6') { |
| agent { |
| docker { |
| image 'couchdbdev/centos-6-erlang-20.3.8.25-1:latest' |
| label 'docker' |
| args "${DOCKER_ARGS}" |
| alwaysPull true |
| } |
| } |
| environment { |
| platform = 'centos6' |
| 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('CentOS 7') { |
| agent { |
| docker { |
| image 'couchdbdev/centos-7-erlang-20.3.8.25-1:latest' |
| label 'docker' |
| args "${DOCKER_ARGS}" |
| alwaysPull true |
| } |
| } |
| 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 'couchdbdev/centos-8-erlang-20.3.8.25-1:latest' |
| label 'docker' |
| args "${DOCKER_ARGS}" |
| alwaysPull true |
| } |
| } |
| 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 'couchdbdev/ubuntu-xenial-erlang-20.3.8.25-1:latest' |
| label 'docker' |
| args "${DOCKER_ARGS}" |
| alwaysPull true |
| } |
| } |
| 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 'couchdbdev/ubuntu-bionic-erlang-20.3.8.25-1:latest' |
| label 'docker' |
| alwaysPull true |
| args "${DOCKER_ARGS}" |
| } |
| } |
| 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('Debian Stretch') { |
| agent { |
| docker { |
| image 'couchdbdev/debian-stretch-erlang-20.3.8.25-1:latest' |
| label 'docker' |
| alwaysPull true |
| args "${DOCKER_ARGS}" |
| } |
| } |
| 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 'couchdbdev/debian-buster-erlang-20.3.8.25-1:latest' |
| label 'docker' |
| alwaysPull true |
| args "${DOCKER_ARGS}" |
| } |
| } |
| 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 'couchdbdev/arm64v8-debian-buster-erlang-20.3.8.25-1:latest' |
| label 'arm64v8' |
| alwaysPull true |
| args "${DOCKER_ARGS}" |
| } |
| } |
| 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 'couchdbdev/ppc64le-debian-buster-erlang-20.3.8.25-1:latest' |
| label 'ppc64le' |
| alwaysPull true |
| args "${DOCKER_ARGS}" |
| } |
| } |
| 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 couchdbdev/arm64v8-debian-buster-erlang-20.3.8.25-1:latest" |
| } |
| } |
| stage('Build from tarball & test & packages') { |
| steps { |
| withDockerContainer(image: "couchdbdev/arm64v8-debian-buster-erlang-20.3.8.25-1:latest", 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 'couchdbdev/debian-buster-erlang-20.3.8.25-1:latest' |
| label 'docker' |
| alwaysPull true |
| args "${DOCKER_ARGS}" |
| } |
| } |
| 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 couchdb-vm2 tree...' |
| sh ''' |
| rsync -avz -e "ssh -o StrictHostKeyChecking=no -i $KEY" jenkins@couchdb-vm2.apache.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@couchdb-vm2.apache.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 stretch 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 |
| ''' |
| |
| echo 'Building CentOS repos...' |
| sh ''' |
| cp js/centos-6/*rpm pkgs/centos6 |
| cp js/centos-7/*rpm pkgs/centos7 |
| cp js/centos-8/*rpm pkgs/centos8 |
| cd pkgs/centos6 && createrepo --database . |
| cd ../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/centos6/* $BRANCH_NAME/el6 |
| 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 couchdb-vm2...' |
| sh ''' |
| rsync -avz --delete -e "ssh -o StrictHostKeyChecking=no -i $KEY" $BRANCH_NAME jenkins@couchdb-vm2.apache.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 |