blob: 41eb6c9525f7149bee9eb80b2e8f7394a267aad5 [file] [log] [blame]
Dean Birch62c4f082020-01-17 16:13:26 +00001#!/usr/bin/env groovy
2//-------------------------------------------------------------------------------
Hugo L'Hostisb605c6c2021-01-06 10:05:01 +00003// Copyright (c) 2020-2021, Arm Limited and Contributors. All rights reserved.
Dean Birch62c4f082020-01-17 16:13:26 +00004//
5// SPDX-License-Identifier: BSD-3-Clause
6//
7//-------------------------------------------------------------------------------
8
Dean Birchd0f9f8c2020-03-26 11:10:33 +00009@Library('trustedfirmware') _
10import org.trustedfirmware.Gerrit
11import org.trustedfirmware.Summary
Dean Bircha6ede7e2020-03-13 14:00:33 +000012
Mark Horvath8d281cd2020-12-07 15:20:26 +010013mapPlatform = ["cypress/psoc64": "psoc64",
14 "mps2/an519": "AN519",
15 "mps2/an521": "AN521",
16 "mps2/an539": "AN539",
17 "mps2/sse-200_aws": "SSE-200_AWS",
18 "mps3/an524": "AN524",
19 "musca_a": "MUSCA_A",
20 "musca_b1/sse_200": "MUSCA_B1",
21 "musca_b1/secure_enclave": "MUSCA_B1_SE",
22 "musca_s1": "MUSCA_S1"]
Xinyu Zhang5c4bbca2020-09-24 16:36:03 +080023
24mapCompiler = ["toolchain_GNUARM.cmake": "GNUARM",
25 "toolchain_ARMCLANG.cmake": "ARMCLANG"]
26
27mapBL2 = ["True": "--bl2",
28 "False": ""]
29
30mapTestPsaApi = ["OFF": "",
31 "INTERNAL_TRUSTED_STORAGE": "ITS",
32 "PROTECTED_STORAGE": "PS",
33 "CRYPTO": "Crypto",
34 "INITIAL_ATTESTATION": "Attest",
35 "IPC": "FF"]
36
Xinyu Zhangdbfadae2020-12-07 14:42:59 +080037// BL2, NS, PSA_API, ISOLATION_LEVEL, TEST_REG, TEST_PSA_API, PROFILE, CONFIG_NAME
Xinyu Zhang4f2ef5a2020-11-09 18:11:43 +080038mapConfigs = [
39 ["True", "True", "False", "1", "False", "OFF", "N.A", "Default"],
40 ["True", "True", "True", "1", "False", "OFF", "N.A", "CoreIPC"],
41 ["True", "True", "True", "2", "False", "OFF", "N.A", "CoreIPCTfmLevel2"],
42 ["True", "True", "True", "3", "False", "OFF", "N.A", "CoreIPCTfmLevel3"],
43 ["True", "True", "False", "1", "False", "OFF", "profile_small", "DefaultProfileS"],
44 ["True", "True", "True", "2", "False", "OFF", "profile_medium", "DefaultProfileM"],
45 ["True", "True", "False", "1", "True", "OFF", "N.A", "Regression"],
46 ["True", "True", "True", "1", "True", "OFF", "N.A", "RegressionIPC"],
47 ["True", "True", "True", "2", "True", "OFF", "N.A", "RegressionIPCTfmLevel2"],
48 ["True", "True", "True", "3", "True", "OFF", "N.A", "RegressionIPCTfmLevel3"],
49 ["True", "True", "False", "1", "True", "OFF", "profile_small", "RegressionProfileS"],
50 ["True", "True", "True", "2", "True", "OFF", "profile_medium", "RegressionProfileM"],
51 ["True", "True", "False", "1", "False", "INTERNAL_TRUSTED_STORAGE", "N.A", "PsaApiTest (ITS)"],
52 ["True", "True", "False", "1", "False", "PROTECTED_STORAGE", "N.A", "PsaApiTest (PS)"],
53 ["True", "True", "False", "1", "False", "CRYPTO", "N.A", "PsaApiTest (Crypto)"],
54 ["True", "True", "False", "1", "False", "INITIAL_ATTESTATION", "N.A", "PsaApiTest (Attest)"],
55 ["True", "True", "False", "1", "False", "IPC", "N.A", "PsaApiTest (FF)"],
56 ["True", "True", "True", "1", "False", "INTERNAL_TRUSTED_STORAGE", "N.A", "PsaApiTestIPC (ITS)"],
57 ["True", "True", "True", "1", "False", "PROTECTED_STORAGE", "N.A", "PsaApiTestIPC (PS)"],
58 ["True", "True", "True", "1", "False", "CRYPTO", "N.A", "PsaApiTestIPC (Crypto)"],
59 ["True", "True", "True", "1", "False", "INITIAL_ATTESTATION", "N.A", "PsaApiTestIPC (Attest)"],
60 ["True", "True", "True", "1", "False", "IPC", "N.A", "PsaApiTestIPC (FF)"],
61 ["True", "True", "True", "2", "False", "INTERNAL_TRUSTED_STORAGE", "N.A", "PsaApiTestIPCTfmLevel2 (ITS)"],
62 ["True", "True", "True", "2", "False", "PROTECTED_STORAGE", "N.A", "PsaApiTestIPCTfmLevel2 (PS)"],
63 ["True", "True", "True", "2", "False", "CRYPTO", "N.A", "PsaApiTestIPCTfmLevel2 (Crypto)"],
64 ["True", "True", "True", "2", "False", "INITIAL_ATTESTATION", "N.A", "PsaApiTestIPCTfmLevel2 (Attest)"],
65 ["True", "True", "True", "2", "False", "IPC", "N.A", "PsaApiTestIPCTfmLevel2 (FF)"],
66 ["True", "True", "True", "3", "False", "INTERNAL_TRUSTED_STORAGE", "N.A", "PsaApiTestIPCTfmLevel3 (ITS)"],
67 ["True", "True", "True", "3", "False", "PROTECTED_STORAGE", "N.A", "PsaApiTestIPCTfmLevel3 (PS)"],
68 ["True", "True", "True", "3", "False", "CRYPTO", "N.A", "PsaApiTestIPCTfmLevel3 (Crypto)"],
69 ["True", "True", "True", "3", "False", "INITIAL_ATTESTATION", "N.A", "PsaApiTestIPCTfmLevel3 (Attest)"],
70 ["True", "True", "True", "3", "False", "IPC", "N.A", "PsaApiTestIPCTfmLevel3 (FF)"],
71]
72
73cfgs = ["Default", "CoreIPC", "CoreIPCTfmLevel2", "CoreIPCTfmLevel3",
74 "Regression", "RegressionIPC",
75 "RegressionIPCTfmLevel2", "RegressionIPCTfmLevel3",
76 "DefaultProfileS", "RegressionProfileS",
77 "DefaultProfileM", "RegressionProfileM", "RegressionProfileM PSOFF",
78 "PsaApiTest (Attest)", "PsaApiTestIPC (Attest)",
79 "PsaApiTestIPCTfmLevel2 (Attest)",
80 "PsaApiTest (Crypto)", "PsaApiTestIPC (Crypto)",
81 "PsaApiTestIPCTfmLevel2 (Crypto)",
82 "PsaApiTest (PS)", "PsaApiTestIPC (PS)",
83 "PsaApiTestIPCTfmLevel2 (PS)",
84 "PsaApiTest (ITS)", "PsaApiTestIPC (ITS)",
85 "PsaApiTestIPCTfmLevel2 (ITS)",
86 "PsaApiTestIPC (FF)",
87 "PsaApiTestIPCTfmLevel2 (FF)",
88 "PsaApiTestIPCTfmLevel3 (ITS)", "PsaApiTestIPCTfmLevel3 (PS)",
89 "PsaApiTestIPCTfmLevel3 (Crypto)", "PsaApiTestIPCTfmLevel3 (Attest)",
90 "PsaApiTestIPCTfmLevel3 (FF)"]
91
Xinyu Zhangaa3747f2020-12-24 16:27:06 +080092@NonCPS
Xinyu Zhang5c4bbca2020-09-24 16:36:03 +080093def generateLavaParam(build_params) {
94 def params = []
95 params += string(name: "TARGET_PLATFORM", \
96 value: mapPlatform[build_params["TFM_PLATFORM"]])
97 params += string(name: "COMPILER", \
98 value: mapCompiler[build_params["TOOLCHAIN_FILE"]])
99 params += string(name: "PSA_API_SUITE", \
100 value: mapTestPsaApi[build_params["TEST_PSA_API"]])
101
Xinyu Zhangdbfadae2020-12-07 14:42:59 +0800102 configName = "Config"
103 config_params = [build_params["BL2"], build_params["NS"], \
104 build_params["PSA_API"], build_params["ISOLATION_LEVEL"], \
105 build_params["TEST_REGRESSION"], build_params["TEST_PSA_API"], \
106 build_params["PROFILE"]]
107 for (config in mapConfigs) {
108 if (config_params == config[0..6]) {
Xinyu Zhangfc1bacd2020-12-24 15:26:35 +0800109 configName += config[7].replace(' (', '_').replace(')', '')
Xinyu Zhangdbfadae2020-12-07 14:42:59 +0800110 break
111 }
Xinyu Zhang5c4bbca2020-09-24 16:36:03 +0800112 }
Xinyu Zhangdbfadae2020-12-07 14:42:59 +0800113 if (configName == "Config") {
114 configName = "ConfigDefault"
115 }
116 params += string(name: "PROJ_CONFIG", value: configName)
Xinyu Zhangaa3747f2020-12-24 16:27:06 +0800117 print("Params of ${configName} :")
118 print(config_params)
Xinyu Zhang5c4bbca2020-09-24 16:36:03 +0800119 return params
120}
121
Dean Birch62c4f082020-01-17 16:13:26 +0000122def listConfigs(ci_scripts_dir, config_list, filter_group) {
123 dir(ci_scripts_dir) {
124 echo "Obtaining list of configs."
Matthew Hartfb6fd362020-03-04 21:03:59 +0000125 echo "Running: python3 ./configs.py -g ${filter_group.replace(" ", " -g ")}"
Dean Birch62c4f082020-01-17 16:13:26 +0000126 def build_config_list_raw = sh(script: """\
Matthew Hartfb6fd362020-03-04 21:03:59 +0000127python3 ./configs.py -g ${filter_group.replace(" ", " -g ")}
Dean Birch62c4f082020-01-17 16:13:26 +0000128""", returnStdout: true).trim()
129 def build_config_list = build_config_list_raw.tokenize('\n')
130 config_list.addAll(build_config_list)
131 }
132}
133
Matthew Hartfb6fd362020-03-04 21:03:59 +0000134def buildConfig(ci_scripts_dir, config, filter_group, results) {
Dean Birch62c4f082020-01-17 16:13:26 +0000135 def params = []
Matthew Hartfb6fd362020-03-04 21:03:59 +0000136 def params_collection = [:]
Dean Birch62c4f082020-01-17 16:13:26 +0000137 def build_config_params
138 dir(ci_scripts_dir) {
139 echo "Obtaining build configuration for config ${config}"
Matthew Hartfb6fd362020-03-04 21:03:59 +0000140 echo "Running: python3 ./configs.py -g ${filter_group.replace(" ", " -g ")} ${config}"
Dean Birch62c4f082020-01-17 16:13:26 +0000141 build_config_params = sh(script: """\
Matthew Hartfb6fd362020-03-04 21:03:59 +0000142python3 ./configs.py -g ${filter_group.replace(" ", " -g ")} ${config}
Dean Birch62c4f082020-01-17 16:13:26 +0000143""", returnStdout: true).trim()
144 }
145 def lines = build_config_params.tokenize('\n')
146 for (String line : lines) {
147 def key, value
148 (key, value) = line.tokenize('=')
149 params += string(name: key, value: value)
Matthew Hartfb6fd362020-03-04 21:03:59 +0000150 params_collection[key] = value
Dean Birch62c4f082020-01-17 16:13:26 +0000151 }
152 params += string(name: 'GERRIT_BRANCH', value: env.GERRIT_BRANCH)
Dean Birchd0f9f8c2020-03-26 11:10:33 +0000153 params += string(name: 'GERRIT_HOST', value: env.GERRIT_HOST)
154 params += string(name: 'GERRIT_CHANGE_NUMBER', value: env.GERRIT_CHANGE_NUMBER)
155 params += string(name: 'GERRIT_PATCHSET_REVISION', value: env.GERRIT_PATCHSET_REVISION)
Dean Birch62c4f082020-01-17 16:13:26 +0000156 params += string(name: 'GERRIT_REFSPEC', value: env.GERRIT_REFSPEC)
Karl Zhang02d30352020-08-20 13:48:52 +0800157 params += string(name: 'MBEDTLS_VERSION', value: env.MBEDTLS_VERSION)
Dean Birch62c4f082020-01-17 16:13:26 +0000158 params += string(name: 'CODE_REPO', value: env.CODE_REPO)
Karl Zhangf6f467e2020-07-10 16:24:45 +0800159 params += string(name: 'CODE_COVERAGE_EN', value: env.CODE_COVERAGE_EN)
Colin Thorbinson58703db2020-11-24 12:02:19 +0000160 params += string(name: 'CI_SCRIPTS_BRANCH', value: env.CI_SCRIPTS_BRANCH)
Hugo L'Hostisb605c6c2021-01-06 10:05:01 +0000161 if (env.JOB_NAME.equals("tf-m-nightly")) { //Setting the Memory footprint gathering.
162 params += string(name: 'SQUAD_CONFIGURATIONS', value: env.SQUAD_CONFIGURATIONS)
163 }
Dean Bircha6ede7e2020-03-13 14:00:33 +0000164 return { -> results
165 def build_res = build(job: 'tf-m-build-config', parameters: params, propagate: false)
166 def build_info = [build_res, config, params_collection]
167 results['builds'][build_res.number] = build_info
168 def build_url = build_res.getAbsoluteUrl()
169 print("${build_res.number}: ${config} ${build_res.result} ${build_url}")
170 failure_states = ["FAILURE", "ABORTED", "UNSTABLE", "NOT_BUILT"]
171 if (build_res.result in failure_states) {
172 error("Build failed at ${build_url}")
173 }
Karl Zhang2b10b342020-11-09 14:50:11 +0800174 else if (params_collection["NS"] == "False" || \
Xinyu Zhang661a17a2021-01-05 19:24:40 +0800175 params_collection["OTP"] == "ENABLED" || \
Karl Zhang0b7bb4a2021-01-18 16:22:08 +0800176 (params_collection["TFM_PLATFORM"].contains("musca_b1") && \
177 env.JOB_NAME.equals("tf-m-build-and-test")) || \
Xinyu Zhang661a17a2021-01-05 19:24:40 +0800178 (params_collection["PROFILE"] == "profile_medium" && \
179 params_collection["PARTITION_PS"] == "OFF")) {
Xinyu Zhang5c4bbca2020-09-24 16:36:03 +0800180 print("LAVA is not needed for ${build_url}")
181 }
Dean Bircha6ede7e2020-03-13 14:00:33 +0000182 else {
183 print("Doing LAVA stuff for ${build_url}")
Xinyu Zhangaa3747f2020-12-24 16:27:06 +0800184 params += generateLavaParam(params_collection)
Dean Bircha6ede7e2020-03-13 14:00:33 +0000185 params += string(name: 'BUILD_NUMBER', value: "${build_res.number}")
186 params += string(name: 'BUILD_URL', value: build_url)
Matthew Hartfb6fd362020-03-04 21:03:59 +0000187 params += string(name: 'LAVA_URL', value: env.LAVA_URL)
Dean Birch956416f2020-08-12 10:36:16 +0100188 params += string(name: 'CI_SCRIPTS_BRANCH', value: env.CI_SCRIPTS_BRANCH)
189 params += string(name: 'LAVA_CREDENTIALS', value: env.LAVA_CREDENTIALS)
Dean Bircha6ede7e2020-03-13 14:00:33 +0000190 def lava_res = build(job: 'tf-m-lava-submit', parameters: params, propagate: false)
Matthew Hartfb6fd362020-03-04 21:03:59 +0000191 if (lava_res.result in failure_states) {
192 error("LAVA Create and Submit failed at ${lava_res.getAbsoluteUrl()}")
193 }
194 else {
195 results['lava_jobs'] += lava_res.getDescription()
196 }
Xinyu Zhang97ee3fd2020-12-14 14:45:06 +0800197 links = "Build Config: ${config}\n"
198 links += "Build URL: ${build_url}\n"
199 links += "LAVA Submit: ${lava_res.getAbsoluteUrl()}"
200 print(links)
Dean Birch62c4f082020-01-17 16:13:26 +0000201 }
202 }
203}
204
Matthew Hart06340d72020-06-15 16:08:20 +0100205def buildDocs(results) {
Dean Birch62c4f082020-01-17 16:13:26 +0000206 def params = []
207 params += string(name: 'GERRIT_BRANCH', value: env.GERRIT_BRANCH)
Dean Birchd0f9f8c2020-03-26 11:10:33 +0000208 params += string(name: 'GERRIT_HOST', value: env.GERRIT_HOST)
209 params += string(name: 'GERRIT_CHANGE_NUMBER', value: env.GERRIT_CHANGE_NUMBER)
210 params += string(name: 'GERRIT_PATCHSET_REVISION', value: env.GERRIT_PATCHSET_REVISION)
Dean Birch62c4f082020-01-17 16:13:26 +0000211 params += string(name: 'GERRIT_REFSPEC', value: env.GERRIT_REFSPEC)
Karl Zhang02d30352020-08-20 13:48:52 +0800212 params += string(name: 'MBEDTLS_VERSION', value: env.MBEDTLS_VERSION)
Dean Birch62c4f082020-01-17 16:13:26 +0000213 params += string(name: 'CODE_REPO', value: env.CODE_REPO)
Colin Thorbinson58703db2020-11-24 12:02:19 +0000214 params += string(name: 'CI_SCRIPTS_BRANCH', value: env.CI_SCRIPTS_BRANCH)
Matthew Hart06340d72020-06-15 16:08:20 +0100215 return { -> results
Dean Birch62c4f082020-01-17 16:13:26 +0000216 def res = build(job: 'tf-m-build-docs', parameters: params, propagate:false)
217 print("${res.number}: Docs ${res.result} ${res.getAbsoluteUrl()}")
Matthew Hart06340d72020-06-15 16:08:20 +0100218 results['docs'] = [res.number, res.result, params]
Dean Bircha6ede7e2020-03-13 14:00:33 +0000219 if (res.result in ["FAILURE", "ABORTED", "UNSTABLE", "NOT_BUILT"]) {
Dean Birch62c4f082020-01-17 16:13:26 +0000220 error("Build failed at ${res.getAbsoluteUrl()}")
221 }
222 }
223}
224
Xinyu Zhang38a18872020-11-23 16:45:28 +0800225def generateEmailBody(stage, failed_jobs) {
226 body = "Check console output at ${env.BUILD_URL} \n\n"
227
228 body += "Failed Jobs:\n"
229 failed_jobs.each { job ->
230 body += "${job.key} ${job.value}\n"
231 }
232
233 body += "\nFor detailed ${stage} results please refer to \
234 ${env.BUILD_URL}artifact/${stage}_results.csv \n"
235 return body
236}
237
238def emailNotification(results, stage, failed_jobs) {
Karl Zhang0413e972020-09-18 17:59:26 +0800239 script {
240 if (env.JOB_NAME.equals("tf-m-nightly") && !env.EMAIL_NOTIFICATION.equals('')) {
241 def result = "Fail."
Karl Zhang182ecdf2020-10-10 09:52:12 +0800242 if (results == true) {
Karl Zhang0413e972020-09-18 17:59:26 +0800243 result = "Success."
Karl Zhang182ecdf2020-10-10 09:52:12 +0800244 print("Skip sending as ${result} for ${stage}")
245 }
246 else {
247 emailext (
248 subject: ("Job ${env.JOB_NAME} ${stage} ${env.BUILD_NUMBER} ${result}"),
Xinyu Zhang38a18872020-11-23 16:45:28 +0800249 body: generateEmailBody(stage, failed_jobs),
Karl Zhang182ecdf2020-10-10 09:52:12 +0800250 to: "${EMAIL_NOTIFICATION}"
251 )
252 }
Karl Zhang0413e972020-09-18 17:59:26 +0800253 }
254 } /* script */
255}
256
Xinyu Zhang38a18872020-11-23 16:45:28 +0800257def filterFailedBuild(results) {
258 def failed_builds = [:]
259 results.each { result ->
260 if (result.value[0].getResult() == "FAILURE") {
261 failed_builds[result.value[1]] = result.value[0].getAbsoluteUrl()
262 }
263 }
264 return failed_builds
265}
266
267def filterFailedTest(string) {
268 def failed_tests = [:]
269 line = lineInString(string, "FAILURE_TESTS:")
270 a = line.split(' ')
271 if (a.size() > 1) {
272 a = line.split(' ')[1..-1]
273 a.each { fail_test ->
274 config_link = fail_test.split(':')
275 failed_tests[config_link[0]] = config_link[1..-1].join(':')
276 }
277 }
278 return failed_tests
279}
280
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800281@NonCPS
282def generateCsvContent(results) {
283 def resultsParam = []
284 results.each { result ->
Xinyu Zhang4f2ef5a2020-11-09 18:11:43 +0800285 if (result.value[2]['BL2'] == "True") {
286 resultsParam.add([result.value[1], \
287 result.value[0].getResult(), \
288 result.value[2]['TFM_PLATFORM'], \
289 result.value[2]['TOOLCHAIN_FILE'], \
290 result.value[2]['CMAKE_BUILD_TYPE'], \
291 result.value[2]['BL2'], \
292 result.value[2]['NS'], \
293 result.value[2]['PSA_API'], \
294 result.value[2]['ISOLATION_LEVEL'], \
295 result.value[2]['TEST_REGRESSION'], \
296 result.value[2]['TEST_PSA_API'], \
297 result.value[2]['PROFILE'], \
298 result.value[2]['PARTITION_PS'], \
299 result.value[2]['OTP']])
300 }
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800301 }
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800302 resultsParam.each { result ->
Xinyu Zhang18a73542020-12-24 14:19:07 +0800303 if (result[2] == 'musca_b1/sse_200') {
Xinyu Zhang4f2ef5a2020-11-09 18:11:43 +0800304 if (result[13] != 'off') {
Xinyu Zhang18a73542020-12-24 14:19:07 +0800305 result[2] = 'musca_b1/sse_200_OTP'
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800306 }
307 }
Xinyu Zhang4f2ef5a2020-11-09 18:11:43 +0800308 result[3] = mapCompiler[result[3]]
309 build_params = result[5..12]
310 configName = ""
311 for (map_cfg in mapConfigs) {
312 if (build_params[0..6] == map_cfg[0..6]) {
313 configName = map_cfg[7]
314 break
315 }
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800316 }
Xinyu Zhang4f2ef5a2020-11-09 18:11:43 +0800317 if (configName == "") {
318 configName = "Default"
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800319 }
Xinyu Zhang4f2ef5a2020-11-09 18:11:43 +0800320 else if (configName == "RegressionProfileM") {
321 if (build_params[7] == "OFF") {
322 configName = "RegressionProfileM PSOFF"
323 }
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800324 }
Xinyu Zhang4f2ef5a2020-11-09 18:11:43 +0800325 result.add(configName)
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800326 }
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800327 def csvContent = []
328 resultsParam.each { result ->
Xinyu Zhang4f2ef5a2020-11-09 18:11:43 +0800329 current_row = result[2..4]
330 cfgs.each {cfg ->
331 if (cfg == result[14]) {
332 current_row.add(cfg)
333 current_row.add(result[1])
334 }
335 }
336 csvContent.add(current_row)
337 }
338 csvContent.sort{a,b -> a[0] <=> b[0] ?: a[1] <=> b[1] ?: a[2] <=> b[2]}
339 build_summary = []
340 current_platform = ""
341 current_compiler = ""
342 current_build_type = ""
343 csvContent.each { build_cfg ->
344 if (current_platform != build_cfg[0] || \
345 current_compiler != build_cfg[1] || \
346 current_build_type != build_cfg[2]) {
347 current_platform = build_cfg[0]
348 current_compiler = build_cfg[1]
349 current_build_type = build_cfg[2]
350 csv_line = [current_platform, current_compiler, current_build_type]
351 cfgs.each {
352 csv_line.add("N.A.")
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800353 }
Xinyu Zhang4f2ef5a2020-11-09 18:11:43 +0800354 build_summary.add(csv_line)
355 }
356 i = 0
357 cfgs.each { cfg ->
358 if (cfg == build_cfg[3]) {
359 build_summary[-1][3+i] = build_cfg[4]
360 }
361 i += 1
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800362 }
363 }
Xinyu Zhang4f2ef5a2020-11-09 18:11:43 +0800364 build_summary.add(0, ['Platform', 'Compiler', 'Cmake Build Type'])
365 build_summary[0] += cfgs
366 return build_summary
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800367}
368
369def generateBuildCsv(results) {
370 def csvContent = generateCsvContent(results)
371 node("master") {
372 writeCSV file: 'build_results.csv', records: csvContent, format: CSVFormat.EXCEL
373 archiveArtifacts 'build_results.csv'
374 }
375}
Dean Bircha6ede7e2020-03-13 14:00:33 +0000376
377def buildCsv(results) {
Dean Birchd0f9f8c2020-03-26 11:10:33 +0000378 def summary = new Summary();
Dean Bircha6ede7e2020-03-13 14:00:33 +0000379 def csvContent = summary.getBuildCsv(results)
380 node("master") {
381 writeCSV file: 'build_results.csv', records: csvContent, format: CSVFormat.EXCEL
382 archiveArtifacts 'build_results.csv'
383 }
384}
385
386def writeSummary(results) {
Dean Birchd0f9f8c2020-03-26 11:10:33 +0000387 def summary = new Summary();
Dean Bircha6ede7e2020-03-13 14:00:33 +0000388 def buildLinks = summary.getLinks(results)
389 node("master") {
390 writeFile file: "build_links.html", text: buildLinks
391 archiveArtifacts 'build_links.html'
392 }
393}
394
Matthew Hartfb6fd362020-03-04 21:03:59 +0000395def lineInString(string, match) {
396 def lines = string.split("\n")
397 def result = lines.findAll { it.contains(match) }
398 return result[0]
399}
400
Xinyu Zhang97ee3fd2020-12-14 14:45:06 +0800401def showLinks(string) {
402 def lines = string.split("\n")
403 def result = lines.findAll { it.contains("Build Config: ")}
404 links = result.join("\n")
405 print(links)
406}
407
Matthew Hartfb6fd362020-03-04 21:03:59 +0000408def getResult(string, match) {
409 line = lineInString(string, match)
Dean Birch1d545c02020-05-29 14:09:21 +0100410 a = line.split(match)[1].split(' ')
411 score = a[0]
412 if (a.size() > 1)
413 {
414 fail_text = a[1..-1].join(" ")
415 return [score, fail_text]
416 }
417 return [score, ""]
Matthew Hartfb6fd362020-03-04 21:03:59 +0000418}
419
420def submitJobsToList(results) {
421 def all_jobs = []
422 for (String result : results){
423 jobs_s = result.split('JOBS: ')
424 if (jobs_s.size() > 1) {
425 all_jobs += jobs_s[1]
426 }
427 }
428 return(all_jobs)
429}
430
Dean Birch62c4f082020-01-17 16:13:26 +0000431def configs = []
432def builds = [:]
Matthew Hartfb6fd362020-03-04 21:03:59 +0000433def results = [:]
Dean Birch62c4f082020-01-17 16:13:26 +0000434
Benjamin Copelandbe53b032020-10-30 19:57:59 +0000435node("docker-amd64-tf-m-bionic") {
Dean Birch62c4f082020-01-17 16:13:26 +0000436 stage("Init") {
437 cleanWs()
438 dir("tf-m-ci-scripts") {
Colin Thorbinson58703db2020-11-24 12:02:19 +0000439 checkout([$class: 'GitSCM', branches: [[name: '$CI_SCRIPTS_BRANCH']], userRemoteConfigs: [[credentialsId: 'GIT_SSH_KEY', url: '$CI_SCRIPTS_REPO']]])
Dean Birch62c4f082020-01-17 16:13:26 +0000440 }
441 }
442 stage("Configs") {
443 // Populate configs
444 listConfigs('tf-m-ci-scripts', configs, env.FILTER_GROUP)
Dean Bircha6ede7e2020-03-13 14:00:33 +0000445 results['builds'] = [:]
446 results['lava_jobs'] = []
Dean Birch62c4f082020-01-17 16:13:26 +0000447 for (config in configs) {
Matthew Hartfb6fd362020-03-04 21:03:59 +0000448 builds[config] = buildConfig("tf-m-ci-scripts", config, env.FILTER_GROUP, results)
Dean Birch62c4f082020-01-17 16:13:26 +0000449 }
Matthew Hart06340d72020-06-15 16:08:20 +0100450 builds["docs"] = buildDocs(results)
Dean Birch62c4f082020-01-17 16:13:26 +0000451 }
452}
Karl Zhangfec84102020-06-24 09:56:36 +0800453
Dean Birch62c4f082020-01-17 16:13:26 +0000454stage("Builds") {
455 def verify = 1
Karl Zhang182ecdf2020-10-10 09:52:12 +0800456 def success = true
Dean Birch62c4f082020-01-17 16:13:26 +0000457 try {
458 parallel(builds)
459 } catch (Exception e) {
Dean Bircha6ede7e2020-03-13 14:00:33 +0000460 print(e)
Dean Birch62c4f082020-01-17 16:13:26 +0000461 manager.buildFailure()
462 verify = -1
Karl Zhang182ecdf2020-10-10 09:52:12 +0800463 success = false
Dean Birch62c4f082020-01-17 16:13:26 +0000464 } finally {
Dean Bircha6ede7e2020-03-13 14:00:33 +0000465 print("Verifying status")
Xinyu Zhang38a18872020-11-23 16:45:28 +0800466 def failed_builds = filterFailedBuild(results['builds'])
467 emailNotification(success, 'build', failed_builds)
Dean Birchd0f9f8c2020-03-26 11:10:33 +0000468 g = new Gerrit()
469 g.verifyStatus(verify, 'tf-m-build', 'build')
Dean Bircha6ede7e2020-03-13 14:00:33 +0000470 print("Building CSV")
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800471 generateBuildCsv(results['builds'])
Dean Bircha6ede7e2020-03-13 14:00:33 +0000472 writeSummary(results['builds'])
Dean Birch62c4f082020-01-17 16:13:26 +0000473 }
474}
Matthew Hart06340d72020-06-15 16:08:20 +0100475
Benjamin Copelandbe53b032020-10-30 19:57:59 +0000476node("docker-amd64-tf-m-bionic") {
Matthew Hart06340d72020-06-15 16:08:20 +0100477 stage("Copy Docs") {
Karl Zhang32497972020-09-21 14:38:29 +0800478 if (env.JOB_NAME.equals("tf-m-build-and-test")) {
479 step([$class: 'CopyArtifact', projectName: 'tf-m-build-docs',
480 selector: specific("${results['docs'][0]}"), target: './docs/',
481 optional: true])
482 archiveArtifacts artifacts: 'docs/**', allowEmptyArchive: true
483 }
484 else {
485 print("No doc copy for job: ${env.JOB_NAME}")
486 }
Matthew Hart06340d72020-06-15 16:08:20 +0100487 }
Dean Bircha6ede7e2020-03-13 14:00:33 +0000488 stage("Tests") {
489 dir("tf-m-ci-scripts") {
Colin Thorbinson58703db2020-11-24 12:02:19 +0000490 checkout([$class: 'GitSCM', branches: [[name: '$CI_SCRIPTS_BRANCH']], userRemoteConfigs: [[credentialsId: 'GIT_SSH_KEY', url: '$CI_SCRIPTS_REPO']]])
Dean Bircha6ede7e2020-03-13 14:00:33 +0000491 }
Matthew Hartfb6fd362020-03-04 21:03:59 +0000492 def all_jobs = []
493 def success = true
Dean Bircha6ede7e2020-03-13 14:00:33 +0000494 print("Wait for LAVA results here...")
Matthew Hartfb6fd362020-03-04 21:03:59 +0000495 try {
496 all_jobs = submitJobsToList(results['lava_jobs'])
497 if (all_jobs.size() > 0) {
498 dir("tf-m-ci-scripts") {
Dean Birch956416f2020-08-12 10:36:16 +0100499 withCredentials([usernamePassword(credentialsId: env.LAVA_CREDENTIALS, passwordVariable: 'LAVA_TOKEN', usernameVariable: 'LAVA_USER')]) {
Matthew Hartfb6fd362020-03-04 21:03:59 +0000500 output = sh(script: """./lava_helper/lava_wait_jobs.py --job-ids ${all_jobs.join(",")} \
501 --lava-url ${env.LAVA_URL} --lava-user ${LAVA_USER} --lava-token ${LAVA_TOKEN} \
Matthew Hart05a59b52020-05-27 17:54:51 +0100502 --artifacts-path lava_artifacts --lava-timeout 7200 \
Matthew Hartfb6fd362020-03-04 21:03:59 +0000503 """, returnStdout: true).trim()
Xinyu Zhang97ee3fd2020-12-14 14:45:06 +0800504 showLinks(output)
Matthew Hartfb6fd362020-03-04 21:03:59 +0000505 archiveArtifacts artifacts: 'test_summary.*', allowEmptyArchive: true
Xinyu Zhang1b8f5152020-11-13 16:10:58 +0800506 archiveArtifacts artifacts: 'test_results.csv', allowEmptyArchive: true
Matthew Hartfb6fd362020-03-04 21:03:59 +0000507 g = new Gerrit()
Dean Birch1d545c02020-05-29 14:09:21 +0100508 def (boot_result, boot_output) = getResult(output, 'BOOT_RESULT: ')
Matthew Hartfb6fd362020-03-04 21:03:59 +0000509 if (boot_result) {
510 g.verifyStatus(boot_result, "lava_boot", "test")
511 }
Dean Birch1d545c02020-05-29 14:09:21 +0100512 def (test_result, test_output) = getResult(output, 'TEST_RESULT: ')
Matthew Hartfb6fd362020-03-04 21:03:59 +0000513 if (test_result) {
514 g.verifyStatus(test_result, "lava_test", "test")
515 }
516 if (boot_result.toInteger() < 1 || test_result.toInteger() < 1) {
Dean Birch1d545c02020-05-29 14:09:21 +0100517 error("Marking job as failed due to failed boots: ${boot_output} or tests: ${test_output}")
Matthew Hartfb6fd362020-03-04 21:03:59 +0000518 }
519 }
520 }
521 }
522 else {
523 print("There were no LAVA jobs to test.")
524 }
525 }
526 catch (Exception e) {
527 print("ERROR: ${e}")
528 success = false
529 } finally {
530 archiveArtifacts artifacts: 'tf-m-ci-scripts/lava_artifacts/**', allowEmptyArchive: true
Xinyu Zhang91609012020-12-09 17:35:49 +0800531 if (all_jobs.size() > 0) {
532 emailNotification(success, 'test', filterFailedTest(output))
533 }
Matthew Hartfb6fd362020-03-04 21:03:59 +0000534 cleanWs()
535 if (!success) {
536 error("There was an Error waiting for LAVA jobs")
537 }
Dean Bircha6ede7e2020-03-13 14:00:33 +0000538 }
539 }
Dean Bircha6ede7e2020-03-13 14:00:33 +0000540}