#!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 = '24.3.4.10'
  }

  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 '24.3.4.10', '25.3', '26.0'
          }
          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
