#!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

/*
  - Removed 2020.09.15 - VMs are offline
*/

//        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

	/*
	 * 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
