properties([
    parameters([
        string(name: 'CONTEXT', defaultValue: '', description: '', trim: true),
        string(name: 'CONTEXT_FROM', defaultValue: '', description: '', trim: true),
        string(name: 'DOCKERFILE', defaultValue: 'Dockerfile', description: '', trim: true),
        string(name: 'DESTINATION', defaultValue: '', description: '', trim: true),
    ])
])

catchError {
    label = "build-image"
    podTemplate(name: label, label: label, instanceCap: 5, idleMinutes: 480, containers: [
        containerTemplate(name: 'dockerd', image: 'hub.pingcap.net/qa/docker:18.09.6-dind', privileged: true),
        containerTemplate(name: 'docker', image: 'hub.pingcap.net/qa/docker:18.09.6', envVars: [envVar(key: 'DOCKER_HOST', value: 'tcp://localhost:2375')], ttyEnabled: true, command: 'cat'),
    ]) {
        node(label) {
            deleteDir()

            stage("Download") {
                def copy_from = params.CONTEXT_FROM.split(":")
                if (copy_from.length == 3) {
                    copyArtifacts(projectName: copy_from[0], selector: [$class: 'SpecificBuildSelector', buildNumber: copy_from[1]])
                    sh("tar -xf ${copy_from[2]}")
                } else if (params.CONTEXT.endsWith(".tar.gz") || params.CONTEXT.endsWith(".tgz")) {
                    sh("wget -O- ${params.CONTEXT} | tar xz")
                } else {
                    sh("wget -O ${params.DOCKERFILE} ${params.CONTEXT}")
                }
            }

            container("docker") {
                stage("Build") {
                    def dst = params.DESTINATION
                    if (!dst) {
                        dst = sh(script: "tail -n 1 ${params.DOCKERFILE} | grep -o -e 'hub.pingcap.net.\\+\$'", returnStdout: true).trim()
                    }
                    if (!dst) {
                        error("DESTINATION is required!")
                    }
                    docker.withRegistry("https://hub.pingcap.net", "harbor-pingcap") {
                        sh("docker build -f ${params.DOCKERFILE} -t ${dst} .")
                        sh("docker push ${dst}")
                    }
                    echo("${dst}")
                }
            }

        }
    }
}
