/**
 * Pipeline to construct a build version of the SSO library for Silverpeas. The execution of the
 * pipeline depends on the latest successful build version of Silverpeas as it fetches the build
 * result report from the successful Jenkins job in order to update correctly its dependencies on
 * Silverpeas.
 *
 * Because this pipeline is based upon some convention rules, some expectations have to be
 * fulfilled:
 * Dependent Jenkins job name: the name of the job producing a build version of Silverpeas upon
 *                             which this project depend must be named as
 *                             'Silverpeas_Master_AutoDeploy'
 *
 * The build is performed within a dedicated Docker image in order to ensure the reproducibility of
 * the builds and to containerize them from the host OS.
 */
pipeline {

  agent {
    docker {
      image 'silverpeas/silverbuild:6.4'
      args '''
          -v $HOME/.m2/settings.xml:/home/silverbuild/.m2/settings.xml 
          -v $HOME/.m2/settings-security.xml:/home/silverbuild/.m2/settings-security.xml 
          -v $HOME/.gitconfig:/home/silverbuild/.gitconfig 
          -v $HOME/.ssh:/home/silverbuild/.ssh 
          -v $HOME/.gnupg:/home/silverbuild/.gnupg
          '''
    }
  }

  environment {
    nexusRepo = 'https://nexus3.silverpeas.org/repository/builds'
    gitRepo = 'https://github.com/Silverpeas/Silverpeas-Sso'
    gitCredential = 'cacc0467-7c85-41d1-bf4e-eaa470dd5e59'
    buildNumber = (new Date()).format('yyMMdd')
    silverpeasBuildJobName = 'Silverpeas_Master_AutoDeploy'
    parentVersion = ''
    buildVersion = ''
    silverpeasVersion = ''
    release = ''
    pom = null
    artifact = 'target/build.yaml'
  }

  stages {
    stage('Resolve dependency on Silverpeas') {
      steps {
        script {
          copyArtifacts projectName: silverpeasBuildJobName, flatten: true
          def silverpeasBuild = readYaml file: 'build.yaml'
          parentVersion = silverpeasBuild.parent
          silverpeasVersion = silverpeasBuild.version
          sh 'rm -f build.yaml'
        }
      }
    }
    stage('Checkout the project') {
      steps {
        git([url: gitRepo, credentialsId: gitCredential])
        script {
          pom = readMavenPom()
          release = pom.properties['next.release']
          buildVersion = "${release}-build${buildNumber}"
        }
      }
    }
    stage('Check POM parent version') {
      when {
        expression { pom.parent.version.contains('SNAPSHOT') }
      }
      steps {
        error "The parent POM must be at a stable or a build version for this project to be deployed. Current version is ${pom.parent.version}"
      }
    }
    stage('Check Silverpeas version') {
      when {
        expression { pom.properties['silverpeas.version'].contains('SNAPSHOT') }
      }
      steps {
        error "The dependency on Silverpeas must be at a stable or at a build version for this project to be deployed. Current version is ${pom.properties['silverpeas.version']}"
      }
    }
    stage('Update POM parent') {
      environment {
        GIT_AUTH = credentials("${gitCredential}")
      }
      when {
        expression {
          !pom.parent.version.matches(/[0-9.]+/) && parentVersion && pom.parent.version != parentVersion
        }
      }
      steps {
        sh """
          mvn -U versions:update-parent -DgenerateBackupPoms=false -DparentVersion="[${parentVersion}]"
          git commit -am "Update parent POM to version ${parentVersion}"
          """
        sh '''
          git config --local credential.helper "!f() { echo username=\\${GIT_AUTH_USR}; echo password=\\$GIT_AUTH_PSW; }; f"
          git push origin HEAD:master
          '''
      }
    }
    stage('Update dependency on Silverpeas') {
      environment {
        GIT_AUTH = credentials("${gitCredential}")
      }
      when {
        expression {
          !pom.properties['silverpeas.version'].matches(/[0-9.]+/) &&
              pom.properties['silverpeas.version'] != silverpeasVersion
        }
      }
      steps {
        sh """
          sed -i -e "s/<silverpeas.version>[0-9a-zA-Z.-]\\+/<silverpeas.version>${silverpeasVersion}/g" pom.xml
          git commit -am "Update dependency on Silverpeas to version ${silverpeasVersion}"
          """
        sh '''
          git config --local credential.helper "!f() { echo username=\\${GIT_AUTH_USR}; echo password=\\$GIT_AUTH_PSW; }; f"
          git push origin HEAD:master
          '''
      }
    }
    stage('Build and Publish') {
      steps {
        sh """
          /opt/wildfly-for-tests/wildfly-*.Final/bin/standalone.sh -c standalone-full.xml &> /dev/null &
          mvn -U versions:set -DgenerateBackupPoms=false -DnewVersion=${buildVersion}
          mvn clean deploy -DaltDeploymentRepository=silverpeas::default::${nexusRepo} -Pdeployment -Pcoverage -Djava.awt.headless=true -Dcontext=ci
          /opt/wildfly-for-tests/wildfly-*.Final/bin/jboss-cli.sh --connect :shutdown
          """
      }
    }
    stage('Create YAML build report') {
      steps {
        script {
          String commit = sh script: 'git rev-parse HEAD', returnStdout: true
          writeYaml file: artifact, data: ['version': buildVersion,
                                           'parent' : parentVersion,
                                           'release': release,
                                           'commit' : commit.trim()]
        }
      }
    }
  }
  post {
    success {
      script {
        currentBuild.displayName = buildVersion
      }
      archiveArtifacts artifacts: artifact, fingerprint: true
    }
    always {
      step([$class                  : 'Mailer',
            notifyEveryUnstableBuild: true,
            recipients              : "miguel.moquillon@silverpeas.org, silveryocha@chastagnier.com",
            sendToIndividuals       : true])
    }
  }
}
