#!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
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.15'
  }

  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 '''
          (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('Erlfmt') {
       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
          make erlfmt-check
        '''
      }
      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
          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.15', '24.3.4.2', '25.0.2'
          }
          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
