blob: 2fa7ed1af2ba247b481fe895f5b0d73560cfd7f8 [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)
Leonardo Sandoval12fbb2f2021-04-15 14:36:09 -0500202 params += string(name: 'CODE_COVERAGE_EN', value: env.CODE_COVERAGE_EN)
Dean Bircha6ede7e2020-03-13 14:00:33 +0000203 def lava_res = build(job: 'tf-m-lava-submit', parameters: params, propagate: false)
Xinyu Zhang32f8c1c2021-05-12 14:38:24 +0800204 def lava_resubmitted = false
Matthew Hartfb6fd362020-03-04 21:03:59 +0000205 if (lava_res.result in failure_states) {
206 error("LAVA Create and Submit failed at ${lava_res.getAbsoluteUrl()}")
207 }
208 else {
Xinyu Zhang32f8c1c2021-05-12 14:38:24 +0800209 lava_des = lava_res.getDescription()
210 if (lava_des.contains(" Submitted twice!")) {
211 lava_resubmitted = true
212 lava_des = lava_des - " Submitted twice!"
213 }
214 results['lava_jobs'] += lava_des
Matthew Hartfb6fd362020-03-04 21:03:59 +0000215 }
Xinyu Zhang97ee3fd2020-12-14 14:45:06 +0800216 links = "Build Config: ${config}\n"
217 links += "Build URL: ${build_url}\n"
218 links += "LAVA Submit: ${lava_res.getAbsoluteUrl()}"
Xinyu Zhang32f8c1c2021-05-12 14:38:24 +0800219 if (lava_resubmitted) {
220 links += "\nLAVA Job Re-Submitted!"
221 }
Xinyu Zhang97ee3fd2020-12-14 14:45:06 +0800222 print(links)
Dean Birch62c4f082020-01-17 16:13:26 +0000223 }
224 }
225}
226
Matthew Hart06340d72020-06-15 16:08:20 +0100227def buildDocs(results) {
Dean Birch62c4f082020-01-17 16:13:26 +0000228 def params = []
229 params += string(name: 'GERRIT_BRANCH', value: env.GERRIT_BRANCH)
Dean Birchd0f9f8c2020-03-26 11:10:33 +0000230 params += string(name: 'GERRIT_HOST', value: env.GERRIT_HOST)
231 params += string(name: 'GERRIT_CHANGE_NUMBER', value: env.GERRIT_CHANGE_NUMBER)
232 params += string(name: 'GERRIT_PATCHSET_REVISION', value: env.GERRIT_PATCHSET_REVISION)
Dean Birch62c4f082020-01-17 16:13:26 +0000233 params += string(name: 'GERRIT_REFSPEC', value: env.GERRIT_REFSPEC)
Karl Zhang02d30352020-08-20 13:48:52 +0800234 params += string(name: 'MBEDTLS_VERSION', value: env.MBEDTLS_VERSION)
Dean Birch62c4f082020-01-17 16:13:26 +0000235 params += string(name: 'CODE_REPO', value: env.CODE_REPO)
Colin Thorbinson58703db2020-11-24 12:02:19 +0000236 params += string(name: 'CI_SCRIPTS_BRANCH', value: env.CI_SCRIPTS_BRANCH)
Matthew Hart06340d72020-06-15 16:08:20 +0100237 return { -> results
Dean Birch62c4f082020-01-17 16:13:26 +0000238 def res = build(job: 'tf-m-build-docs', parameters: params, propagate:false)
239 print("${res.number}: Docs ${res.result} ${res.getAbsoluteUrl()}")
Matthew Hart06340d72020-06-15 16:08:20 +0100240 results['docs'] = [res.number, res.result, params]
Dean Bircha6ede7e2020-03-13 14:00:33 +0000241 if (res.result in ["FAILURE", "ABORTED", "UNSTABLE", "NOT_BUILT"]) {
Dean Birch62c4f082020-01-17 16:13:26 +0000242 error("Build failed at ${res.getAbsoluteUrl()}")
243 }
244 }
245}
246
Xinyu Zhang38a18872020-11-23 16:45:28 +0800247def generateEmailBody(stage, failed_jobs) {
248 body = "Check console output at ${env.BUILD_URL} \n\n"
249
250 body += "Failed Jobs:\n"
251 failed_jobs.each { job ->
252 body += "${job.key} ${job.value}\n"
253 }
254
255 body += "\nFor detailed ${stage} results please refer to \
256 ${env.BUILD_URL}artifact/${stage}_results.csv \n"
257 return body
258}
259
260def emailNotification(results, stage, failed_jobs) {
Karl Zhang0413e972020-09-18 17:59:26 +0800261 script {
262 if (env.JOB_NAME.equals("tf-m-nightly") && !env.EMAIL_NOTIFICATION.equals('')) {
263 def result = "Fail."
Karl Zhang182ecdf2020-10-10 09:52:12 +0800264 if (results == true) {
Karl Zhang0413e972020-09-18 17:59:26 +0800265 result = "Success."
Karl Zhang182ecdf2020-10-10 09:52:12 +0800266 print("Skip sending as ${result} for ${stage}")
267 }
268 else {
269 emailext (
270 subject: ("Job ${env.JOB_NAME} ${stage} ${env.BUILD_NUMBER} ${result}"),
Xinyu Zhang38a18872020-11-23 16:45:28 +0800271 body: generateEmailBody(stage, failed_jobs),
Karl Zhang182ecdf2020-10-10 09:52:12 +0800272 to: "${EMAIL_NOTIFICATION}"
273 )
274 }
Karl Zhang0413e972020-09-18 17:59:26 +0800275 }
276 } /* script */
277}
278
Xinyu Zhang38a18872020-11-23 16:45:28 +0800279def filterFailedBuild(results) {
280 def failed_builds = [:]
281 results.each { result ->
282 if (result.value[0].getResult() == "FAILURE") {
283 failed_builds[result.value[1]] = result.value[0].getAbsoluteUrl()
284 }
285 }
286 return failed_builds
287}
288
289def filterFailedTest(string) {
290 def failed_tests = [:]
291 line = lineInString(string, "FAILURE_TESTS:")
292 a = line.split(' ')
293 if (a.size() > 1) {
294 a = line.split(' ')[1..-1]
295 a.each { fail_test ->
296 config_link = fail_test.split(':')
297 failed_tests[config_link[0]] = config_link[1..-1].join(':')
298 }
299 }
300 return failed_tests
301}
302
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800303@NonCPS
304def generateCsvContent(results) {
305 def resultsParam = []
306 results.each { result ->
Xinyu Zhang4f2ef5a2020-11-09 18:11:43 +0800307 if (result.value[2]['BL2'] == "True") {
308 resultsParam.add([result.value[1], \
309 result.value[0].getResult(), \
310 result.value[2]['TFM_PLATFORM'], \
311 result.value[2]['TOOLCHAIN_FILE'], \
312 result.value[2]['CMAKE_BUILD_TYPE'], \
313 result.value[2]['BL2'], \
314 result.value[2]['NS'], \
315 result.value[2]['PSA_API'], \
316 result.value[2]['ISOLATION_LEVEL'], \
317 result.value[2]['TEST_REGRESSION'], \
318 result.value[2]['TEST_PSA_API'], \
319 result.value[2]['PROFILE'], \
320 result.value[2]['PARTITION_PS'], \
321 result.value[2]['OTP']])
322 }
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800323 }
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800324 resultsParam.each { result ->
Xinyu Zhang18a73542020-12-24 14:19:07 +0800325 if (result[2] == 'musca_b1/sse_200') {
Xinyu Zhang4f2ef5a2020-11-09 18:11:43 +0800326 if (result[13] != 'off') {
Xinyu Zhang18a73542020-12-24 14:19:07 +0800327 result[2] = 'musca_b1/sse_200_OTP'
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800328 }
329 }
Xinyu Zhang4f2ef5a2020-11-09 18:11:43 +0800330 result[3] = mapCompiler[result[3]]
331 build_params = result[5..12]
332 configName = ""
333 for (map_cfg in mapConfigs) {
334 if (build_params[0..6] == map_cfg[0..6]) {
335 configName = map_cfg[7]
336 break
337 }
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800338 }
Xinyu Zhang4f2ef5a2020-11-09 18:11:43 +0800339 if (configName == "") {
340 configName = "Default"
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800341 }
Xinyu Zhang4f2ef5a2020-11-09 18:11:43 +0800342 else if (configName == "RegressionProfileM") {
343 if (build_params[7] == "OFF") {
344 configName = "RegressionProfileM PSOFF"
345 }
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800346 }
Xinyu Zhang4f2ef5a2020-11-09 18:11:43 +0800347 result.add(configName)
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800348 }
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800349 def csvContent = []
350 resultsParam.each { result ->
Xinyu Zhang4f2ef5a2020-11-09 18:11:43 +0800351 current_row = result[2..4]
352 cfgs.each {cfg ->
353 if (cfg == result[14]) {
354 current_row.add(cfg)
355 current_row.add(result[1])
356 }
357 }
358 csvContent.add(current_row)
359 }
360 csvContent.sort{a,b -> a[0] <=> b[0] ?: a[1] <=> b[1] ?: a[2] <=> b[2]}
361 build_summary = []
362 current_platform = ""
363 current_compiler = ""
364 current_build_type = ""
365 csvContent.each { build_cfg ->
366 if (current_platform != build_cfg[0] || \
367 current_compiler != build_cfg[1] || \
368 current_build_type != build_cfg[2]) {
369 current_platform = build_cfg[0]
370 current_compiler = build_cfg[1]
371 current_build_type = build_cfg[2]
372 csv_line = [current_platform, current_compiler, current_build_type]
373 cfgs.each {
374 csv_line.add("N.A.")
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800375 }
Xinyu Zhang4f2ef5a2020-11-09 18:11:43 +0800376 build_summary.add(csv_line)
377 }
378 i = 0
379 cfgs.each { cfg ->
380 if (cfg == build_cfg[3]) {
381 build_summary[-1][3+i] = build_cfg[4]
382 }
383 i += 1
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800384 }
385 }
Xinyu Zhang4f2ef5a2020-11-09 18:11:43 +0800386 build_summary.add(0, ['Platform', 'Compiler', 'Cmake Build Type'])
387 build_summary[0] += cfgs
388 return build_summary
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800389}
390
391def generateBuildCsv(results) {
392 def csvContent = generateCsvContent(results)
393 node("master") {
394 writeCSV file: 'build_results.csv', records: csvContent, format: CSVFormat.EXCEL
395 archiveArtifacts 'build_results.csv'
396 }
397}
Dean Bircha6ede7e2020-03-13 14:00:33 +0000398
399def buildCsv(results) {
Dean Birchd0f9f8c2020-03-26 11:10:33 +0000400 def summary = new Summary();
Dean Bircha6ede7e2020-03-13 14:00:33 +0000401 def csvContent = summary.getBuildCsv(results)
402 node("master") {
403 writeCSV file: 'build_results.csv', records: csvContent, format: CSVFormat.EXCEL
404 archiveArtifacts 'build_results.csv'
405 }
406}
407
408def writeSummary(results) {
Dean Birchd0f9f8c2020-03-26 11:10:33 +0000409 def summary = new Summary();
Dean Bircha6ede7e2020-03-13 14:00:33 +0000410 def buildLinks = summary.getLinks(results)
411 node("master") {
412 writeFile file: "build_links.html", text: buildLinks
413 archiveArtifacts 'build_links.html'
414 }
415}
416
Matthew Hartfb6fd362020-03-04 21:03:59 +0000417def lineInString(string, match) {
418 def lines = string.split("\n")
419 def result = lines.findAll { it.contains(match) }
420 return result[0]
421}
422
Xinyu Zhang97ee3fd2020-12-14 14:45:06 +0800423def showLinks(string) {
424 def lines = string.split("\n")
425 def result = lines.findAll { it.contains("Build Config: ")}
426 links = result.join("\n")
427 print(links)
428}
429
Matthew Hartfb6fd362020-03-04 21:03:59 +0000430def getResult(string, match) {
431 line = lineInString(string, match)
Dean Birch1d545c02020-05-29 14:09:21 +0100432 a = line.split(match)[1].split(' ')
433 score = a[0]
434 if (a.size() > 1)
435 {
436 fail_text = a[1..-1].join(" ")
437 return [score, fail_text]
438 }
439 return [score, ""]
Matthew Hartfb6fd362020-03-04 21:03:59 +0000440}
441
442def submitJobsToList(results) {
443 def all_jobs = []
444 for (String result : results){
445 jobs_s = result.split('JOBS: ')
446 if (jobs_s.size() > 1) {
447 all_jobs += jobs_s[1]
448 }
449 }
450 return(all_jobs)
451}
452
Dean Birch62c4f082020-01-17 16:13:26 +0000453def configs = []
454def builds = [:]
Matthew Hartfb6fd362020-03-04 21:03:59 +0000455def results = [:]
Dean Birch62c4f082020-01-17 16:13:26 +0000456
Xinyu Zhang4cdfd1b2021-05-21 15:10:49 +0800457timestamps {
458 node("docker-amd64-tf-m-bionic") {
459 stage("Init") {
460 cleanWs()
461 dir("tf-m-ci-scripts") {
462 checkout([$class: 'GitSCM', branches: [[name: '$CI_SCRIPTS_BRANCH']], userRemoteConfigs: [[credentialsId: 'GIT_SSH_KEY', url: '$CI_SCRIPTS_REPO']]])
463 }
464 }
465 stage("Configs") {
466 // Populate configs
467 listConfigs('tf-m-ci-scripts', configs, env.FILTER_GROUP)
468 results['builds'] = [:]
469 results['lava_jobs'] = []
470 for (config in configs) {
471 builds[config] = buildConfig("tf-m-ci-scripts", config, env.FILTER_GROUP, results)
472 }
473 builds["docs"] = buildDocs(results)
Dean Birch62c4f082020-01-17 16:13:26 +0000474 }
475 }
Karl Zhangfec84102020-06-24 09:56:36 +0800476
Xinyu Zhang4cdfd1b2021-05-21 15:10:49 +0800477 stage("Builds") {
478 def verify = 1
Matthew Hartfb6fd362020-03-04 21:03:59 +0000479 def success = true
Matthew Hartfb6fd362020-03-04 21:03:59 +0000480 try {
Xinyu Zhang4cdfd1b2021-05-21 15:10:49 +0800481 parallel(builds)
482 } catch (Exception e) {
483 print(e)
484 manager.buildFailure()
485 verify = -1
486 success = false
487 } finally {
488 print("Verifying status")
489 def failed_builds = filterFailedBuild(results['builds'])
490 emailNotification(success, 'build', failed_builds)
491 g = new Gerrit()
492 g.verifyStatus(verify, 'tf-m-build', 'build')
493 print("Building CSV")
494 generateBuildCsv(results['builds'])
495 writeSummary(results['builds'])
496 }
497 }
498
499 node("docker-amd64-tf-m-bionic") {
500 stage("Tests") {
501 dir("tf-m-ci-scripts") {
502 checkout([$class: 'GitSCM', branches: [[name: '$CI_SCRIPTS_BRANCH']], userRemoteConfigs: [[credentialsId: 'GIT_SSH_KEY', url: '$CI_SCRIPTS_REPO']]])
503 }
504 def all_jobs = []
505 def success = true
506 print("Wait for LAVA results here...")
507 try {
508 all_jobs = submitJobsToList(results['lava_jobs'])
509 if (all_jobs.size() > 0) {
510 dir("tf-m-ci-scripts") {
511 withCredentials([usernamePassword(credentialsId: env.LAVA_CREDENTIALS, passwordVariable: 'LAVA_TOKEN', usernameVariable: 'LAVA_USER')]) {
512 output = sh(script: """./lava_helper/lava_wait_jobs.py --job-ids ${all_jobs.join(",")} \
513 --lava-url ${env.LAVA_URL} --lava-user ${LAVA_USER} --lava-token ${LAVA_TOKEN} \
514 --artifacts-path lava_artifacts --lava-timeout 7200 \
515 """, returnStdout: true).trim()
516 showLinks(output)
517 archiveArtifacts artifacts: 'test_summary.*', allowEmptyArchive: true
518 archiveArtifacts artifacts: 'test_results.csv', allowEmptyArchive: true
519 g = new Gerrit()
520 def (boot_result, boot_output) = getResult(output, 'BOOT_RESULT: ')
521 if (boot_result) {
522 g.verifyStatus(boot_result, "lava_boot", "test")
523 }
524 def (test_result, test_output) = getResult(output, 'TEST_RESULT: ')
525 if (test_result) {
526 g.verifyStatus(test_result, "lava_test", "test")
527 }
528 if (boot_result.toInteger() < 1 || test_result.toInteger() < 1) {
529 error("Marking job as failed due to failed boots: ${boot_output} or tests: ${test_output}")
530 }
Matthew Hartfb6fd362020-03-04 21:03:59 +0000531 }
532 }
533 }
Xinyu Zhang4cdfd1b2021-05-21 15:10:49 +0800534 else {
535 print("There were no LAVA jobs to test.")
536 }
Matthew Hartfb6fd362020-03-04 21:03:59 +0000537 }
Xinyu Zhang4cdfd1b2021-05-21 15:10:49 +0800538 catch (Exception e) {
539 print("ERROR: ${e}")
540 success = false
541 } finally {
542 archiveArtifacts artifacts: 'tf-m-ci-scripts/lava_artifacts/**', allowEmptyArchive: true
543 if (all_jobs.size() > 0) {
544 emailNotification(success, 'test', filterFailedTest(output))
545 }
546 cleanWs()
547 if (!success) {
548 error("There was an Error waiting for LAVA jobs")
549 }
Matthew Hartfb6fd362020-03-04 21:03:59 +0000550 }
Dean Bircha6ede7e2020-03-13 14:00:33 +0000551 }
552 }
Dean Bircha6ede7e2020-03-13 14:00:33 +0000553}