def call(lib, BUILD_BRANCH, CREDENTIALS_ID) {

	env.GOROOT = "/usr/local/go"
	env.GOPATH = "/go"
	env.PATH = "${env.GOROOT}/bin:${env.GOPATH}/bin:/bin:${env.PATH}:/home/jenkins/bin"

	def IMAGE_TAG
	def BACKUP_IMAGE_TAG
	def GITHASH
	def UCLOUD_OSS_URL = "http://pingcap-dev.hk.ufileos.com"
	def BUILD_URL = "git@github.com:pingcap/tidb-operator.git"
	def E2E_IMAGE = "localhost:5000/pingcap/tidb-operator-e2e:latest"
	def PROJECT_DIR = "go/src/github.com/pingcap/tidb-operator"

	catchError {
		node('k8s_centos7_build'){
			def WORKSPACE = pwd()

			dir("${PROJECT_DIR}"){
				stage('build tidb-operator binary'){
					git credentialsId: "${CREDENTIALS_ID}", url: "${BUILD_URL}", branch: "${BUILD_BRANCH}"
					GITHASH = sh(returnStdout: true, script: "git rev-parse HEAD").trim()
					lib.stage_build_tidb_binary(WORKSPACE)
				}
			}
			stash excludes: "${PROJECT_DIR}/vendor/**", includes: "${PROJECT_DIR}/**", name: "tidb-operator"
		}

		node('k8s-dind') {
			def WORKSPACE = pwd()
			deleteDir()
			unstash 'tidb-operator'

			dir("${PROJECT_DIR}"){
				stage('push tidb-operator images'){
					IMAGE_TAG = "localhost:5000/pingcap/tidb-operator:${GITHASH.take(7)}"
					sh """
					cd docker
					docker build -t ${IMAGE_TAG} .
					docker push ${IMAGE_TAG}
					"""
				}

				stage('push tidb-backup images'){
					BACKUP_IMAGE_TAG = "localhost:5000/pingcap/tidb-backup:${GITHASH.take(7)}"
					sh """
					cd hack/backup
					docker build -t ${BACKUP_IMAGE_TAG} .
					docker push ${BACKUP_IMAGE_TAG}
					"""
				}

				stage('start prepare runtime environment'){
					lib.stage_prep_run_env()
				}

				stage('start run operator e2e test'){
					def SRC_FILE_CONTENT = readFile file: "test/e2e/manifests/tidb-operator-e2e.yaml"
					def DST_FILE_CONTENT = SRC_FILE_CONTENT.replaceAll("image:.*", "image: ${E2E_IMAGE}")
					DST_FILE_CONTENT = DST_FILE_CONTENT.replaceAll("value: localhost:5000/pingcap/tidb-operator:latest", "value: ${IMAGE_TAG}")
					DST_FILE_CONTENT = DST_FILE_CONTENT.replaceAll("value: localhost:5000/pingcap/tidb-backup:latest", "value: ${BACKUP_IMAGE_TAG}")
					writeFile file: 'tidb-operator-e2e-online.yaml', text: "${DST_FILE_CONTENT}"

					ansiColor('xterm') {
					sh """
					make e2e-run-tests
					"""
					}
				}
			}
		}

		node('k8s_centos7_build'){
			dir("${PROJECT_DIR}"){
				stage('upload tidb-operator binary and charts'){

					//upload binary and charts
					sh """
					cp ~/bin/config.cfg ./
					tar zcvf tidb-operator.tar.gz docker/bin/* charts hack/backup/*
					filemgr-linux64 --action mput --bucket pingcap-dev --nobar --key builds/pingcap/operator/${GITHASH}/centos7/tidb-operator.tar.gz --file tidb-operator.tar.gz
					"""

					//update refs
					writeFile file: 'sha1', text: "${GITHASH}"
					sh """
					filemgr-linux64 --action mput --bucket pingcap-dev --nobar --key refs/pingcap/operator/${BUILD_BRANCH}/centos7/sha1 --file sha1
					rm -f sha1 tidb-operator.tar.gz config.cfg
					"""
				}
			}
		}

		currentBuild.result = "SUCCESS"
	}
	stage('Summary') {
		def successAppend = "Binary Download URL:" + "\n" +
			"${UCLOUD_OSS_URL}/builds/pingcap/operator/${GITHASH}/centos7/tidb-operator.tar.gz"
		lib.stage_summary(successAppend: successAppend, changelog: true, buildtype: "master", branch: BUILD_BRANCH, githash: GITHASH.take(7), slack_channel: '#cloud_jenkins')
	}
}

return this
