properties([
    parameters([
        choice(name: 'SUITE', choices: ["transaction", "rowformat", "ticdc", "gcworker", "readpool"], description: ''),
        string(name: 'FORK', defaultValue: 'pingcap', description: '', trim: true),
        string(name: 'BRANCH', defaultValue: 'dev', description: '', trim: true),
        string(name: 'REFSPEC', defaultValue: '+refs/heads/*:refs/remotes/origin/* +refs/pull/*/head:refs/remotes/origin/pr/*', description: '', trim: true),
        string(name: 'TAG', defaultValue: '', description: '', trim: true),
    ])
])

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

    stage("Checkout") {
        container("golang") { sh("chown -R 1000:1000 ./")}
        checkout(changelog: false, poll: false, scm: [
            $class           : "GitSCM",
            branches         : [[name: params.BRANCH]],
            userRemoteConfigs: [[url: "https://github.com/${params.FORK}/automated-tests.git",
                                 refspec: params.REFSPEC, credentialsId: "qa-jenkins-repo"]],
            extensions       : [[$class: 'PruneStaleBranch'], [$class: 'CleanBeforeCheckout']],
        ])
    }
    stage("Build") {
        container("golang") {
            def projectDir = pwd()
            def siteScript = ""
            if (params.SUITE == "gcworker") {
                siteScript = "make download-tidb"
            }

            sh("""
            cd ticases/${params.SUITE}

            ${siteScript}

            go build

            UTF_SUITE_SCHEMA="file://$projectDir/manifests/suite.schema.json" ./${params.SUITE} info

            cat <<EOF > Dockerfile
            FROM hub.pingcap.net/qa/utf-go-base:20200702
            COPY suite.jsonnet /
            COPY ${params.SUITE} /
            ENTRYPOINT ["/${params.SUITE}"]
            EOF

            tar -zcf ${params.SUITE}.tar.gz ${params.SUITE} suite.jsonnet Dockerfile
            """.stripIndent())

            archiveArtifacts(artifacts: "ticases/${params.SUITE}/${params.SUITE}.tar.gz")

        }
    }
    stage("Image") {
        build(job: "build-image", parameters: [
            string(name: "CONTEXT_FROM", value: "$JOB_NAME:$BUILD_NUMBER:ticases/${params.SUITE}/${params.SUITE}.tar.gz"),
            string(name: "DESTINATION", value: "hub.pingcap.net/qa/utf-go-${params.SUITE}:${tag}"),
        ])
    }
}

def run(label, image, Closure main) {
    podTemplate(name: label, label: label, instanceCap: 5, idleMinutes: 60, containers: [
        containerTemplate(name: 'golang', image: image, alwaysPullImage: false, ttyEnabled: true, command: 'cat'),
    ]) { node(label) { dir("automated-tests") { main() } } }
}

catchError {
    run('build-utf-go', 'hub.pingcap.net/mirrors/golang:1.14') { main() }
}
