blob: 449bc50b50f112119857c6092875853ff71153a7 [file] [log] [blame]
Denis Egorenko358a4fc2018-11-27 17:57:22 +04001/*
2 Global wrapper for testing next projects:
3 - salt-models/reclass-system
4 - mk/cookiecutter-templates
5
6 Can be triggered manually or by gerrit trigger:
7 1) gerrit trigger
8 Automatically switches if GERRIT_PROJECT variable detected
9 Always test GERRIT_REFSPEC VS GERRIT_BRANCH-master version of opposite project
10
11 2) manual run via job-build , possible to pass refspecs
12 - for CC
13 - Reclass
14
15 Example of TEST_PARAMETERS_YAML manual config:
16---
17RECLASS_SYSTEM_URL: ssh://mcp-jenkins@gerrit.mcp.mirantis.net:29418/salt-models/reclass-system
18RECLASS_SYSTEM_GIT_REF: 2018.11.0
19RECLASS_SYSTEM_BRANCH: refs/heads/2018.11.0
20COOKIECUTTER_TEMPLATE_URL: ssh://mcp-jenkins@gerrit.mcp.mirantis.net:29418/mk/cookiecutter-templates
21COOKIECUTTER_TEMPLATE_REF: refs/heads/2018.11.0
22COOKIECUTTER_TEMPLATE_BRANCH: 2018.11.0
23DISTRIB_REVISION: 2018.11.0
24TEST_MODELS: ''
25
26 */
27
28import groovy.json.JsonOutput
29
30cookiecutterTemplatesRepo='mk/cookiecutter-templates'
31reclassSystemRepo='salt-models/reclass-system'
32slaveNode = env.getProperty('SLAVE_NODE') ?: 'python&&docker'
33
Denis Egorenko76a0be82018-12-04 13:36:07 +040034voteMatrix = [
35 'test-mk-cookiecutter-templates': true,
36 'test-drivetrain': true,
37 'oscore-test-cookiecutter-models': false,
38 'test-salt-model-infra': true,
39 'test-salt-model-mcp-virtual-lab': true,
40]
41
Denis Egorenko358a4fc2018-11-27 17:57:22 +040042LinkedHashMap getManualRefParams(LinkedHashMap map) {
43 LinkedHashMap manualParams = [:]
44 String defaultGitRef = 'HEAD'
45 if (map.containsKey('RECLASS_SYSTEM_GIT_REF') && map.containsKey('RECLASS_SYSTEM_URL')) {
46 manualParams[reclassSystemRepo] = [
47 'url': map.get('RECLASS_SYSTEM_URL'),
48 'ref': map.get('RECLASS_SYSTEM_GIT_REF'),
49 'branch': map.get('RECLASS_SYSTEM_BRANCH', 'master'),
50 ]
51 }
52 if (map.containsKey('COOKIECUTTER_TEMPLATE_REF') && map.containsKey('COOKIECUTTER_TEMPLATE_URL')) {
53 manualParams[cookiecutterTemplatesRepo] = [
54 'url': map.get('COOKIECUTTER_TEMPLATE_URL'),
55 'ref': map.get('COOKIECUTTER_TEMPLATE_REF'),
56 'branch': map.get('COOKIECUTTER_TEMPLATE_BRANCH', 'master'),
57 ]
58 }
59 return manualParams
60}
61
Denis Egorenko76a0be82018-12-04 13:36:07 +040062def setGerritReviewComment(String jobName, String jobBuildURL) {
63 setGerritReview customUrl: "- ${jobName} ${jobBuildURL}console"
64}
65
66def runTests(String jobName, String extraVars) {
67 def propagateStatus = voteMatrix.get(jobName, true)
Denis Egorenko358a4fc2018-11-27 17:57:22 +040068 return {
Denis Egorenko76a0be82018-12-04 13:36:07 +040069 def jobBuild = build job: "${jobName}", propagate: false, parameters: [
70 [$class: 'TextParameterValue', name: 'EXTRA_VARIABLES_YAML', value: extraVars ]
71 ]
72 setGerritReviewComment(jobName, jobBuild.absoluteUrl)
73 if (propagateStatus && jobBuild.result == 'FAILURE') {
74 throw new Exception("Build ${jobName} is failed!")
Denis Egorenko358a4fc2018-11-27 17:57:22 +040075 }
76 }
77}
78
79def runTestSaltModelReclass(String cluster, String defaultGitUrl, String clusterGitUrl, String refSpec) {
Denis Egorenko76a0be82018-12-04 13:36:07 +040080 def saltModelJob = "test-salt-model-${cluster}"
81 def propagateStatus = voteMatrix.get(saltModelJob, true)
Denis Egorenko358a4fc2018-11-27 17:57:22 +040082 return {
Denis Egorenko76a0be82018-12-04 13:36:07 +040083 def jobBuild = build job: saltModelJob, propagate: false, parameters: [
Denis Egorenko358a4fc2018-11-27 17:57:22 +040084 [$class: 'StringParameterValue', name: 'DEFAULT_GIT_URL', value: clusterGitUrl],
85 [$class: 'StringParameterValue', name: 'DEFAULT_GIT_REF', value: "HEAD"],
86 [$class: 'StringParameterValue', name: 'SYSTEM_GIT_URL', value: defaultGitUrl],
87 [$class: 'StringParameterValue', name: 'SYSTEM_GIT_REF', value: refSpec ],
88 ]
Denis Egorenko76a0be82018-12-04 13:36:07 +040089 setGerritReviewComment(saltModelJob, jobBuild.absoluteUrl)
90 if (propagateStatus && jobBuild.result == 'FAILURE') {
91 throw new Exception("Build ${saltModelJob} is failed!")
92 }
Denis Egorenko358a4fc2018-11-27 17:57:22 +040093 }
94}
95
96def checkReclassSystemDocumentationCommit(gerritLib, gerritCredentials) {
Denis Egorenko7a806bb2018-12-03 14:37:05 +040097 gerritLib.gerritPatchsetCheckout([
Denis Egorenko358a4fc2018-11-27 17:57:22 +040098 credentialsId: gerritCredentials
99 ])
100
101 sh("git diff-tree --no-commit-id --diff-filter=d --name-only -r HEAD | grep .yml | xargs -I {} python -c \"import yaml; yaml.load(open('{}', 'r'))\" \\;")
102
103 return sh(script: "git diff-tree --no-commit-id --name-only -r HEAD | grep -v .releasenotes", returnStatus: true) == 1
104
105}
106
107timeout(time: 12, unit: 'HOURS') {
108 node(slaveNode) {
109 def common = new com.mirantis.mk.Common()
110 def gerrit = new com.mirantis.mk.Gerrit()
111 def git = new com.mirantis.mk.Git()
112 def python = new com.mirantis.mk.Python()
113
114 // Var TEST_PARAMETERS_YAML contains any additional parameters for tests,
115 // like manually specified Gerrit Refs/URLs, additional parameters and so on
Denis Egorenko76a0be82018-12-04 13:36:07 +0400116 def buildTestParams = [:]
117 def buildTestParamsYaml = env.getProperty('TEST_PARAMETERS_YAML')
118 if (buildTestParamsYaml) {
119 common.mergeEnv(env, buildTestParamsYaml)
120 buildTestParams = readYaml text: buildTestParamsYaml
Denis Egorenko358a4fc2018-11-27 17:57:22 +0400121 }
122
123 // init required job variables
124 LinkedHashMap job_env = env.getEnvironment().findAll { k, v -> v }
125
126 // Gerrit parameters
127 String gerritCredentials = job_env.get('CREDENTIALS_ID', 'gerrit')
128 String gerritRef = job_env.get('GERRIT_REFSPEC', '')
129 String gerritProject = ''
130 String gerritName = ''
131 String gerritScheme = ''
132 String gerritHost = ''
133 String gerritPort = ''
134 String gerritChangeNumber = ''
135
136 // Common and manual build parameters
137 LinkedHashMap projectsMap = [:]
Denis Egorenkoff770c62018-12-03 17:45:34 +0400138 String distribRevision = job_env.get('DISTRIB_REVISION', 'nightly')
Denis Egorenko358a4fc2018-11-27 17:57:22 +0400139 ArrayList testModels = job_env.get('TEST_MODELS', 'mcp-virtual-lab,infra').split(',')
140
141 stage('Check build mode') {
142 def buildType = ''
143 if (gerritRef) {
144 // job is triggered by Gerrit, get all required Gerrit vars
145 gerritProject = job_env.get('GERRIT_PROJECT')
146 gerritName = job_env.get('GERRIT_NAME')
147 gerritScheme = job_env.get('GERRIT_SCHEME')
148 gerritHost = job_env.get('GERRIT_HOST')
149 gerritPort = job_env.get('GERRIT_PORT')
150 gerritChangeNumber = job_env.get('GERRIT_CHANGE_NUMBER')
151 gerritBranch = job_env.get('GERRIT_BRANCH')
152
153 // check if change aren't already merged
154 def gerritChange = gerrit.getGerritChange(gerritName, gerritHost, gerritChangeNumber, gerritCredentials)
155 if (gerritChange.status == "MERGED") {
156 common.successMsg('Patch set is alredy merged, no need to test it')
157 currentBuild.result = 'SUCCESS'
158 return
159 }
160
161 projectsMap[gerritProject] = [
162 'url': "${gerritScheme}://${gerritName}@${gerritHost}:${gerritPort}/${gerritProject}",
163 'ref': gerritRef,
164 'branch': gerritBranch,
165 ]
166 buildType = 'Gerrit Trigger'
Denis Egorenko76a0be82018-12-04 13:36:07 +0400167 buildTestParams << job_env.findAll { k,v -> k ==~ /GERRIT_.+/ }
Denis Egorenko358a4fc2018-11-27 17:57:22 +0400168 } else {
169 projectsMap = getManualRefParams(job_env)
170 if (!projectsMap) {
171 error('Manual build detected and no valid Git refs provided!')
172 }
173 buildType = 'Manual build'
174 }
175 ArrayList descriptionMsgs = [ "<font color='red'>${buildType} detected!</font> Running with next parameters:" ]
176 for(String project in projectsMap.keySet()) {
Denis Egorenko7a806bb2018-12-03 14:37:05 +0400177 descriptionMsgs.add("Ref for ${project} => ${projectsMap[project]['ref']}")
178 descriptionMsgs.add("Branch for ${project} => ${projectsMap[project]['branch']}")
Denis Egorenko358a4fc2018-11-27 17:57:22 +0400179 }
180 descriptionMsgs.add("Distrib revision => ${distribRevision}")
Denis Egorenko76a0be82018-12-04 13:36:07 +0400181 currentBuild.description = descriptionMsgs.join('<br/>')
Denis Egorenko358a4fc2018-11-27 17:57:22 +0400182 }
183
184 stage("Run tests") {
185 def branches = [:]
186 branches.failFast = true
187
188 if (projectsMap.containsKey(reclassSystemRepo)) {
189 def documentationOnly = checkReclassSystemDocumentationCommit(gerrit, gerritCredentials)
190 if (['master'].contains(gerritBranch) && !documentationOnly) {
191 for (int i = 0; i < testModels.size(); i++) {
192 def cluster = testModels[i]
Denis Egorenko76a0be82018-12-04 13:36:07 +0400193 def clusterGitUrl = projectsMap[reclassSystemRepo]['url'].substring(0, projectsMap[reclassSystemRepo]['url'].lastIndexOf("/") + 1) + cluster
Denis Egorenko7a806bb2018-12-03 14:37:05 +0400194 branches["reclass-system-${cluster}"] = runTestSaltModelReclass(cluster, projectsMap[reclassSystemRepo]['url'], clusterGitUrl, projectsMap[reclassSystemRepo]['ref'])
Denis Egorenko358a4fc2018-11-27 17:57:22 +0400195 }
196 } else {
197 common.warningMsg("Tests for ${testModels} skipped!")
198 }
199 }
200 if (projectsMap.containsKey(reclassSystemRepo) || projectsMap.containsKey(cookiecutterTemplatesRepo)) {
Denis Egorenko76a0be82018-12-04 13:36:07 +0400201 branches['cookiecutter-templates'] = runTests('test-mk-cookiecutter-templates', JsonOutput.toJson(buildTestParams))
Denis Egorenko358a4fc2018-11-27 17:57:22 +0400202 }
203 if (projectsMap.containsKey(cookiecutterTemplatesRepo)) {
Denis Egorenko76a0be82018-12-04 13:36:07 +0400204 branches['test-drivetrain'] = runTests('test-drivetrain', JsonOutput.toJson(buildTestParams))
205 // TODO: enable oscore-test job once it's ready to consume EXTRA_VARIABLES_YAML
206 //branches['oscore-test-cookiecutter-models'] = runTests('oscore-test-cookiecutter-models', JsonOutput.toJson(buildTestParams))
Denis Egorenko358a4fc2018-11-27 17:57:22 +0400207 }
208
Denis Egorenko76a0be82018-12-04 13:36:07 +0400209 try {
210 parallel branches
211 } catch (Exception e) {
212 println e
213 println 'Job is in non-voting mode for now. Skipping fails.'
214 }
Denis Egorenko358a4fc2018-11-27 17:57:22 +0400215 }
216 }
217}