pipeline {

  environment {
    PYTHONDONTWRITEBYTECODE="1"
    PYTHONPYCACHEPREFIX="/tmp/.pytest_cache"
    MAJOR_VERSION = "0"
    MINOR_VERSION = "1"
    FLIT_USERNAME = "oterrier"
    FLIT_PASSWORD = "5C#P4N2yLL!P"
    GIT_AUTH = credentials('bitbucket-user')
  }

  agent none

  stages {

    stage('Generate new version') {
      agent {
          node {
            label 'master'
            customWorkspace "/home/jenkins/${env.JOB_NAME}"
          }
      }

      stages {

        stage('Catch if last commit is Jenkins CI') {
          steps {
            script {
                env.LAST_COMMIT_IS_NOT_JENKINS = sh(
                        script: 'git log -1 | grep "Jenkins CI"',
                        returnStatus: true
                )
                env.LAST_COMMIT_IS_JENKINS = sh(
                        script: 'git log -1 | grep -c "\\[Jenkins CI\\]"',
                        returnStatus: true,
                        returnStdout: true
                )
                sh 'git log -1'
                sh(
                  script: 'git log -1 | grep -c "\\[Jenkins CI\\]"',
                  returnStatus: true
                )
                println "Checking if last commit has been done by CI: " + !LAST_COMMIT_IS_NOT_JENKINS
                println "Checking if last commit has been done by CI: " + env.LAST_COMMIT_IS_JENKINS
            }
          }
        }

        stage("Create and commit new version") {
            when {
                environment name: "LAST_COMMIT_IS_NOT_JENKINS", value: "1"
            }
            steps {
                script {
                  println("attempt to publish with env.BUILD_ID = ${env.BUILD_ID}")
                  sh "echo '\"\"\"Sherpa knowledge import plugins\"\"\"' > pyimporters_dummy/__init__.py"
                  sh "echo '__version__ = \"${MAJOR_VERSION}.${MINOR_VERSION}.${env.BUILD_ID}\"' >> pyimporters_dummy/__init__.py"
                  sh('''
                    git config --remove-section credential >/dev/null 2>&1 || true
                    git config --remove-section user >/dev/null 2>&1 || true
                    git config --global push.default matching
                    git config user.name 'Guillaume Karcher'
                    git config user.email 'guillaume.karcher@kairntech.com'
                    git commit pyimporters_dummy/__init__.py -m "[Jenkins CI] Commit on version files" || echo "No changes to commit"
                    git config --local credential.helper "!f() { echo username=\\$GIT_AUTH_USR; echo password=\\$GIT_AUTH_PSW; }; f"
                    git push
                    git config --remove-section credential
                    git config --remove-section user
                  ''')
                }
            }
        }

      }
    }

    stage("Build and test the project") {

      when {
        environment name: "LAST_COMMIT_IS_NOT_JENKINS", value: "1"
      }

      agent {
        dockerfile {
          label 'master'
          customWorkspace "/home/jenkins/${env.JOB_NAME}"
          filename 'Dockerfile'
          args "-u root --privileged -v /tmp/_${env.JOB_NAME}/test-reports:/root/test-reports"
        }
      }

      stages {

        stage('Install flit') {
          steps {
            sh 'pip install --no-cache-dir flit==3.2.0'
            sh 'flit install'
          }
        }

        stage('Test with pytest') {
          steps {
            sh 'rm -f results.xml'
            sh 'pytest --verbose -o cache_dir=/tmp/.pytest_cache --junit-xml /root/test-reports/results.xml'
            sh 'rm -rf /tmp/.pytest_cache'
          }
        }

        stage('Publish on PyPI') {
          steps {
            sh 'rm -rf dist'
            sh 'mkdir dist'
            sh 'chmod -R 0777 dist/'
            sh 'flit publish'
            sh 'rm -rf dist'
          }
        }
      }

      post {
        // only triggered when blue or green sign
        //success {
        //}
        // triggered when red sign
        //failure {
        //}
        // trigger every-works
        always {
          sh "ln -s /tmp/_${env.JOB_NAME}/test-reports/results.xml $WORKSPACE"
          junit 'results.xml'

          println "sending Systematic Build notification"
          emailext(body: '${DEFAULT_CONTENT}', mimeType: 'text/html',
                  replyTo: '${DEFAULT_REPLYTO}', subject: '${DEFAULT_SUBJECT}',
                  to: '${DEFAULT_RECIPIENTS}')
        }
      }
    }

  }

}
