blob: 0f8f0562676469cf070e617d3f72069ce390ce00 [file] [log] [blame]
Dean Birch62c4f082020-01-17 16:13:26 +00001#!/usr/bin/env groovy
2//-------------------------------------------------------------------------------
Xinyu Zhang97114342021-01-21 14:08:03 +08003// 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
Summer Qin3c2b5722021-05-26 10:43:45 +080013mapPlatform = ["cypress/psoc64": "psoc64",
14 "arm/mps2/an519": "AN519",
15 "arm/mps2/an521": "AN521",
16 "arm/mps2/an539": "AN539",
17 "arm/mps2/sse-200_aws": "SSE-200_AWS",
18 "arm/mps3/an524": "AN524",
19 "arm/musca_b1/sse_200": "MUSCA_B1",
20 "arm/musca_b1/secure_enclave": "MUSCA_B1_SE",
21 "arm/musca_s1": "MUSCA_S1"]
Xinyu Zhang5c4bbca2020-09-24 16:36:03 +080022
23mapCompiler = ["toolchain_GNUARM.cmake": "GNUARM",
24 "toolchain_ARMCLANG.cmake": "ARMCLANG"]
25
26mapBL2 = ["True": "--bl2",
27 "False": ""]
28
29mapTestPsaApi = ["OFF": "",
30 "INTERNAL_TRUSTED_STORAGE": "ITS",
31 "PROTECTED_STORAGE": "PS",
32 "CRYPTO": "Crypto",
33 "INITIAL_ATTESTATION": "Attest",
34 "IPC": "FF"]
35
Xinyu Zhangdbfadae2020-12-07 14:42:59 +080036// BL2, NS, PSA_API, ISOLATION_LEVEL, TEST_REG, TEST_PSA_API, PROFILE, CONFIG_NAME
Xinyu Zhang4f2ef5a2020-11-09 18:11:43 +080037mapConfigs = [
38 ["True", "True", "False", "1", "False", "OFF", "N.A", "Default"],
39 ["True", "True", "True", "1", "False", "OFF", "N.A", "CoreIPC"],
40 ["True", "True", "True", "2", "False", "OFF", "N.A", "CoreIPCTfmLevel2"],
41 ["True", "True", "True", "3", "False", "OFF", "N.A", "CoreIPCTfmLevel3"],
42 ["True", "True", "False", "1", "False", "OFF", "profile_small", "DefaultProfileS"],
43 ["True", "True", "True", "2", "False", "OFF", "profile_medium", "DefaultProfileM"],
Xinyu Zhang9b1aef92021-03-12 15:36:44 +080044 ["True", "True", "True", "3", "False", "OFF", "profile_large", "DefaultProfileL"],
Xinyu Zhang4f2ef5a2020-11-09 18:11:43 +080045 ["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"],
Xinyu Zhang9b1aef92021-03-12 15:36:44 +080051 ["True", "True", "True", "3", "True", "OFF", "profile_large", "RegressionProfileL"],
Xinyu Zhang4f2ef5a2020-11-09 18:11:43 +080052 ["True", "True", "False", "1", "False", "INTERNAL_TRUSTED_STORAGE", "N.A", "PsaApiTest (ITS)"],
53 ["True", "True", "False", "1", "False", "PROTECTED_STORAGE", "N.A", "PsaApiTest (PS)"],
54 ["True", "True", "False", "1", "False", "CRYPTO", "N.A", "PsaApiTest (Crypto)"],
55 ["True", "True", "False", "1", "False", "INITIAL_ATTESTATION", "N.A", "PsaApiTest (Attest)"],
56 ["True", "True", "False", "1", "False", "IPC", "N.A", "PsaApiTest (FF)"],
57 ["True", "True", "True", "1", "False", "INTERNAL_TRUSTED_STORAGE", "N.A", "PsaApiTestIPC (ITS)"],
58 ["True", "True", "True", "1", "False", "PROTECTED_STORAGE", "N.A", "PsaApiTestIPC (PS)"],
59 ["True", "True", "True", "1", "False", "CRYPTO", "N.A", "PsaApiTestIPC (Crypto)"],
60 ["True", "True", "True", "1", "False", "INITIAL_ATTESTATION", "N.A", "PsaApiTestIPC (Attest)"],
61 ["True", "True", "True", "1", "False", "IPC", "N.A", "PsaApiTestIPC (FF)"],
62 ["True", "True", "True", "2", "False", "INTERNAL_TRUSTED_STORAGE", "N.A", "PsaApiTestIPCTfmLevel2 (ITS)"],
63 ["True", "True", "True", "2", "False", "PROTECTED_STORAGE", "N.A", "PsaApiTestIPCTfmLevel2 (PS)"],
64 ["True", "True", "True", "2", "False", "CRYPTO", "N.A", "PsaApiTestIPCTfmLevel2 (Crypto)"],
65 ["True", "True", "True", "2", "False", "INITIAL_ATTESTATION", "N.A", "PsaApiTestIPCTfmLevel2 (Attest)"],
66 ["True", "True", "True", "2", "False", "IPC", "N.A", "PsaApiTestIPCTfmLevel2 (FF)"],
67 ["True", "True", "True", "3", "False", "INTERNAL_TRUSTED_STORAGE", "N.A", "PsaApiTestIPCTfmLevel3 (ITS)"],
68 ["True", "True", "True", "3", "False", "PROTECTED_STORAGE", "N.A", "PsaApiTestIPCTfmLevel3 (PS)"],
69 ["True", "True", "True", "3", "False", "CRYPTO", "N.A", "PsaApiTestIPCTfmLevel3 (Crypto)"],
70 ["True", "True", "True", "3", "False", "INITIAL_ATTESTATION", "N.A", "PsaApiTestIPCTfmLevel3 (Attest)"],
71 ["True", "True", "True", "3", "False", "IPC", "N.A", "PsaApiTestIPCTfmLevel3 (FF)"],
72]
73
74cfgs = ["Default", "CoreIPC", "CoreIPCTfmLevel2", "CoreIPCTfmLevel3",
75 "Regression", "RegressionIPC",
76 "RegressionIPCTfmLevel2", "RegressionIPCTfmLevel3",
77 "DefaultProfileS", "RegressionProfileS",
78 "DefaultProfileM", "RegressionProfileM", "RegressionProfileM PSOFF",
Xinyu Zhang9b1aef92021-03-12 15:36:44 +080079 "DefaultProfileL", "RegressionProfileL",
Xinyu Zhang4f2ef5a2020-11-09 18:11:43 +080080 "PsaApiTest (Attest)", "PsaApiTestIPC (Attest)",
81 "PsaApiTestIPCTfmLevel2 (Attest)",
82 "PsaApiTest (Crypto)", "PsaApiTestIPC (Crypto)",
83 "PsaApiTestIPCTfmLevel2 (Crypto)",
84 "PsaApiTest (PS)", "PsaApiTestIPC (PS)",
85 "PsaApiTestIPCTfmLevel2 (PS)",
86 "PsaApiTest (ITS)", "PsaApiTestIPC (ITS)",
87 "PsaApiTestIPCTfmLevel2 (ITS)",
88 "PsaApiTestIPC (FF)",
89 "PsaApiTestIPCTfmLevel2 (FF)",
90 "PsaApiTestIPCTfmLevel3 (ITS)", "PsaApiTestIPCTfmLevel3 (PS)",
91 "PsaApiTestIPCTfmLevel3 (Crypto)", "PsaApiTestIPCTfmLevel3 (Attest)",
92 "PsaApiTestIPCTfmLevel3 (FF)"]
93
Xinyu Zhangaa3747f2020-12-24 16:27:06 +080094@NonCPS
Xinyu Zhang5c4bbca2020-09-24 16:36:03 +080095def generateLavaParam(build_params) {
96 def params = []
Summer Qin3c2b5722021-05-26 10:43:45 +080097 if (build_params["TFM_PLATFORM"] == "arm/musca_b1/sse_200" && \
Xinyu Zhang97114342021-01-21 14:08:03 +080098 build_params["OTP"] == "ENABLED") {
99 params += string(name: "TARGET_PLATFORM", value: "MUSCA_B1_OTP")
100 }
101 else {
102 params += string(name: "TARGET_PLATFORM", \
103 value: mapPlatform[build_params["TFM_PLATFORM"]])
104 }
Xinyu Zhang5c4bbca2020-09-24 16:36:03 +0800105 params += string(name: "COMPILER", \
106 value: mapCompiler[build_params["TOOLCHAIN_FILE"]])
107 params += string(name: "PSA_API_SUITE", \
108 value: mapTestPsaApi[build_params["TEST_PSA_API"]])
109
Xinyu Zhangdbfadae2020-12-07 14:42:59 +0800110 configName = "Config"
111 config_params = [build_params["BL2"], build_params["NS"], \
112 build_params["PSA_API"], build_params["ISOLATION_LEVEL"], \
113 build_params["TEST_REGRESSION"], build_params["TEST_PSA_API"], \
114 build_params["PROFILE"]]
115 for (config in mapConfigs) {
116 if (config_params == config[0..6]) {
Xinyu Zhangfc1bacd2020-12-24 15:26:35 +0800117 configName += config[7].replace(' (', '_').replace(')', '')
Xinyu Zhangdbfadae2020-12-07 14:42:59 +0800118 break
119 }
Xinyu Zhang5c4bbca2020-09-24 16:36:03 +0800120 }
Xinyu Zhangdbfadae2020-12-07 14:42:59 +0800121 if (configName == "Config") {
122 configName = "ConfigDefault"
123 }
124 params += string(name: "PROJ_CONFIG", value: configName)
Xinyu Zhangaa3747f2020-12-24 16:27:06 +0800125 print("Params of ${configName} :")
126 print(config_params)
Xinyu Zhang5c4bbca2020-09-24 16:36:03 +0800127 return params
128}
129
Dean Birch62c4f082020-01-17 16:13:26 +0000130def listConfigs(ci_scripts_dir, config_list, filter_group) {
131 dir(ci_scripts_dir) {
132 echo "Obtaining list of configs."
Matthew Hartfb6fd362020-03-04 21:03:59 +0000133 echo "Running: python3 ./configs.py -g ${filter_group.replace(" ", " -g ")}"
Dean Birch62c4f082020-01-17 16:13:26 +0000134 def build_config_list_raw = sh(script: """\
Matthew Hartfb6fd362020-03-04 21:03:59 +0000135python3 ./configs.py -g ${filter_group.replace(" ", " -g ")}
Dean Birch62c4f082020-01-17 16:13:26 +0000136""", returnStdout: true).trim()
137 def build_config_list = build_config_list_raw.tokenize('\n')
138 config_list.addAll(build_config_list)
139 }
140}
141
Matthew Hartfb6fd362020-03-04 21:03:59 +0000142def buildConfig(ci_scripts_dir, config, filter_group, results) {
Dean Birch62c4f082020-01-17 16:13:26 +0000143 def params = []
Matthew Hartfb6fd362020-03-04 21:03:59 +0000144 def params_collection = [:]
Dean Birch62c4f082020-01-17 16:13:26 +0000145 def build_config_params
146 dir(ci_scripts_dir) {
147 echo "Obtaining build configuration for config ${config}"
Matthew Hartfb6fd362020-03-04 21:03:59 +0000148 echo "Running: python3 ./configs.py -g ${filter_group.replace(" ", " -g ")} ${config}"
Dean Birch62c4f082020-01-17 16:13:26 +0000149 build_config_params = sh(script: """\
Matthew Hartfb6fd362020-03-04 21:03:59 +0000150python3 ./configs.py -g ${filter_group.replace(" ", " -g ")} ${config}
Dean Birch62c4f082020-01-17 16:13:26 +0000151""", returnStdout: true).trim()
152 }
153 def lines = build_config_params.tokenize('\n')
154 for (String line : lines) {
155 def key, value
156 (key, value) = line.tokenize('=')
157 params += string(name: key, value: value)
Matthew Hartfb6fd362020-03-04 21:03:59 +0000158 params_collection[key] = value
Dean Birch62c4f082020-01-17 16:13:26 +0000159 }
160 params += string(name: 'GERRIT_BRANCH', value: env.GERRIT_BRANCH)
Dean Birchd0f9f8c2020-03-26 11:10:33 +0000161 params += string(name: 'GERRIT_HOST', value: env.GERRIT_HOST)
162 params += string(name: 'GERRIT_CHANGE_NUMBER', value: env.GERRIT_CHANGE_NUMBER)
163 params += string(name: 'GERRIT_PATCHSET_REVISION', value: env.GERRIT_PATCHSET_REVISION)
Dean Birch62c4f082020-01-17 16:13:26 +0000164 params += string(name: 'GERRIT_REFSPEC', value: env.GERRIT_REFSPEC)
Karl Zhang02d30352020-08-20 13:48:52 +0800165 params += string(name: 'MBEDTLS_VERSION', value: env.MBEDTLS_VERSION)
Dean Birch62c4f082020-01-17 16:13:26 +0000166 params += string(name: 'CODE_REPO', value: env.CODE_REPO)
Karl Zhangf6f467e2020-07-10 16:24:45 +0800167 params += string(name: 'CODE_COVERAGE_EN', value: env.CODE_COVERAGE_EN)
Colin Thorbinson58703db2020-11-24 12:02:19 +0000168 params += string(name: 'CI_SCRIPTS_BRANCH', value: env.CI_SCRIPTS_BRANCH)
Hugo L'Hostise55a2752021-01-27 11:09:08 +0000169 if (env.JOB_NAME.equals("tf-m-nightly")) { //Setting the Memory footprint gathering.
170 params += string(name: 'SQUAD_CONFIGURATIONS', value: env.SQUAD_CONFIGURATIONS)
171 }
Dean Bircha6ede7e2020-03-13 14:00:33 +0000172 return { -> results
173 def build_res = build(job: 'tf-m-build-config', parameters: params, propagate: false)
174 def build_info = [build_res, config, params_collection]
175 results['builds'][build_res.number] = build_info
176 def build_url = build_res.getAbsoluteUrl()
177 print("${build_res.number}: ${config} ${build_res.result} ${build_url}")
178 failure_states = ["FAILURE", "ABORTED", "UNSTABLE", "NOT_BUILT"]
179 if (build_res.result in failure_states) {
180 error("Build failed at ${build_url}")
181 }
Karl Zhang2b10b342020-11-09 14:50:11 +0800182 else if (params_collection["NS"] == "False" || \
Karl Zhang0b7bb4a2021-01-18 16:22:08 +0800183 (params_collection["TFM_PLATFORM"].contains("musca_b1") && \
184 env.JOB_NAME.equals("tf-m-build-and-test")) || \
Xinyu Zhang661a17a2021-01-05 19:24:40 +0800185 (params_collection["PROFILE"] == "profile_medium" && \
186 params_collection["PARTITION_PS"] == "OFF")) {
Xinyu Zhang5c4bbca2020-09-24 16:36:03 +0800187 print("LAVA is not needed for ${build_url}")
188 }
Xinyu Zhang16e94472021-06-08 16:23:38 +0800189 // Workaround: test cases on MUSCA_B1 with OTP enabled could not pass for the time being.
190 // Do not test it to aviod blocking CI.
191 else if (params_collection["OTP"] == "ENABLED") {
Xinyu Zhang97114342021-01-21 14:08:03 +0800192 print("LAVA is not needed for ${build_url}")
193 }
Dean Bircha6ede7e2020-03-13 14:00:33 +0000194 else {
195 print("Doing LAVA stuff for ${build_url}")
Xinyu Zhangaa3747f2020-12-24 16:27:06 +0800196 params += generateLavaParam(params_collection)
Dean Bircha6ede7e2020-03-13 14:00:33 +0000197 params += string(name: 'BUILD_NUMBER', value: "${build_res.number}")
198 params += string(name: 'BUILD_URL', value: build_url)
Matthew Hartfb6fd362020-03-04 21:03:59 +0000199 params += string(name: 'LAVA_URL', value: env.LAVA_URL)
Dean Birch956416f2020-08-12 10:36:16 +0100200 params += string(name: 'CI_SCRIPTS_BRANCH', value: env.CI_SCRIPTS_BRANCH)
201 params += string(name: 'LAVA_CREDENTIALS', value: env.LAVA_CREDENTIALS)
Dean Bircha6ede7e2020-03-13 14:00:33 +0000202 def lava_res = build(job: 'tf-m-lava-submit', parameters: params, propagate: false)
Xinyu Zhang32f8c1c2021-05-12 14:38:24 +0800203 def lava_resubmitted = false
Matthew Hartfb6fd362020-03-04 21:03:59 +0000204 if (lava_res.result in failure_states) {
205 error("LAVA Create and Submit failed at ${lava_res.getAbsoluteUrl()}")
206 }
207 else {
Xinyu Zhang32f8c1c2021-05-12 14:38:24 +0800208 lava_des = lava_res.getDescription()
209 if (lava_des.contains(" Submitted twice!")) {
210 lava_resubmitted = true
211 lava_des = lava_des - " Submitted twice!"
212 }
213 results['lava_jobs'] += lava_des
Matthew Hartfb6fd362020-03-04 21:03:59 +0000214 }
Xinyu Zhang97ee3fd2020-12-14 14:45:06 +0800215 links = "Build Config: ${config}\n"
216 links += "Build URL: ${build_url}\n"
217 links += "LAVA Submit: ${lava_res.getAbsoluteUrl()}"
Xinyu Zhang32f8c1c2021-05-12 14:38:24 +0800218 if (lava_resubmitted) {
219 links += "\nLAVA Job Re-Submitted!"
220 }
Xinyu Zhang97ee3fd2020-12-14 14:45:06 +0800221 print(links)
Dean Birch62c4f082020-01-17 16:13:26 +0000222 }
223 }
224}
225
Matthew Hart06340d72020-06-15 16:08:20 +0100226def buildDocs(results) {
Dean Birch62c4f082020-01-17 16:13:26 +0000227 def params = []
228 params += string(name: 'GERRIT_BRANCH', value: env.GERRIT_BRANCH)
Dean Birchd0f9f8c2020-03-26 11:10:33 +0000229 params += string(name: 'GERRIT_HOST', value: env.GERRIT_HOST)
230 params += string(name: 'GERRIT_CHANGE_NUMBER', value: env.GERRIT_CHANGE_NUMBER)
231 params += string(name: 'GERRIT_PATCHSET_REVISION', value: env.GERRIT_PATCHSET_REVISION)
Dean Birch62c4f082020-01-17 16:13:26 +0000232 params += string(name: 'GERRIT_REFSPEC', value: env.GERRIT_REFSPEC)
Karl Zhang02d30352020-08-20 13:48:52 +0800233 params += string(name: 'MBEDTLS_VERSION', value: env.MBEDTLS_VERSION)
Dean Birch62c4f082020-01-17 16:13:26 +0000234 params += string(name: 'CODE_REPO', value: env.CODE_REPO)
Colin Thorbinson58703db2020-11-24 12:02:19 +0000235 params += string(name: 'CI_SCRIPTS_BRANCH', value: env.CI_SCRIPTS_BRANCH)
Matthew Hart06340d72020-06-15 16:08:20 +0100236 return { -> results
Dean Birch62c4f082020-01-17 16:13:26 +0000237 def res = build(job: 'tf-m-build-docs', parameters: params, propagate:false)
238 print("${res.number}: Docs ${res.result} ${res.getAbsoluteUrl()}")
Matthew Hart06340d72020-06-15 16:08:20 +0100239 results['docs'] = [res.number, res.result, params]
Dean Bircha6ede7e2020-03-13 14:00:33 +0000240 if (res.result in ["FAILURE", "ABORTED", "UNSTABLE", "NOT_BUILT"]) {
Dean Birch62c4f082020-01-17 16:13:26 +0000241 error("Build failed at ${res.getAbsoluteUrl()}")
242 }
243 }
244}
245
Xinyu Zhang38a18872020-11-23 16:45:28 +0800246def generateEmailBody(stage, failed_jobs) {
247 body = "Check console output at ${env.BUILD_URL} \n\n"
248
249 body += "Failed Jobs:\n"
250 failed_jobs.each { job ->
251 body += "${job.key} ${job.value}\n"
252 }
253
254 body += "\nFor detailed ${stage} results please refer to \
255 ${env.BUILD_URL}artifact/${stage}_results.csv \n"
256 return body
257}
258
259def emailNotification(results, stage, failed_jobs) {
Karl Zhang0413e972020-09-18 17:59:26 +0800260 script {
261 if (env.JOB_NAME.equals("tf-m-nightly") && !env.EMAIL_NOTIFICATION.equals('')) {
262 def result = "Fail."
Karl Zhang182ecdf2020-10-10 09:52:12 +0800263 if (results == true) {
Karl Zhang0413e972020-09-18 17:59:26 +0800264 result = "Success."
Karl Zhang182ecdf2020-10-10 09:52:12 +0800265 print("Skip sending as ${result} for ${stage}")
266 }
267 else {
268 emailext (
269 subject: ("Job ${env.JOB_NAME} ${stage} ${env.BUILD_NUMBER} ${result}"),
Xinyu Zhang38a18872020-11-23 16:45:28 +0800270 body: generateEmailBody(stage, failed_jobs),
Karl Zhang182ecdf2020-10-10 09:52:12 +0800271 to: "${EMAIL_NOTIFICATION}"
272 )
273 }
Karl Zhang0413e972020-09-18 17:59:26 +0800274 }
275 } /* script */
276}
277
Xinyu Zhang38a18872020-11-23 16:45:28 +0800278def filterFailedBuild(results) {
279 def failed_builds = [:]
280 results.each { result ->
281 if (result.value[0].getResult() == "FAILURE") {
282 failed_builds[result.value[1]] = result.value[0].getAbsoluteUrl()
283 }
284 }
285 return failed_builds
286}
287
288def filterFailedTest(string) {
289 def failed_tests = [:]
290 line = lineInString(string, "FAILURE_TESTS:")
291 a = line.split(' ')
292 if (a.size() > 1) {
293 a = line.split(' ')[1..-1]
294 a.each { fail_test ->
295 config_link = fail_test.split(':')
296 failed_tests[config_link[0]] = config_link[1..-1].join(':')
297 }
298 }
299 return failed_tests
300}
301
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800302@NonCPS
303def generateCsvContent(results) {
304 def resultsParam = []
305 results.each { result ->
Xinyu Zhang4f2ef5a2020-11-09 18:11:43 +0800306 if (result.value[2]['BL2'] == "True") {
307 resultsParam.add([result.value[1], \
308 result.value[0].getResult(), \
309 result.value[2]['TFM_PLATFORM'], \
310 result.value[2]['TOOLCHAIN_FILE'], \
311 result.value[2]['CMAKE_BUILD_TYPE'], \
312 result.value[2]['BL2'], \
313 result.value[2]['NS'], \
314 result.value[2]['PSA_API'], \
315 result.value[2]['ISOLATION_LEVEL'], \
316 result.value[2]['TEST_REGRESSION'], \
317 result.value[2]['TEST_PSA_API'], \
318 result.value[2]['PROFILE'], \
319 result.value[2]['PARTITION_PS'], \
320 result.value[2]['OTP']])
321 }
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800322 }
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800323 resultsParam.each { result ->
Xinyu Zhang18a73542020-12-24 14:19:07 +0800324 if (result[2] == 'musca_b1/sse_200') {
Xinyu Zhang4f2ef5a2020-11-09 18:11:43 +0800325 if (result[13] != 'off') {
Xinyu Zhang18a73542020-12-24 14:19:07 +0800326 result[2] = 'musca_b1/sse_200_OTP'
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800327 }
328 }
Xinyu Zhang4f2ef5a2020-11-09 18:11:43 +0800329 result[3] = mapCompiler[result[3]]
330 build_params = result[5..12]
331 configName = ""
332 for (map_cfg in mapConfigs) {
333 if (build_params[0..6] == map_cfg[0..6]) {
334 configName = map_cfg[7]
335 break
336 }
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800337 }
Xinyu Zhang4f2ef5a2020-11-09 18:11:43 +0800338 if (configName == "") {
339 configName = "Default"
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800340 }
Xinyu Zhang4f2ef5a2020-11-09 18:11:43 +0800341 else if (configName == "RegressionProfileM") {
342 if (build_params[7] == "OFF") {
343 configName = "RegressionProfileM PSOFF"
344 }
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800345 }
Xinyu Zhang4f2ef5a2020-11-09 18:11:43 +0800346 result.add(configName)
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800347 }
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800348 def csvContent = []
349 resultsParam.each { result ->
Xinyu Zhang4f2ef5a2020-11-09 18:11:43 +0800350 current_row = result[2..4]
351 cfgs.each {cfg ->
352 if (cfg == result[14]) {
353 current_row.add(cfg)
354 current_row.add(result[1])
355 }
356 }
357 csvContent.add(current_row)
358 }
359 csvContent.sort{a,b -> a[0] <=> b[0] ?: a[1] <=> b[1] ?: a[2] <=> b[2]}
360 build_summary = []
361 current_platform = ""
362 current_compiler = ""
363 current_build_type = ""
364 csvContent.each { build_cfg ->
365 if (current_platform != build_cfg[0] || \
366 current_compiler != build_cfg[1] || \
367 current_build_type != build_cfg[2]) {
368 current_platform = build_cfg[0]
369 current_compiler = build_cfg[1]
370 current_build_type = build_cfg[2]
371 csv_line = [current_platform, current_compiler, current_build_type]
372 cfgs.each {
373 csv_line.add("N.A.")
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800374 }
Xinyu Zhang4f2ef5a2020-11-09 18:11:43 +0800375 build_summary.add(csv_line)
376 }
377 i = 0
378 cfgs.each { cfg ->
379 if (cfg == build_cfg[3]) {
380 build_summary[-1][3+i] = build_cfg[4]
381 }
382 i += 1
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800383 }
384 }
Xinyu Zhang4f2ef5a2020-11-09 18:11:43 +0800385 build_summary.add(0, ['Platform', 'Compiler', 'Cmake Build Type'])
386 build_summary[0] += cfgs
387 return build_summary
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800388}
389
390def generateBuildCsv(results) {
391 def csvContent = generateCsvContent(results)
392 node("master") {
393 writeCSV file: 'build_results.csv', records: csvContent, format: CSVFormat.EXCEL
394 archiveArtifacts 'build_results.csv'
395 }
396}
Dean Bircha6ede7e2020-03-13 14:00:33 +0000397
398def buildCsv(results) {
Dean Birchd0f9f8c2020-03-26 11:10:33 +0000399 def summary = new Summary();
Dean Bircha6ede7e2020-03-13 14:00:33 +0000400 def csvContent = summary.getBuildCsv(results)
401 node("master") {
402 writeCSV file: 'build_results.csv', records: csvContent, format: CSVFormat.EXCEL
403 archiveArtifacts 'build_results.csv'
404 }
405}
406
407def writeSummary(results) {
Dean Birchd0f9f8c2020-03-26 11:10:33 +0000408 def summary = new Summary();
Dean Bircha6ede7e2020-03-13 14:00:33 +0000409 def buildLinks = summary.getLinks(results)
410 node("master") {
411 writeFile file: "build_links.html", text: buildLinks
412 archiveArtifacts 'build_links.html'
413 }
414}
415
Matthew Hartfb6fd362020-03-04 21:03:59 +0000416def lineInString(string, match) {
417 def lines = string.split("\n")
418 def result = lines.findAll { it.contains(match) }
419 return result[0]
420}
421
Xinyu Zhang97ee3fd2020-12-14 14:45:06 +0800422def showLinks(string) {
423 def lines = string.split("\n")
424 def result = lines.findAll { it.contains("Build Config: ")}
425 links = result.join("\n")
426 print(links)
427}
428
Matthew Hartfb6fd362020-03-04 21:03:59 +0000429def getResult(string, match) {
430 line = lineInString(string, match)
Dean Birch1d545c02020-05-29 14:09:21 +0100431 a = line.split(match)[1].split(' ')
432 score = a[0]
433 if (a.size() > 1)
434 {
435 fail_text = a[1..-1].join(" ")
436 return [score, fail_text]
437 }
438 return [score, ""]
Matthew Hartfb6fd362020-03-04 21:03:59 +0000439}
440
441def submitJobsToList(results) {
442 def all_jobs = []
443 for (String result : results){
444 jobs_s = result.split('JOBS: ')
445 if (jobs_s.size() > 1) {
446 all_jobs += jobs_s[1]
447 }
448 }
449 return(all_jobs)
450}
451
Dean Birch62c4f082020-01-17 16:13:26 +0000452def configs = []
453def builds = [:]
Matthew Hartfb6fd362020-03-04 21:03:59 +0000454def results = [:]
Dean Birch62c4f082020-01-17 16:13:26 +0000455
Xinyu Zhang4cdfd1b2021-05-21 15:10:49 +0800456timestamps {
457 node("docker-amd64-tf-m-bionic") {
458 stage("Init") {
459 cleanWs()
460 dir("tf-m-ci-scripts") {
461 checkout([$class: 'GitSCM', branches: [[name: '$CI_SCRIPTS_BRANCH']], userRemoteConfigs: [[credentialsId: 'GIT_SSH_KEY', url: '$CI_SCRIPTS_REPO']]])
462 }
463 }
464 stage("Configs") {
465 // Populate configs
466 listConfigs('tf-m-ci-scripts', configs, env.FILTER_GROUP)
467 results['builds'] = [:]
468 results['lava_jobs'] = []
469 for (config in configs) {
470 builds[config] = buildConfig("tf-m-ci-scripts", config, env.FILTER_GROUP, results)
471 }
472 builds["docs"] = buildDocs(results)
Dean Birch62c4f082020-01-17 16:13:26 +0000473 }
474 }
Karl Zhangfec84102020-06-24 09:56:36 +0800475
Xinyu Zhang4cdfd1b2021-05-21 15:10:49 +0800476 stage("Builds") {
477 def verify = 1
Matthew Hartfb6fd362020-03-04 21:03:59 +0000478 def success = true
Matthew Hartfb6fd362020-03-04 21:03:59 +0000479 try {
Xinyu Zhang4cdfd1b2021-05-21 15:10:49 +0800480 parallel(builds)
481 } catch (Exception e) {
482 print(e)
483 manager.buildFailure()
484 verify = -1
485 success = false
486 } finally {
487 print("Verifying status")
488 def failed_builds = filterFailedBuild(results['builds'])
489 emailNotification(success, 'build', failed_builds)
490 g = new Gerrit()
491 g.verifyStatus(verify, 'tf-m-build', 'build')
492 print("Building CSV")
493 generateBuildCsv(results['builds'])
494 writeSummary(results['builds'])
495 }
496 }
497
498 node("docker-amd64-tf-m-bionic") {
499 stage("Tests") {
500 dir("tf-m-ci-scripts") {
501 checkout([$class: 'GitSCM', branches: [[name: '$CI_SCRIPTS_BRANCH']], userRemoteConfigs: [[credentialsId: 'GIT_SSH_KEY', url: '$CI_SCRIPTS_REPO']]])
502 }
503 def all_jobs = []
504 def success = true
505 print("Wait for LAVA results here...")
506 try {
507 all_jobs = submitJobsToList(results['lava_jobs'])
508 if (all_jobs.size() > 0) {
509 dir("tf-m-ci-scripts") {
510 withCredentials([usernamePassword(credentialsId: env.LAVA_CREDENTIALS, passwordVariable: 'LAVA_TOKEN', usernameVariable: 'LAVA_USER')]) {
511 output = sh(script: """./lava_helper/lava_wait_jobs.py --job-ids ${all_jobs.join(",")} \
512 --lava-url ${env.LAVA_URL} --lava-user ${LAVA_USER} --lava-token ${LAVA_TOKEN} \
513 --artifacts-path lava_artifacts --lava-timeout 7200 \
514 """, returnStdout: true).trim()
515 showLinks(output)
516 archiveArtifacts artifacts: 'test_summary.*', allowEmptyArchive: true
517 archiveArtifacts artifacts: 'test_results.csv', allowEmptyArchive: true
518 g = new Gerrit()
519 def (boot_result, boot_output) = getResult(output, 'BOOT_RESULT: ')
520 if (boot_result) {
521 g.verifyStatus(boot_result, "lava_boot", "test")
522 }
523 def (test_result, test_output) = getResult(output, 'TEST_RESULT: ')
524 if (test_result) {
525 g.verifyStatus(test_result, "lava_test", "test")
526 }
527 if (boot_result.toInteger() < 1 || test_result.toInteger() < 1) {
528 error("Marking job as failed due to failed boots: ${boot_output} or tests: ${test_output}")
529 }
Matthew Hartfb6fd362020-03-04 21:03:59 +0000530 }
531 }
532 }
Xinyu Zhang4cdfd1b2021-05-21 15:10:49 +0800533 else {
534 print("There were no LAVA jobs to test.")
535 }
Matthew Hartfb6fd362020-03-04 21:03:59 +0000536 }
Xinyu Zhang4cdfd1b2021-05-21 15:10:49 +0800537 catch (Exception e) {
538 print("ERROR: ${e}")
539 success = false
540 } finally {
541 archiveArtifacts artifacts: 'tf-m-ci-scripts/lava_artifacts/**', allowEmptyArchive: true
542 if (all_jobs.size() > 0) {
543 emailNotification(success, 'test', filterFailedTest(output))
544 }
545 cleanWs()
546 if (!success) {
547 error("There was an Error waiting for LAVA jobs")
548 }
Matthew Hartfb6fd362020-03-04 21:03:59 +0000549 }
Dean Bircha6ede7e2020-03-13 14:00:33 +0000550 }
551 }
Dean Bircha6ede7e2020-03-13 14:00:33 +0000552}