blob: 15518d40238a7878c607bd6d5bd1c8d00d65a4d2 [file] [log] [blame]
Jakub Joseff2a66e92017-03-08 17:21:07 +01001/**
2 * Gerrit gating pipeline
3 * CREDENTIALS_ID - Gerrit credentails ID
Jakub Josefb62d00a2017-03-13 12:21:40 +01004 * JOBS_NAMESPACE - Gerrit gating jobs namespace (mk, contrail, ...)
Jakub Joseff2a66e92017-03-08 17:21:07 +01005 *
azvyagintsev5173bc52018-09-21 13:24:59 +03006 **/
Alexander Evseev02fe5eb2018-11-15 13:58:36 +01007import groovy.json.JsonOutput
Jakub Joseff2a66e92017-03-08 17:21:07 +01008
9def common = new com.mirantis.mk.Common()
10def gerrit = new com.mirantis.mk.Gerrit()
Jakub Josefeda07682017-03-09 14:50:54 +010011def ssh = new com.mirantis.mk.Ssh()
azvyagintsev5173bc52018-09-21 13:24:59 +030012
azvyagintsev3f678fd2018-09-28 19:21:45 +030013slaveNode = env.SLAVE_NODE ?: 'docker'
14giveVerify = false
Jakub Josef4251feb2017-03-10 16:10:53 +010015
16@NonCPS
azvyagintsev5173bc52018-09-21 13:24:59 +030017def isJobExists(jobName) {
18 return Jenkins.instance.items.find { it -> it.name.equals(jobName) }
Mikhail Ivanovf5cd07f2017-04-11 17:09:54 +040019}
azvyagintsev5173bc52018-09-21 13:24:59 +030020
Denis Egorenkoc33cb5a2018-09-27 18:33:12 +040021def callJobWithExtraVars(String jobName) {
Alexander Evseev02fe5eb2018-11-15 13:58:36 +010022 def gerritVars = JsonOutput.toJson(env.getEnvironment().findAll{ it.key.startsWith('GERRIT_') })
azvyagintsev3f678fd2018-09-28 19:21:45 +030023 testJob = build job: jobName, parameters: [
24 [$class: 'TextParameterValue', name: 'EXTRA_VARIABLES_YAML', value: gerritVars]
Denis Egorenkoc33cb5a2018-09-27 18:33:12 +040025 ]
azvyagintsev3f678fd2018-09-28 19:21:45 +030026 if (testJob.getResult() != 'SUCCESS') {
27 error("Gate job ${testJob.getBuildUrl().toString()} finished with ${testJob.getResult()} !")
28 }
29 giveVerify = true
Denis Egorenkoc33cb5a2018-09-27 18:33:12 +040030}
31
azvyagintsev5173bc52018-09-21 13:24:59 +030032
33timeout(time: 12, unit: 'HOURS') {
34 node(slaveNode) {
35 try {
36 // test if change is not already merged
37 ssh.prepareSshAgentKey(CREDENTIALS_ID)
38 ssh.ensureKnownHosts(GERRIT_HOST)
39 def gerritChange = gerrit.getGerritChange(GERRIT_NAME, GERRIT_HOST, GERRIT_CHANGE_NUMBER, CREDENTIALS_ID, true)
40 def doSubmit = false
azvyagintsev5173bc52018-09-21 13:24:59 +030041 stage("test") {
42 if (gerritChange.status != "MERGED" && !SKIP_TEST.equals("true")) {
43 // test max CodeReview
44 if (gerrit.patchsetHasApproval(gerritChange.currentPatchSet, "Code-Review", "+")) {
45 doSubmit = true
46 def gerritProjectArray = GERRIT_PROJECT.tokenize("/")
47 def gerritProject = gerritProjectArray[gerritProjectArray.size() - 1]
48 def jobsNamespace = JOBS_NAMESPACE
49 def plural_namespaces = ['salt-formulas', 'salt-models']
50 // remove plural s on the end of job namespace
51 if (JOBS_NAMESPACE in plural_namespaces) {
52 jobsNamespace = JOBS_NAMESPACE.substring(0, JOBS_NAMESPACE.length() - 1)
53 }
54 // salt-formulas tests have -latest on end of the name
55 if (JOBS_NAMESPACE.equals("salt-formulas")) {
56 gerritProject = gerritProject + "-latest"
57 }
58 def testJob = String.format("test-%s-%s", jobsNamespace, gerritProject)
azvyagintsev3f678fd2018-09-28 19:21:45 +030059 if (env.GERRIT_PROJECT == 'mk/cookiecutter-templates') {
60 callJobWithExtraVars('test-mk-cookiecutter-templates')
61 } else if (env.GERRIT_PROJECT == 'salt-models/reclass-system') {
62 callJobWithExtraVars('test-salt-model-reclass-system')
azvyagintsev5173bc52018-09-21 13:24:59 +030063 } else {
Denis Egorenkoc33cb5a2018-09-27 18:33:12 +040064 if (isJobExists(testJob)) {
65 common.infoMsg("Test job ${testJob} found, running")
66 def patchsetVerified = gerrit.patchsetHasApproval(gerritChange.currentPatchSet, "Verified", "+")
67 build job: testJob, parameters: [
68 [$class: 'StringParameterValue', name: 'DEFAULT_GIT_URL', value: "${GERRIT_SCHEME}://${GERRIT_NAME}@${GERRIT_HOST}:${GERRIT_PORT}/${GERRIT_PROJECT}"],
69 [$class: 'StringParameterValue', name: 'DEFAULT_GIT_REF', value: GERRIT_REFSPEC]
70 ]
71 giveVerify = true
72 } else {
73 common.infoMsg("Test job ${testJob} not found")
74 }
azvyagintsev5173bc52018-09-21 13:24:59 +030075 }
76 } else {
77 common.errorMsg("Change don't have a CodeReview, skipping gate")
78 }
79 } else {
80 common.infoMsg("Test job skipped")
81 }
82 }
83 stage("submit review") {
84 if (gerritChange.status == "MERGED") {
85 common.successMsg("Change ${GERRIT_CHANGE_NUMBER} is already merged, no need to gate them")
86 } else if (doSubmit) {
87 if (giveVerify) {
88 common.warningMsg("Change ${GERRIT_CHANGE_NUMBER} don't have a Verified, but tests were successful, so adding Verified and submitting")
89 ssh.agentSh(String.format("ssh -p 29418 %s@%s gerrit review --verified +1 --submit %s,%s", GERRIT_NAME, GERRIT_HOST, GERRIT_CHANGE_NUMBER, GERRIT_PATCHSET_NUMBER))
90 } else {
91 ssh.agentSh(String.format("ssh -p 29418 %s@%s gerrit review --submit %s,%s", GERRIT_NAME, GERRIT_HOST, GERRIT_CHANGE_NUMBER, GERRIT_PATCHSET_NUMBER))
92 }
93 common.infoMsg(String.format("Gerrit review %s,%s submitted", GERRIT_CHANGE_NUMBER, GERRIT_PATCHSET_NUMBER))
94 }
95 }
96 } catch (Throwable e) {
97 // If there was an error or exception thrown, the build failed
98 currentBuild.result = "FAILURE"
99 currentBuild.description = currentBuild.description ? e.message + " " + currentBuild.description : e.message
100 throw e
101 }
102 }
azvyagintsev3f678fd2018-09-28 19:21:45 +0300103}