blob: 9f556e6e37f6c88d9e2bdc72c28876005731aa26 [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",
Arthur She19c0e1a2021-06-02 11:06:19 -070021 "arm/musca_s1": "MUSCA_S1",
22 "stm/stm32l562e_dk": "stm32l562e_dk"]
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"],
Xinyu Zhang9b1aef92021-03-12 15:36:44 +080045 ["True", "True", "True", "3", "False", "OFF", "profile_large", "DefaultProfileL"],
Xinyu Zhang4f2ef5a2020-11-09 18:11:43 +080046 ["True", "True", "False", "1", "True", "OFF", "N.A", "Regression"],
47 ["True", "True", "True", "1", "True", "OFF", "N.A", "RegressionIPC"],
48 ["True", "True", "True", "2", "True", "OFF", "N.A", "RegressionIPCTfmLevel2"],
49 ["True", "True", "True", "3", "True", "OFF", "N.A", "RegressionIPCTfmLevel3"],
50 ["True", "True", "False", "1", "True", "OFF", "profile_small", "RegressionProfileS"],
51 ["True", "True", "True", "2", "True", "OFF", "profile_medium", "RegressionProfileM"],
Xinyu Zhang9b1aef92021-03-12 15:36:44 +080052 ["True", "True", "True", "3", "True", "OFF", "profile_large", "RegressionProfileL"],
Xinyu Zhang4f2ef5a2020-11-09 18:11:43 +080053 ["True", "True", "False", "1", "False", "INTERNAL_TRUSTED_STORAGE", "N.A", "PsaApiTest (ITS)"],
54 ["True", "True", "False", "1", "False", "PROTECTED_STORAGE", "N.A", "PsaApiTest (PS)"],
55 ["True", "True", "False", "1", "False", "CRYPTO", "N.A", "PsaApiTest (Crypto)"],
56 ["True", "True", "False", "1", "False", "INITIAL_ATTESTATION", "N.A", "PsaApiTest (Attest)"],
57 ["True", "True", "False", "1", "False", "IPC", "N.A", "PsaApiTest (FF)"],
58 ["True", "True", "True", "1", "False", "INTERNAL_TRUSTED_STORAGE", "N.A", "PsaApiTestIPC (ITS)"],
59 ["True", "True", "True", "1", "False", "PROTECTED_STORAGE", "N.A", "PsaApiTestIPC (PS)"],
60 ["True", "True", "True", "1", "False", "CRYPTO", "N.A", "PsaApiTestIPC (Crypto)"],
61 ["True", "True", "True", "1", "False", "INITIAL_ATTESTATION", "N.A", "PsaApiTestIPC (Attest)"],
62 ["True", "True", "True", "1", "False", "IPC", "N.A", "PsaApiTestIPC (FF)"],
63 ["True", "True", "True", "2", "False", "INTERNAL_TRUSTED_STORAGE", "N.A", "PsaApiTestIPCTfmLevel2 (ITS)"],
64 ["True", "True", "True", "2", "False", "PROTECTED_STORAGE", "N.A", "PsaApiTestIPCTfmLevel2 (PS)"],
65 ["True", "True", "True", "2", "False", "CRYPTO", "N.A", "PsaApiTestIPCTfmLevel2 (Crypto)"],
66 ["True", "True", "True", "2", "False", "INITIAL_ATTESTATION", "N.A", "PsaApiTestIPCTfmLevel2 (Attest)"],
67 ["True", "True", "True", "2", "False", "IPC", "N.A", "PsaApiTestIPCTfmLevel2 (FF)"],
68 ["True", "True", "True", "3", "False", "INTERNAL_TRUSTED_STORAGE", "N.A", "PsaApiTestIPCTfmLevel3 (ITS)"],
69 ["True", "True", "True", "3", "False", "PROTECTED_STORAGE", "N.A", "PsaApiTestIPCTfmLevel3 (PS)"],
70 ["True", "True", "True", "3", "False", "CRYPTO", "N.A", "PsaApiTestIPCTfmLevel3 (Crypto)"],
71 ["True", "True", "True", "3", "False", "INITIAL_ATTESTATION", "N.A", "PsaApiTestIPCTfmLevel3 (Attest)"],
72 ["True", "True", "True", "3", "False", "IPC", "N.A", "PsaApiTestIPCTfmLevel3 (FF)"],
73]
74
75cfgs = ["Default", "CoreIPC", "CoreIPCTfmLevel2", "CoreIPCTfmLevel3",
76 "Regression", "RegressionIPC",
77 "RegressionIPCTfmLevel2", "RegressionIPCTfmLevel3",
78 "DefaultProfileS", "RegressionProfileS",
79 "DefaultProfileM", "RegressionProfileM", "RegressionProfileM PSOFF",
Xinyu Zhang9b1aef92021-03-12 15:36:44 +080080 "DefaultProfileL", "RegressionProfileL",
Xinyu Zhang4f2ef5a2020-11-09 18:11:43 +080081 "PsaApiTest (Attest)", "PsaApiTestIPC (Attest)",
82 "PsaApiTestIPCTfmLevel2 (Attest)",
83 "PsaApiTest (Crypto)", "PsaApiTestIPC (Crypto)",
84 "PsaApiTestIPCTfmLevel2 (Crypto)",
85 "PsaApiTest (PS)", "PsaApiTestIPC (PS)",
86 "PsaApiTestIPCTfmLevel2 (PS)",
87 "PsaApiTest (ITS)", "PsaApiTestIPC (ITS)",
88 "PsaApiTestIPCTfmLevel2 (ITS)",
89 "PsaApiTestIPC (FF)",
90 "PsaApiTestIPCTfmLevel2 (FF)",
91 "PsaApiTestIPCTfmLevel3 (ITS)", "PsaApiTestIPCTfmLevel3 (PS)",
92 "PsaApiTestIPCTfmLevel3 (Crypto)", "PsaApiTestIPCTfmLevel3 (Attest)",
93 "PsaApiTestIPCTfmLevel3 (FF)"]
94
Xinyu Zhangaa3747f2020-12-24 16:27:06 +080095@NonCPS
Xinyu Zhang5c4bbca2020-09-24 16:36:03 +080096def generateLavaParam(build_params) {
97 def params = []
Summer Qin3c2b5722021-05-26 10:43:45 +080098 if (build_params["TFM_PLATFORM"] == "arm/musca_b1/sse_200" && \
Xinyu Zhang97114342021-01-21 14:08:03 +080099 build_params["OTP"] == "ENABLED") {
100 params += string(name: "TARGET_PLATFORM", value: "MUSCA_B1_OTP")
101 }
102 else {
103 params += string(name: "TARGET_PLATFORM", \
104 value: mapPlatform[build_params["TFM_PLATFORM"]])
105 }
Xinyu Zhang5c4bbca2020-09-24 16:36:03 +0800106 params += string(name: "COMPILER", \
107 value: mapCompiler[build_params["TOOLCHAIN_FILE"]])
108 params += string(name: "PSA_API_SUITE", \
109 value: mapTestPsaApi[build_params["TEST_PSA_API"]])
110
Xinyu Zhangdbfadae2020-12-07 14:42:59 +0800111 configName = "Config"
112 config_params = [build_params["BL2"], build_params["NS"], \
113 build_params["PSA_API"], build_params["ISOLATION_LEVEL"], \
114 build_params["TEST_REGRESSION"], build_params["TEST_PSA_API"], \
115 build_params["PROFILE"]]
116 for (config in mapConfigs) {
117 if (config_params == config[0..6]) {
Xinyu Zhangfc1bacd2020-12-24 15:26:35 +0800118 configName += config[7].replace(' (', '_').replace(')', '')
Xinyu Zhangdbfadae2020-12-07 14:42:59 +0800119 break
120 }
Xinyu Zhang5c4bbca2020-09-24 16:36:03 +0800121 }
Xinyu Zhangdbfadae2020-12-07 14:42:59 +0800122 if (configName == "Config") {
123 configName = "ConfigDefault"
124 }
125 params += string(name: "PROJ_CONFIG", value: configName)
Xinyu Zhangaa3747f2020-12-24 16:27:06 +0800126 print("Params of ${configName} :")
127 print(config_params)
Xinyu Zhang5c4bbca2020-09-24 16:36:03 +0800128 return params
129}
130
Dean Birch62c4f082020-01-17 16:13:26 +0000131def listConfigs(ci_scripts_dir, config_list, filter_group) {
132 dir(ci_scripts_dir) {
133 echo "Obtaining list of configs."
Matthew Hartfb6fd362020-03-04 21:03:59 +0000134 echo "Running: python3 ./configs.py -g ${filter_group.replace(" ", " -g ")}"
Dean Birch62c4f082020-01-17 16:13:26 +0000135 def build_config_list_raw = sh(script: """\
Matthew Hartfb6fd362020-03-04 21:03:59 +0000136python3 ./configs.py -g ${filter_group.replace(" ", " -g ")}
Dean Birch62c4f082020-01-17 16:13:26 +0000137""", returnStdout: true).trim()
138 def build_config_list = build_config_list_raw.tokenize('\n')
139 config_list.addAll(build_config_list)
140 }
141}
142
Matthew Hartfb6fd362020-03-04 21:03:59 +0000143def buildConfig(ci_scripts_dir, config, filter_group, results) {
Dean Birch62c4f082020-01-17 16:13:26 +0000144 def params = []
Matthew Hartfb6fd362020-03-04 21:03:59 +0000145 def params_collection = [:]
Dean Birch62c4f082020-01-17 16:13:26 +0000146 def build_config_params
147 dir(ci_scripts_dir) {
148 echo "Obtaining build configuration for config ${config}"
Matthew Hartfb6fd362020-03-04 21:03:59 +0000149 echo "Running: python3 ./configs.py -g ${filter_group.replace(" ", " -g ")} ${config}"
Dean Birch62c4f082020-01-17 16:13:26 +0000150 build_config_params = sh(script: """\
Matthew Hartfb6fd362020-03-04 21:03:59 +0000151python3 ./configs.py -g ${filter_group.replace(" ", " -g ")} ${config}
Dean Birch62c4f082020-01-17 16:13:26 +0000152""", returnStdout: true).trim()
153 }
154 def lines = build_config_params.tokenize('\n')
155 for (String line : lines) {
156 def key, value
157 (key, value) = line.tokenize('=')
158 params += string(name: key, value: value)
Matthew Hartfb6fd362020-03-04 21:03:59 +0000159 params_collection[key] = value
Dean Birch62c4f082020-01-17 16:13:26 +0000160 }
161 params += string(name: 'GERRIT_BRANCH', value: env.GERRIT_BRANCH)
Dean Birchd0f9f8c2020-03-26 11:10:33 +0000162 params += string(name: 'GERRIT_HOST', value: env.GERRIT_HOST)
163 params += string(name: 'GERRIT_CHANGE_NUMBER', value: env.GERRIT_CHANGE_NUMBER)
164 params += string(name: 'GERRIT_PATCHSET_REVISION', value: env.GERRIT_PATCHSET_REVISION)
Dean Birch62c4f082020-01-17 16:13:26 +0000165 params += string(name: 'GERRIT_REFSPEC', value: env.GERRIT_REFSPEC)
Karl Zhang02d30352020-08-20 13:48:52 +0800166 params += string(name: 'MBEDTLS_VERSION', value: env.MBEDTLS_VERSION)
Dean Birch62c4f082020-01-17 16:13:26 +0000167 params += string(name: 'CODE_REPO', value: env.CODE_REPO)
Karl Zhangf6f467e2020-07-10 16:24:45 +0800168 params += string(name: 'CODE_COVERAGE_EN', value: env.CODE_COVERAGE_EN)
Colin Thorbinson58703db2020-11-24 12:02:19 +0000169 params += string(name: 'CI_SCRIPTS_BRANCH', value: env.CI_SCRIPTS_BRANCH)
Hugo L'Hostise55a2752021-01-27 11:09:08 +0000170 if (env.JOB_NAME.equals("tf-m-nightly")) { //Setting the Memory footprint gathering.
171 params += string(name: 'SQUAD_CONFIGURATIONS', value: env.SQUAD_CONFIGURATIONS)
172 }
Dean Bircha6ede7e2020-03-13 14:00:33 +0000173 return { -> results
174 def build_res = build(job: 'tf-m-build-config', parameters: params, propagate: false)
175 def build_info = [build_res, config, params_collection]
176 results['builds'][build_res.number] = build_info
177 def build_url = build_res.getAbsoluteUrl()
178 print("${build_res.number}: ${config} ${build_res.result} ${build_url}")
179 failure_states = ["FAILURE", "ABORTED", "UNSTABLE", "NOT_BUILT"]
180 if (build_res.result in failure_states) {
181 error("Build failed at ${build_url}")
182 }
Karl Zhang2b10b342020-11-09 14:50:11 +0800183 else if (params_collection["NS"] == "False" || \
Karl Zhang0b7bb4a2021-01-18 16:22:08 +0800184 (params_collection["TFM_PLATFORM"].contains("musca_b1") && \
185 env.JOB_NAME.equals("tf-m-build-and-test")) || \
Xinyu Zhang661a17a2021-01-05 19:24:40 +0800186 (params_collection["PROFILE"] == "profile_medium" && \
187 params_collection["PARTITION_PS"] == "OFF")) {
Xinyu Zhang5c4bbca2020-09-24 16:36:03 +0800188 print("LAVA is not needed for ${build_url}")
189 }
Xinyu Zhang7bb69162021-07-01 03:40:53 +0100190 // Only submit LAVA test for a specified OTP enabled config in nightly or release job
191 else if (params_collection["OTP"] == "ENABLED" && \
192 params_collection["CONFIG_NAME"] != "MUSCA_B1_ARMCLANG_PSA_3_REG_Debug_OTP_BL2_NS") {
193 print("LAVA is not needed for ${build_url}")
194 }
195 else if (params_collection["CONFIG_NAME"] == "MUSCA_B1_ARMCLANG_PSA_3_REG_Debug_OTP_BL2_NS" && \
196 !(env.JOB_NAME.equals("tf-m-nightly") || env.JOB_NAME.equals("tf-m-release"))) {
Xinyu Zhang97114342021-01-21 14:08:03 +0800197 print("LAVA is not needed for ${build_url}")
198 }
Dean Bircha6ede7e2020-03-13 14:00:33 +0000199 else {
200 print("Doing LAVA stuff for ${build_url}")
Xinyu Zhangaa3747f2020-12-24 16:27:06 +0800201 params += generateLavaParam(params_collection)
Dean Bircha6ede7e2020-03-13 14:00:33 +0000202 params += string(name: 'BUILD_NUMBER', value: "${build_res.number}")
203 params += string(name: 'BUILD_URL', value: build_url)
Matthew Hartfb6fd362020-03-04 21:03:59 +0000204 params += string(name: 'LAVA_URL', value: env.LAVA_URL)
Dean Birch956416f2020-08-12 10:36:16 +0100205 params += string(name: 'CI_SCRIPTS_BRANCH', value: env.CI_SCRIPTS_BRANCH)
206 params += string(name: 'LAVA_CREDENTIALS', value: env.LAVA_CREDENTIALS)
Leonardo Sandoval12fbb2f2021-04-15 14:36:09 -0500207 params += string(name: 'CODE_COVERAGE_EN', value: env.CODE_COVERAGE_EN)
Dean Bircha6ede7e2020-03-13 14:00:33 +0000208 def lava_res = build(job: 'tf-m-lava-submit', parameters: params, propagate: false)
Xinyu Zhang32f8c1c2021-05-12 14:38:24 +0800209 def lava_resubmitted = false
Matthew Hartfb6fd362020-03-04 21:03:59 +0000210 if (lava_res.result in failure_states) {
211 error("LAVA Create and Submit failed at ${lava_res.getAbsoluteUrl()}")
212 }
213 else {
Xinyu Zhang32f8c1c2021-05-12 14:38:24 +0800214 lava_des = lava_res.getDescription()
215 if (lava_des.contains(" Submitted twice!")) {
216 lava_resubmitted = true
217 lava_des = lava_des - " Submitted twice!"
218 }
219 results['lava_jobs'] += lava_des
Matthew Hartfb6fd362020-03-04 21:03:59 +0000220 }
Xinyu Zhang97ee3fd2020-12-14 14:45:06 +0800221 links = "Build Config: ${config}\n"
222 links += "Build URL: ${build_url}\n"
223 links += "LAVA Submit: ${lava_res.getAbsoluteUrl()}"
Xinyu Zhang32f8c1c2021-05-12 14:38:24 +0800224 if (lava_resubmitted) {
225 links += "\nLAVA Job Re-Submitted!"
226 }
Xinyu Zhang97ee3fd2020-12-14 14:45:06 +0800227 print(links)
Dean Birch62c4f082020-01-17 16:13:26 +0000228 }
229 }
230}
231
Matthew Hart06340d72020-06-15 16:08:20 +0100232def buildDocs(results) {
Dean Birch62c4f082020-01-17 16:13:26 +0000233 def params = []
234 params += string(name: 'GERRIT_BRANCH', value: env.GERRIT_BRANCH)
Dean Birchd0f9f8c2020-03-26 11:10:33 +0000235 params += string(name: 'GERRIT_HOST', value: env.GERRIT_HOST)
236 params += string(name: 'GERRIT_CHANGE_NUMBER', value: env.GERRIT_CHANGE_NUMBER)
237 params += string(name: 'GERRIT_PATCHSET_REVISION', value: env.GERRIT_PATCHSET_REVISION)
Dean Birch62c4f082020-01-17 16:13:26 +0000238 params += string(name: 'GERRIT_REFSPEC', value: env.GERRIT_REFSPEC)
Karl Zhang02d30352020-08-20 13:48:52 +0800239 params += string(name: 'MBEDTLS_VERSION', value: env.MBEDTLS_VERSION)
Dean Birch62c4f082020-01-17 16:13:26 +0000240 params += string(name: 'CODE_REPO', value: env.CODE_REPO)
Colin Thorbinson58703db2020-11-24 12:02:19 +0000241 params += string(name: 'CI_SCRIPTS_BRANCH', value: env.CI_SCRIPTS_BRANCH)
Matthew Hart06340d72020-06-15 16:08:20 +0100242 return { -> results
Dean Birch62c4f082020-01-17 16:13:26 +0000243 def res = build(job: 'tf-m-build-docs', parameters: params, propagate:false)
244 print("${res.number}: Docs ${res.result} ${res.getAbsoluteUrl()}")
Matthew Hart06340d72020-06-15 16:08:20 +0100245 results['docs'] = [res.number, res.result, params]
Dean Bircha6ede7e2020-03-13 14:00:33 +0000246 if (res.result in ["FAILURE", "ABORTED", "UNSTABLE", "NOT_BUILT"]) {
Dean Birch62c4f082020-01-17 16:13:26 +0000247 error("Build failed at ${res.getAbsoluteUrl()}")
248 }
249 }
250}
251
Xinyu Zhang38a18872020-11-23 16:45:28 +0800252def generateEmailBody(stage, failed_jobs) {
253 body = "Check console output at ${env.BUILD_URL} \n\n"
254
255 body += "Failed Jobs:\n"
256 failed_jobs.each { job ->
257 body += "${job.key} ${job.value}\n"
258 }
259
260 body += "\nFor detailed ${stage} results please refer to \
261 ${env.BUILD_URL}artifact/${stage}_results.csv \n"
262 return body
263}
264
265def emailNotification(results, stage, failed_jobs) {
Karl Zhang0413e972020-09-18 17:59:26 +0800266 script {
267 if (env.JOB_NAME.equals("tf-m-nightly") && !env.EMAIL_NOTIFICATION.equals('')) {
268 def result = "Fail."
Karl Zhang182ecdf2020-10-10 09:52:12 +0800269 if (results == true) {
Karl Zhang0413e972020-09-18 17:59:26 +0800270 result = "Success."
Karl Zhang182ecdf2020-10-10 09:52:12 +0800271 print("Skip sending as ${result} for ${stage}")
272 }
273 else {
274 emailext (
275 subject: ("Job ${env.JOB_NAME} ${stage} ${env.BUILD_NUMBER} ${result}"),
Xinyu Zhang38a18872020-11-23 16:45:28 +0800276 body: generateEmailBody(stage, failed_jobs),
Karl Zhang182ecdf2020-10-10 09:52:12 +0800277 to: "${EMAIL_NOTIFICATION}"
278 )
279 }
Karl Zhang0413e972020-09-18 17:59:26 +0800280 }
281 } /* script */
282}
283
Xinyu Zhang38a18872020-11-23 16:45:28 +0800284def filterFailedBuild(results) {
285 def failed_builds = [:]
286 results.each { result ->
287 if (result.value[0].getResult() == "FAILURE") {
288 failed_builds[result.value[1]] = result.value[0].getAbsoluteUrl()
289 }
290 }
291 return failed_builds
292}
293
294def filterFailedTest(string) {
295 def failed_tests = [:]
296 line = lineInString(string, "FAILURE_TESTS:")
297 a = line.split(' ')
298 if (a.size() > 1) {
299 a = line.split(' ')[1..-1]
300 a.each { fail_test ->
301 config_link = fail_test.split(':')
302 failed_tests[config_link[0]] = config_link[1..-1].join(':')
303 }
304 }
305 return failed_tests
306}
307
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800308@NonCPS
309def generateCsvContent(results) {
310 def resultsParam = []
311 results.each { result ->
Xinyu Zhang4f2ef5a2020-11-09 18:11:43 +0800312 if (result.value[2]['BL2'] == "True") {
313 resultsParam.add([result.value[1], \
314 result.value[0].getResult(), \
315 result.value[2]['TFM_PLATFORM'], \
316 result.value[2]['TOOLCHAIN_FILE'], \
317 result.value[2]['CMAKE_BUILD_TYPE'], \
318 result.value[2]['BL2'], \
319 result.value[2]['NS'], \
320 result.value[2]['PSA_API'], \
321 result.value[2]['ISOLATION_LEVEL'], \
322 result.value[2]['TEST_REGRESSION'], \
323 result.value[2]['TEST_PSA_API'], \
324 result.value[2]['PROFILE'], \
325 result.value[2]['PARTITION_PS'], \
326 result.value[2]['OTP']])
327 }
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800328 }
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800329 resultsParam.each { result ->
Xinyu Zhang18a73542020-12-24 14:19:07 +0800330 if (result[2] == 'musca_b1/sse_200') {
Xinyu Zhang4f2ef5a2020-11-09 18:11:43 +0800331 if (result[13] != 'off') {
Xinyu Zhang18a73542020-12-24 14:19:07 +0800332 result[2] = 'musca_b1/sse_200_OTP'
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800333 }
334 }
Xinyu Zhang4f2ef5a2020-11-09 18:11:43 +0800335 result[3] = mapCompiler[result[3]]
336 build_params = result[5..12]
337 configName = ""
338 for (map_cfg in mapConfigs) {
339 if (build_params[0..6] == map_cfg[0..6]) {
340 configName = map_cfg[7]
341 break
342 }
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800343 }
Xinyu Zhang4f2ef5a2020-11-09 18:11:43 +0800344 if (configName == "") {
345 configName = "Default"
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800346 }
Xinyu Zhang4f2ef5a2020-11-09 18:11:43 +0800347 else if (configName == "RegressionProfileM") {
348 if (build_params[7] == "OFF") {
349 configName = "RegressionProfileM PSOFF"
350 }
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800351 }
Xinyu Zhang4f2ef5a2020-11-09 18:11:43 +0800352 result.add(configName)
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800353 }
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800354 def csvContent = []
355 resultsParam.each { result ->
Xinyu Zhang4f2ef5a2020-11-09 18:11:43 +0800356 current_row = result[2..4]
357 cfgs.each {cfg ->
358 if (cfg == result[14]) {
359 current_row.add(cfg)
360 current_row.add(result[1])
361 }
362 }
363 csvContent.add(current_row)
364 }
365 csvContent.sort{a,b -> a[0] <=> b[0] ?: a[1] <=> b[1] ?: a[2] <=> b[2]}
366 build_summary = []
367 current_platform = ""
368 current_compiler = ""
369 current_build_type = ""
370 csvContent.each { build_cfg ->
371 if (current_platform != build_cfg[0] || \
372 current_compiler != build_cfg[1] || \
373 current_build_type != build_cfg[2]) {
374 current_platform = build_cfg[0]
375 current_compiler = build_cfg[1]
376 current_build_type = build_cfg[2]
377 csv_line = [current_platform, current_compiler, current_build_type]
378 cfgs.each {
379 csv_line.add("N.A.")
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800380 }
Xinyu Zhang4f2ef5a2020-11-09 18:11:43 +0800381 build_summary.add(csv_line)
382 }
383 i = 0
384 cfgs.each { cfg ->
385 if (cfg == build_cfg[3]) {
386 build_summary[-1][3+i] = build_cfg[4]
387 }
388 i += 1
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800389 }
390 }
Xinyu Zhang4f2ef5a2020-11-09 18:11:43 +0800391 build_summary.add(0, ['Platform', 'Compiler', 'Cmake Build Type'])
392 build_summary[0] += cfgs
393 return build_summary
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800394}
395
396def generateBuildCsv(results) {
397 def csvContent = generateCsvContent(results)
398 node("master") {
399 writeCSV file: 'build_results.csv', records: csvContent, format: CSVFormat.EXCEL
400 archiveArtifacts 'build_results.csv'
401 }
402}
Dean Bircha6ede7e2020-03-13 14:00:33 +0000403
404def buildCsv(results) {
Dean Birchd0f9f8c2020-03-26 11:10:33 +0000405 def summary = new Summary();
Dean Bircha6ede7e2020-03-13 14:00:33 +0000406 def csvContent = summary.getBuildCsv(results)
407 node("master") {
408 writeCSV file: 'build_results.csv', records: csvContent, format: CSVFormat.EXCEL
409 archiveArtifacts 'build_results.csv'
410 }
411}
412
413def writeSummary(results) {
Dean Birchd0f9f8c2020-03-26 11:10:33 +0000414 def summary = new Summary();
Dean Bircha6ede7e2020-03-13 14:00:33 +0000415 def buildLinks = summary.getLinks(results)
416 node("master") {
417 writeFile file: "build_links.html", text: buildLinks
418 archiveArtifacts 'build_links.html'
419 }
420}
421
Matthew Hartfb6fd362020-03-04 21:03:59 +0000422def lineInString(string, match) {
423 def lines = string.split("\n")
424 def result = lines.findAll { it.contains(match) }
425 return result[0]
426}
427
Xinyu Zhang97ee3fd2020-12-14 14:45:06 +0800428def showLinks(string) {
429 def lines = string.split("\n")
430 def result = lines.findAll { it.contains("Build Config: ")}
431 links = result.join("\n")
432 print(links)
433}
434
Matthew Hartfb6fd362020-03-04 21:03:59 +0000435def getResult(string, match) {
436 line = lineInString(string, match)
Dean Birch1d545c02020-05-29 14:09:21 +0100437 a = line.split(match)[1].split(' ')
438 score = a[0]
439 if (a.size() > 1)
440 {
441 fail_text = a[1..-1].join(" ")
442 return [score, fail_text]
443 }
444 return [score, ""]
Matthew Hartfb6fd362020-03-04 21:03:59 +0000445}
446
447def submitJobsToList(results) {
448 def all_jobs = []
449 for (String result : results){
450 jobs_s = result.split('JOBS: ')
451 if (jobs_s.size() > 1) {
452 all_jobs += jobs_s[1]
453 }
454 }
455 return(all_jobs)
456}
457
Dean Birch62c4f082020-01-17 16:13:26 +0000458def configs = []
459def builds = [:]
Matthew Hartfb6fd362020-03-04 21:03:59 +0000460def results = [:]
Dean Birch62c4f082020-01-17 16:13:26 +0000461
Xinyu Zhang4cdfd1b2021-05-21 15:10:49 +0800462timestamps {
463 node("docker-amd64-tf-m-bionic") {
464 stage("Init") {
465 cleanWs()
466 dir("tf-m-ci-scripts") {
467 checkout([$class: 'GitSCM', branches: [[name: '$CI_SCRIPTS_BRANCH']], userRemoteConfigs: [[credentialsId: 'GIT_SSH_KEY', url: '$CI_SCRIPTS_REPO']]])
468 }
469 }
470 stage("Configs") {
471 // Populate configs
472 listConfigs('tf-m-ci-scripts', configs, env.FILTER_GROUP)
473 results['builds'] = [:]
474 results['lava_jobs'] = []
475 for (config in configs) {
476 builds[config] = buildConfig("tf-m-ci-scripts", config, env.FILTER_GROUP, results)
477 }
478 builds["docs"] = buildDocs(results)
Dean Birch62c4f082020-01-17 16:13:26 +0000479 }
480 }
Karl Zhangfec84102020-06-24 09:56:36 +0800481
Xinyu Zhang4cdfd1b2021-05-21 15:10:49 +0800482 stage("Builds") {
483 def verify = 1
Matthew Hartfb6fd362020-03-04 21:03:59 +0000484 def success = true
Matthew Hartfb6fd362020-03-04 21:03:59 +0000485 try {
Xinyu Zhang4cdfd1b2021-05-21 15:10:49 +0800486 parallel(builds)
487 } catch (Exception e) {
488 print(e)
489 manager.buildFailure()
490 verify = -1
491 success = false
492 } finally {
493 print("Verifying status")
494 def failed_builds = filterFailedBuild(results['builds'])
495 emailNotification(success, 'build', failed_builds)
496 g = new Gerrit()
497 g.verifyStatus(verify, 'tf-m-build', 'build')
498 print("Building CSV")
499 generateBuildCsv(results['builds'])
500 writeSummary(results['builds'])
501 }
502 }
503
504 node("docker-amd64-tf-m-bionic") {
505 stage("Tests") {
506 dir("tf-m-ci-scripts") {
507 checkout([$class: 'GitSCM', branches: [[name: '$CI_SCRIPTS_BRANCH']], userRemoteConfigs: [[credentialsId: 'GIT_SSH_KEY', url: '$CI_SCRIPTS_REPO']]])
508 }
509 def all_jobs = []
510 def success = true
511 print("Wait for LAVA results here...")
512 try {
513 all_jobs = submitJobsToList(results['lava_jobs'])
514 if (all_jobs.size() > 0) {
515 dir("tf-m-ci-scripts") {
516 withCredentials([usernamePassword(credentialsId: env.LAVA_CREDENTIALS, passwordVariable: 'LAVA_TOKEN', usernameVariable: 'LAVA_USER')]) {
517 output = sh(script: """./lava_helper/lava_wait_jobs.py --job-ids ${all_jobs.join(",")} \
518 --lava-url ${env.LAVA_URL} --lava-user ${LAVA_USER} --lava-token ${LAVA_TOKEN} \
519 --artifacts-path lava_artifacts --lava-timeout 7200 \
520 """, returnStdout: true).trim()
521 showLinks(output)
522 archiveArtifacts artifacts: 'test_summary.*', allowEmptyArchive: true
523 archiveArtifacts artifacts: 'test_results.csv', allowEmptyArchive: true
524 g = new Gerrit()
525 def (boot_result, boot_output) = getResult(output, 'BOOT_RESULT: ')
526 if (boot_result) {
527 g.verifyStatus(boot_result, "lava_boot", "test")
528 }
529 def (test_result, test_output) = getResult(output, 'TEST_RESULT: ')
530 if (test_result) {
531 g.verifyStatus(test_result, "lava_test", "test")
532 }
533 if (boot_result.toInteger() < 1 || test_result.toInteger() < 1) {
534 error("Marking job as failed due to failed boots: ${boot_output} or tests: ${test_output}")
535 }
Matthew Hartfb6fd362020-03-04 21:03:59 +0000536 }
537 }
538 }
Xinyu Zhang4cdfd1b2021-05-21 15:10:49 +0800539 else {
540 print("There were no LAVA jobs to test.")
541 }
Matthew Hartfb6fd362020-03-04 21:03:59 +0000542 }
Xinyu Zhang4cdfd1b2021-05-21 15:10:49 +0800543 catch (Exception e) {
544 print("ERROR: ${e}")
545 success = false
546 } finally {
547 archiveArtifacts artifacts: 'tf-m-ci-scripts/lava_artifacts/**', allowEmptyArchive: true
548 if (all_jobs.size() > 0) {
549 emailNotification(success, 'test', filterFailedTest(output))
550 }
551 cleanWs()
552 if (!success) {
553 error("There was an Error waiting for LAVA jobs")
554 }
Matthew Hartfb6fd362020-03-04 21:03:59 +0000555 }
Dean Bircha6ede7e2020-03-13 14:00:33 +0000556 }
557 }
Dean Bircha6ede7e2020-03-13 14:00:33 +0000558}