#!groovy
/**
 * Jenkins pipeline to build Corda on MS Windows server.
 * Because it takes a long time to run tests sequentially, unit tests and
 * integration tests are started in parallel on separate agents.
 *
 * Additionally, pull requests by default run only unit tests.
 */

/**
 * Kill already started job.
 * Assume new commit takes precendence and results from previous
 * unfinished builds are not required.
 * This feature doesn't play well with disableConcurrentBuilds() option
 */
@Library('corda-shared-build-pipeline-steps')
import static com.r3.build.BuildControl.killAllExistingBuildsForJob
killAllExistingBuildsForJob(env.JOB_NAME, env.BUILD_NUMBER.toInteger())

/**
 * Sense environment
 */
boolean isReleaseBranch = (env.BRANCH_NAME =~ /^release\/os\/.*/)

pipeline {
    agent none
    options {
        ansiColor('xterm')
        timestamps()
        timeout(time: 3, unit: 'HOURS')

        /*
         * a bit awkward to read
         * is parameter is true  -> push events are *not* ignored
         * if parameter is false -> push events *are* ignored
         */
        overrideIndexTriggers (!isReleaseBranch)
    }

    parameters {
        booleanParam defaultValue: (isReleaseBranch), description: 'Run integration tests?', name: 'DO_INTEGRATION_TESTS'
    }

    /*
     * Do no receive Github's push events for release branches -> suitable for nightly builds
     * but projects for pull requests will receive them as normal, and PR builds are started ASAP
     */
    triggers {
        pollSCM ignorePostCommitHooks: isReleaseBranch, scmpoll_spec: '@midnight'
    }

    stages {
        stage('Tests') {
            parallel {
                stage('Unit Tests') {
                    agent { label 'mswin' }
                    steps {
                        bat "./gradlew --no-daemon " +
                                "--stacktrace " +
                                "-Pcompilation.warningsAsErrors=false " +
                                "-Ptests.failFast=true " +
                                "clean test"
                    }
                    post {
                        always {
                            archiveArtifacts allowEmptyArchive: true, artifacts: '**/logs/**/*.log'
                            junit testResults: '**/build/test-results/**/*.xml', keepLongStdio: true, allowEmptyResults: true
                            bat '.ci/kill_corda_procs.cmd'
                        }
                        cleanup {
                            deleteDir() /* clean up our workspace */
                        }
                    }

                }
                stage('Integration Tests') {
                    when {
                        expression { params.DO_INTEGRATION_TESTS }
                        beforeAgent true
                    }
                    agent { label 'mswin' }
                    steps {
                        bat "./gradlew --no-daemon " +
                                "clean integrationTest"
                    }
                    post {
                        always {
                            archiveArtifacts allowEmptyArchive: true, artifacts: '**/logs/**/*.log'
                            junit testResults: '**/build/test-results/**/*.xml', keepLongStdio: true, allowEmptyResults: true
                            bat '.ci/kill_corda_procs.cmd'
                        }
                        cleanup {
                            deleteDir() /* clean up our workspace */
                        }
                    }
                }
            }
        }
    }
}
