properties([
    parameters([
        string(name: 'BRANCH', defaultValue: 'master', description: 'can be a commit id or pull request (format: pr/42)', trim: true),
        string(name: 'REFSPEC', defaultValue: '+refs/heads/*:refs/remotes/origin/* +refs/pull/*/head:refs/remotes/origin/pr/*', description: '', trim: true),
        credentials(name: 'GH_CREDENTIAL', defaultValue: 'qa-jenkins-repo', credentialType: 'com.cloudbees.plugins.credentials.impl.UsernamePasswordCredentialsImpl', description: '', required: true),
    ])
])

def main() {
    stage("Checkout") {
        withCredentials([usernameColonPassword(credentialsId: params.getOrDefault("GH_CREDENTIAL", "qa-jenkins-repo"), variable: "GH_AUTH")]) {
            sh("""
            git config --global credential.helper store
            echo "https://$GH_AUTH@github.com > \$HOME/.git-credentials"
            """)
            checkout(changelog: false, poll: false, scm: [
                $class           : "GitSCM",
                branches         : [[name: params.getOrDefault("BRANCH", "master")]],
                userRemoteConfigs: [[url: "https://github.com/pingcap/qa.git",
                                     credentialsId: params.getOrDefault("GH_CREDENTIAL", "qa-jenkins-repo"),
                                     refspec: params.getOrDefault("REFSPEC", "+refs/heads/*:refs/remotes/origin/*")]],
                extensions       : [[$class: 'PruneStaleBranch'], [$class: 'CleanBeforeCheckout']],
            ])
        }
    }
    stage("Build") {
        container("golang") {
            dir("once") {
                sh("make")
                dir("build") {
                    sh("""
                    bin/testkit list plugins
                    cat testkit.log
                    """)
                }
            }
        }
    }
    stage("Upload") {
        container("golang") {
            dir("once") {
                def upload = "pingcap/qa/archives/once-${params.getOrDefault("BRANCH", "master").replaceAll("/", "-")}.tar.gz"
                sh """
                tar -zcf once.tar.gz --transform 's/build/once/' --exclude 'build/testkit.log' --exclude 'build/.bin' build
                curl -F ${upload}=@once.tar.gz fileserver.pingcap.net/upload
                """
                echo("http://fileserver.pingcap.net/download/${upload}")
            }
        }

    }
}

def run(label, image, Closure main) {
    podTemplate(name: label, label: label, containers: [
        containerTemplate(name: 'golang', image: image, alwaysPullImage: true, ttyEnabled: true, command: 'cat'),
    ]) { node(label) { main() } }
}

catchError {
    run('build-once', 'hub.pingcap.net/jenkins/centos7_golang-1.13') { main() }
}
