pipeline {
  agent { label 'linux' }

  parameters {
    string(
      name: 'BUILD_TYPE',
      description: 'Specify build type. Values: pr / nightly / release',
      defaultValue: 'pr',
    )
  }

  options {
    timestamps()
    /* Prevent Jenkins jobs from running forever */
    timeout(time: 40, unit: 'MINUTES')
    /* Limit builds retained */
    buildDiscarder(logRotator(
      numToKeepStr: '10',
      daysToKeepStr: '20',
      artifactNumToKeepStr: '10',
    ))
  }

  /**
   * WARNING: Jenkins ignores PATH changes in Docker
   * https://issues.jenkins-ci.org/browse/JENKINS-49076
   **/
  environment {
    LANG     = "en_US.UTF-8"
    LC_ALL   = "en_US.UTF-8"
    LANGUAGE = "en_US.UTF-8"
    TARGET_OS = 'linux'
    NIX_CONF_DIR = "${env.WORKSPACE}/nix"
    VERBOSE_LEVEL = '3'
    /* We use EXECUTOR_NUMBER to avoid multiple instances clashing */
    LEIN_HOME         = "/var/tmp/lein-${EXECUTOR_NUMBER}"
    YARN_CACHE_FOLDER = "/var/tmp/yarn-${EXECUTOR_NUMBER}"
    GRADLE_USER_HOME  = "/var/tmp/gradle-${EXECUTOR_NUMBER}"
  }

  stages {
    stage('Prep') {
      steps {
        script {
          /* Necessary to load methods */
          desktop = load 'ci/desktop.groovy'
          cmn     = load 'ci/common.groovy'
          btype   = cmn.utils.getBuildType()
          print "Running ${btype} build!"
          cmn.ci.abortPreviousRunningBuilds()
          /* Cleanup and Prep */
          cmn.prep(btype)
        }
      }
    }
    stage('Parallel') {
      parallel {
        stage('Checks') { stages {
          stage('Lint') {
            steps {
              script { cmn.nix.shell('lein cljfmt check') }
            }
          }
          stage('Tests') {
            steps {
              script { cmn.nix.shell('lein test-cljs') }
            }
          }
        } }
        stage('Build') { stages {
          stage('Clojure') {
            steps {
              script { desktop.buildClojureScript() }
            }
          }
          stage('Compile') {
            steps {
              script { desktop.compile() }
            }
          }
          stage('Bundle') {
            steps {
              script { app = desktop.bundleLinux(btype) }
            }
          }
        } }
      }
    }
    stage('Archive') {
      steps {
        archiveArtifacts app
      }
    }
    stage('Upload') {
      steps {
        script { env.PKG_URL = cmn.utils.uploadArtifact(app) }
      }
    }
    stage('Cleanup') {
      steps {
        sh 'make watchman-clean'
        sh 'make clean'
      }
    }
  }
  post {
    success { script { load('ci/github.groovy').notifyPR(true) } }
    failure { script { load('ci/github.groovy').notifyPR(false) } }
  }
}