def main() {
    def tag = params.TAG
    if (tag == "") {
        tag = params.BRANCH.replaceAll("/", "-")
        if (params.FORK != "pingcap") { tag = "${params.FORK}__${tag}".toLowerCase() }
    }

    stage("Checkout") {
        container("clojure") { sh("chown -R 1000:1000 ./")}
        checkout(changelog: false, poll: false, scm: [
            $class           : "GitSCM",
            branches         : [[name: params.BRANCH]],
            userRemoteConfigs: [[url: "https://github.com/${params.FORK}/jepsen.git", refspec: params.REFSPEC]],
            extensions       : [[$class: 'PruneStaleBranch'], [$class: 'CleanBeforeCheckout']],
        ])
    }

    stage("Package") {
        container("clojure") {
            sh(script: "find tidb/checkouts -type l", returnStdout: true).split().each { path -> dir(path) { sh("lein install") } }
            dir("tidb") { sh("lein uberjar") }

            sh("""
            mv tidb/target/tidb-*-standalone.jar jepsen-tidb.jar

            cat <<EOF > Dockerfile
            FROM ${params.BASE_IMAGE}
            COPY jepsen-tidb.jar /
            EOF

            tar -zcf jepsen-tidb.tar.gz jepsen-tidb.jar Dockerfile
            """.stripIndent())

            archiveArtifacts(artifacts: "jepsen-tidb.tar.gz")
        }
    }

    stage("Image") {
        build(job: "image-build", parameters: [
            string(name: "CONTEXT_ARTIFACT", value: "$JOB_NAME:$BUILD_NUMBER:jepsen-tidb.tar.gz"),
            string(name: "DESTINATION", value: "hub.pingcap.net/qa/jepsen-control:${tag}"),
        ])
    }
}

def run(label, image, Closure body) {
    podTemplate(name: label, label: label, instanceCap: 5, idleMinutes: 60, containers: [
        containerTemplate(name: 'clojure', image: image, alwaysPullImage: false, ttyEnabled: true, command: 'cat'),
    ]) { node(label) { dir("jepsen") { body() } } }
}

catchError {
    run('jepsen-build', 'hub.pingcap.net/mirrors/clojure:openjdk-8-lein') { main() }
}
