#!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 ${ERLANG_VERSION} cd ${ERLANG_VERSION} rm -rf build mkdir build cd build tar -xf ${WORKSPACE}/apache-couchdb-*.tar.gz cd apache-couchdb-* ./configure --enable-nouveau make check || (make build-report && false) ''' docs_changed = "git diff --name-only origin/${env.CHANGE_TARGET} | grep -q '^src/docs/'" other_changes = "git diff --name-only origin/${env.CHANGE_TARGET} | grep -q -v '^src/docs/'" pipeline { // no top-level agent; agents must be declared for each stage agent none environment { recipient = 'notifications@couchdb.apache.org' // 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' // Parameters for the matrix build DOCKER_IMAGE_BASE = 'apache/couchdbci-debian:bullseye-erlang' // 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' // *** BE SURE TO ALSO CHANGE THE ERLANG VERSIONS FARTHER DOWN *** // Search for ERLANG_VERSION // see https://issues.jenkins.io/browse/JENKINS-61047 for why this cannot // be done parametrically LOW_ERLANG_VER = '23.3.4.18' } 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('Setup Env') { agent { docker { image "${DOCKER_IMAGE_BASE}-${LOW_ERLANG_VER}" label 'docker' args "${DOCKER_ARGS}" registryUrl 'https://docker.io/' registryCredentialsId 'dockerhub_creds' } } options { timeout(time: 10, unit: 'MINUTES') } steps { script { env.DOCS_CHANGED = '0' env.ONLY_DOCS_CHANGED = '0' if ( sh(returnStatus: true, script: docs_changed) == 0 ) { env.DOCS_CHANGED = '1' if (sh(returnStatus: true, script: other_changes) == 1) { env.ONLY_DOCS_CHANGED = '1' } } } } post { cleanup { // UGH see https://issues.jenkins-ci.org/browse/JENKINS-41894 sh 'rm -rf ${WORKSPACE}/*' } } } // stage 'Setup Environment' stage('Docs Check') { // Run docs `make check` stage if any docs changed when { beforeOptions true expression { DOCS_CHANGED == '1' } } agent { docker { image "${DOCKER_IMAGE_BASE}-${LOW_ERLANG_VER}" label 'docker' args "${DOCKER_ARGS}" registryUrl 'https://docker.io/' registryCredentialsId 'dockerhub_creds' } } options { timeout(time: 15, unit: 'MINUTES') } steps { sh ''' make python-black ''' sh ''' (cd src/docs && make check) ''' } post { cleanup { // UGH see https://issues.jenkins-ci.org/browse/JENKINS-41894 sh 'rm -rf ${WORKSPACE}/*' } } } // stage Docs Check stage('Build Docs') { // Build docs separately if only docs changed. If there are other changes, docs are // already built as part of `make dist` when { beforeOptions true expression { ONLY_DOCS_CHANGED == '1' } } agent { docker { image "${DOCKER_IMAGE_BASE}-${LOW_ERLANG_VER}" label 'docker' args "${DOCKER_ARGS}" registryUrl 'https://docker.io/' registryCredentialsId 'dockerhub_creds' } } options { timeout(time: 30, unit: 'MINUTES') } steps { sh ''' (cd src/docs && ./setup.sh ; make html) ''' } post { cleanup { // UGH see https://issues.jenkins-ci.org/browse/JENKINS-41894 sh 'rm -rf ${WORKSPACE}/*' } } } // stage Build Docs stage('Source Format Checks') { when { beforeOptions true expression { ONLY_DOCS_CHANGED == '0' } } agent { docker { image "${DOCKER_IMAGE_BASE}-${LOW_ERLANG_VER}" label 'docker' args "${DOCKER_ARGS}" registryUrl 'https://docker.io/' registryCredentialsId 'dockerhub_creds' } } options { timeout(time: 15, unit: "MINUTES") } steps { sh ''' rm -rf apache-couchdb-* ./configure --skip-deps --spidermonkey-version 78 make erlfmt-check make elixir-source-checks make python-black ''' } post { cleanup { // UGH see https://issues.jenkins-ci.org/browse/JENKINS-41894 sh 'rm -rf ${WORKSPACE}/*' } } } // stage Erlfmt stage('Make Dist') { when { beforeOptions true expression { ONLY_DOCS_CHANGED == '0' } } agent { docker { image "${DOCKER_IMAGE_BASE}-${LOW_ERLANG_VER}" label 'docker' args "${DOCKER_ARGS}" registryUrl 'https://docker.io/' registryCredentialsId 'dockerhub_creds' } } options { timeout(time: 15, unit: "MINUTES") } steps { sh ''' rm -rf apache-couchdb-* ./configure --spidermonkey-version 78 --enable-nouveau make dist chmod -R a+w * . ''' } post { success { stash includes: 'apache-couchdb-*.tar.gz', name: 'tarball' } cleanup { // UGH see https://issues.jenkins-ci.org/browse/JENKINS-41894 sh 'rm -rf ${WORKSPACE}/*' } } } // stage Make Dist // 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('Make Check') { when { beforeOptions true expression { ONLY_DOCS_CHANGED == '0' } } matrix { axes { axis { name 'ERLANG_VERSION' values '23.3.4.18', '24.3.4.10', '25.3' } axis { name 'SM_VSN' values '78' } } stages { stage('Build and Test') { agent { docker { image "${DOCKER_IMAGE_BASE}-${ERLANG_VERSION}" label 'docker' args "${DOCKER_ARGS}" } } options { skipDefaultCheckout() timeout(time: 90, unit: "MINUTES") } 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' } cleanup { sh 'rm -rf ${WORKSPACE}/*' } } } // stage } // stages } // matrix } // stage "Make Check" } // stages } // pipeline