#!groovy
/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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
 *
 *     https://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.
 */

pipeline {
  agent {
    // https://cwiki.apache.org/confluence/display/INFRA/ci-builds.apache.org
    label 'ubuntu'
  }

  triggers {
    cron('H 2 * * *')
  }

  options {
    disableConcurrentBuilds()
  }

  parameters {
    string(name: 'VERSION', defaultValue: 'latest', description: 'The version to generate documentation for, e.g. \'2.2.1\'. This will also be the target location on nightlies.a.o (default = latest)')
    booleanParam(name: 'RELEASE', defaultValue: false, description: 'Check this value if release documentation needs to be generated')
  }

  stages {
    stage('Checkout sources') {
      steps {
        script {
          // Set the correct GIT_REF before checkout
          def version = params.VERSION
          if (params.RELEASE == true) {
            env.GIT_REF = "refs/tags/rel/celix-${version}";
          } else {
            if (version.equals("latest")) {
              env.GIT_REF = "refs/heads/master";
            } else {
              env.GIT_REF = "refs/heads/${version}";
            }
          }

          checkout scm: [$class: 'GitSCM',
              userRemoteConfigs: [[url: 'https://github.com/apache/celix.git' ]],
              branches: [[name: "${env.GIT_REF}" ]]
            ],
            poll: false
        }
      }
    }

    stage('Generate documentation') {
      agent {
        docker {
          image 'ghcr.io/rlenferink/doxygen:1.0.0'
          reuseNode true
        }
      }

      steps {
        script {
          // Set the Doxygen output directory
          env.DOXYGEN_OUTPUT_DIR = "${WORKSPACE}/doxygen"

          // Set the PROJECT_NUMBER to the generated version
          sh "sed -i -E 's#^(PROJECT_NUMBER[[:blank:]]*=[[:blank:]]*).*#\\1'\"${params.VERSION}\"'#' Doxyfile"

          // Generate Doxygen documentation
          sh 'doxygen Doxyfile'
        }
      }
    }

    stage('Upload to Nightlies') {
      steps {
        sshPublisher(publishers: [
          sshPublisherDesc(
            configName: 'Nightlies',
            transfers: [
              sshTransfer(
                remoteDirectory: "celix/${params.VERSION}",
                cleanRemote: true, // Delete the existing docs before adding the latest ones
                sourceFiles: 'doxygen/html/**/*',
                removePrefix: 'doxygen/html'
              )
            ],
            verbose: true
          )
        ])
      }
    }
  }

  post {
    always {
      echo "Cleaning workspace ..."
      deleteDir()
    }

    // If this build failed, send an email to the list.
    failure {
      script {
        emailext(
          to: "dev@celix.apache.org",
          recipientProviders: [[$class: 'DevelopersRecipientProvider']],
          from: "Jenkins <jenkins@ci-builds.apache.org>",
          subject: "Jenkins job ${env.JOB_NAME}#${env.BUILD_NUMBER} failed",
          body: """
There is a build failure in ${env.JOB_NAME}.
Build: ${env.BUILD_URL}
Logs: ${env.BUILD_URL}console
Changes: ${env.BUILD_URL}changes
"""
        )
      }
    }

    // Send an email, if the last build was not successful and this one is.
    fixed {
      script {
        emailext(
          to: "dev@celix.apache.org",
          recipientProviders: [[$class: 'DevelopersRecipientProvider']],
          from: 'Jenkins <jenkins@ci-builds.apache.org>',
          subject: "Jenkins job ${env.JOB_NAME}#${env.BUILD_NUMBER} back to normal",
          body: """
The build for ${env.JOB_NAME} completed successfully and is back to normal.
Build: ${env.BUILD_URL}
Logs: ${env.BUILD_URL}console
Changes: ${env.BUILD_URL}changes
"""
        )
      }
    }
  }
}

