blob: 89a07d858f275f9392c63a2fa90b43d5e3c07a0d [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 Zhang16e94472021-06-08 16:23:38 +0800190 // Workaround: test cases on MUSCA_B1 with OTP enabled could not pass for the time being.
191 // Do not test it to aviod blocking CI.
192 else if (params_collection["OTP"] == "ENABLED") {
Xinyu Zhang97114342021-01-21 14:08:03 +0800193 print("LAVA is not needed for ${build_url}")
194 }
Dean Bircha6ede7e2020-03-13 14:00:33 +0000195 else {
196 print("Doing LAVA stuff for ${build_url}")
Xinyu Zhangaa3747f2020-12-24 16:27:06 +0800197 params += generateLavaParam(params_collection)
Dean Bircha6ede7e2020-03-13 14:00:33 +0000198 params += string(name: 'BUILD_NUMBER', value: "${build_res.number}")
199 params += string(name: 'BUILD_URL', value: build_url)
Matthew Hartfb6fd362020-03-04 21:03:59 +0000200 params += string(name: 'LAVA_URL', value: env.LAVA_URL)
Dean Birch956416f2020-08-12 10:36:16 +0100201 params += string(name: 'CI_SCRIPTS_BRANCH', value: env.CI_SCRIPTS_BRANCH)
202 params += string(name: 'LAVA_CREDENTIALS', value: env.LAVA_CREDENTIALS)
Leonardo Sandoval12fbb2f2021-04-15 14:36:09 -0500203 params += string(name: 'CODE_COVERAGE_EN', value: env.CODE_COVERAGE_EN)
Dean Bircha6ede7e2020-03-13 14:00:33 +0000204 def lava_res = build(job: 'tf-m-lava-submit', parameters: params, propagate: false)
Xinyu Zhang32f8c1c2021-05-12 14:38:24 +0800205 def lava_resubmitted = false
Matthew Hartfb6fd362020-03-04 21:03:59 +0000206 if (lava_res.result in failure_states) {
207 error("LAVA Create and Submit failed at ${lava_res.getAbsoluteUrl()}")
208 }
209 else {
Xinyu Zhang32f8c1c2021-05-12 14:38:24 +0800210 lava_des = lava_res.getDescription()
211 if (lava_des.contains(" Submitted twice!")) {
212 lava_resubmitted = true
213 lava_des = lava_des - " Submitted twice!"
214 }
215 results['lava_jobs'] += lava_des
Matthew Hartfb6fd362020-03-04 21:03:59 +0000216 }
Xinyu Zhang97ee3fd2020-12-14 14:45:06 +0800217 links = "Build Config: ${config}\n"
218 links += "Build URL: ${build_url}\n"
219 links += "LAVA Submit: ${lava_res.getAbsoluteUrl()}"
Xinyu Zhang32f8c1c2021-05-12 14:38:24 +0800220 if (lava_resubmitted) {
221 links += "\nLAVA Job Re-Submitted!"
222 }
Xinyu Zhang97ee3fd2020-12-14 14:45:06 +0800223 print(links)
Dean Birch62c4f082020-01-17 16:13:26 +0000224 }
225 }
226}
227
Matthew Hart06340d72020-06-15 16:08:20 +0100228def buildDocs(results) {
Dean Birch62c4f082020-01-17 16:13:26 +0000229 def params = []
230 params += string(name: 'GERRIT_BRANCH', value: env.GERRIT_BRANCH)
Dean Birchd0f9f8c2020-03-26 11:10:33 +0000231 params += string(name: 'GERRIT_HOST', value: env.GERRIT_HOST)
232 params += string(name: 'GERRIT_CHANGE_NUMBER', value: env.GERRIT_CHANGE_NUMBER)
233 params += string(name: 'GERRIT_PATCHSET_REVISION', value: env.GERRIT_PATCHSET_REVISION)
Dean Birch62c4f082020-01-17 16:13:26 +0000234 params += string(name: 'GERRIT_REFSPEC', value: env.GERRIT_REFSPEC)
Karl Zhang02d30352020-08-20 13:48:52 +0800235 params += string(name: 'MBEDTLS_VERSION', value: env.MBEDTLS_VERSION)
Dean Birch62c4f082020-01-17 16:13:26 +0000236 params += string(name: 'CODE_REPO', value: env.CODE_REPO)
Colin Thorbinson58703db2020-11-24 12:02:19 +0000237 params += string(name: 'CI_SCRIPTS_BRANCH', value: env.CI_SCRIPTS_BRANCH)
Matthew Hart06340d72020-06-15 16:08:20 +0100238 return { -> results
Dean Birch62c4f082020-01-17 16:13:26 +0000239 def res = build(job: 'tf-m-build-docs', parameters: params, propagate:false)
240 print("${res.number}: Docs ${res.result} ${res.getAbsoluteUrl()}")
Matthew Hart06340d72020-06-15 16:08:20 +0100241 results['docs'] = [res.number, res.result, params]
Dean Bircha6ede7e2020-03-13 14:00:33 +0000242 if (res.result in ["FAILURE", "ABORTED", "UNSTABLE", "NOT_BUILT"]) {
Dean Birch62c4f082020-01-17 16:13:26 +0000243 error("Build failed at ${res.getAbsoluteUrl()}")
244 }
245 }
246}
247
Xinyu Zhang38a18872020-11-23 16:45:28 +0800248def generateEmailBody(stage, failed_jobs) {
249 body = "Check console output at ${env.BUILD_URL} \n\n"
250
251 body += "Failed Jobs:\n"
252 failed_jobs.each { job ->
253 body += "${job.key} ${job.value}\n"
254 }
255
256 body += "\nFor detailed ${stage} results please refer to \
257 ${env.BUILD_URL}artifact/${stage}_results.csv \n"
258 return body
259}
260
261def emailNotification(results, stage, failed_jobs) {
Karl Zhang0413e972020-09-18 17:59:26 +0800262 script {
263 if (env.JOB_NAME.equals("tf-m-nightly") && !env.EMAIL_NOTIFICATION.equals('')) {
264 def result = "Fail."
Karl Zhang182ecdf2020-10-10 09:52:12 +0800265 if (results == true) {
Karl Zhang0413e972020-09-18 17:59:26 +0800266 result = "Success."
Karl Zhang182ecdf2020-10-10 09:52:12 +0800267 print("Skip sending as ${result} for ${stage}")
268 }
269 else {
270 emailext (
271 subject: ("Job ${env.JOB_NAME} ${stage} ${env.BUILD_NUMBER} ${result}"),
Xinyu Zhang38a18872020-11-23 16:45:28 +0800272 body: generateEmailBody(stage, failed_jobs),
Karl Zhang182ecdf2020-10-10 09:52:12 +0800273 to: "${EMAIL_NOTIFICATION}"
274 )
275 }
Karl Zhang0413e972020-09-18 17:59:26 +0800276 }
277 } /* script */
278}
279
Xinyu Zhang38a18872020-11-23 16:45:28 +0800280def filterFailedBuild(results) {
281 def failed_builds = [:]
282 results.each { result ->
283 if (result.value[0].getResult() == "FAILURE") {
284 failed_builds[result.value[1]] = result.value[0].getAbsoluteUrl()
285 }
286 }
287 return failed_builds
288}
289
290def filterFailedTest(string) {
291 def failed_tests = [:]
292 line = lineInString(string, "FAILURE_TESTS:")
293 a = line.split(' ')
294 if (a.size() > 1) {
295 a = line.split(' ')[1..-1]
296 a.each { fail_test ->
297 config_link = fail_test.split(':')
298 failed_tests[config_link[0]] = config_link[1..-1].join(':')
299 }
300 }
301 return failed_tests
302}
303
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800304@NonCPS
305def generateCsvContent(results) {
306 def resultsParam = []
307 results.each { result ->
Xinyu Zhang4f2ef5a2020-11-09 18:11:43 +0800308 if (result.value[2]['BL2'] == "True") {
309 resultsParam.add([result.value[1], \
310 result.value[0].getResult(), \
311 result.value[2]['TFM_PLATFORM'], \
312 result.value[2]['TOOLCHAIN_FILE'], \
313 result.value[2]['CMAKE_BUILD_TYPE'], \
314 result.value[2]['BL2'], \
315 result.value[2]['NS'], \
316 result.value[2]['PSA_API'], \
317 result.value[2]['ISOLATION_LEVEL'], \
318 result.value[2]['TEST_REGRESSION'], \
319 result.value[2]['TEST_PSA_API'], \
320 result.value[2]['PROFILE'], \
321 result.value[2]['PARTITION_PS'], \
322 result.value[2]['OTP']])
323 }
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800324 }
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800325 resultsParam.each { result ->
Xinyu Zhang18a73542020-12-24 14:19:07 +0800326 if (result[2] == 'musca_b1/sse_200') {
Xinyu Zhang4f2ef5a2020-11-09 18:11:43 +0800327 if (result[13] != 'off') {
Xinyu Zhang18a73542020-12-24 14:19:07 +0800328 result[2] = 'musca_b1/sse_200_OTP'
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800329 }
330 }
Xinyu Zhang4f2ef5a2020-11-09 18:11:43 +0800331 result[3] = mapCompiler[result[3]]
332 build_params = result[5..12]
333 configName = ""
334 for (map_cfg in mapConfigs) {
335 if (build_params[0..6] == map_cfg[0..6]) {
336 configName = map_cfg[7]
337 break
338 }
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800339 }
Xinyu Zhang4f2ef5a2020-11-09 18:11:43 +0800340 if (configName == "") {
341 configName = "Default"
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800342 }
Xinyu Zhang4f2ef5a2020-11-09 18:11:43 +0800343 else if (configName == "RegressionProfileM") {
344 if (build_params[7] == "OFF") {
345 configName = "RegressionProfileM PSOFF"
346 }
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800347 }
Xinyu Zhang4f2ef5a2020-11-09 18:11:43 +0800348 result.add(configName)
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800349 }
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800350 def csvContent = []
351 resultsParam.each { result ->
Xinyu Zhang4f2ef5a2020-11-09 18:11:43 +0800352 current_row = result[2..4]
353 cfgs.each {cfg ->
354 if (cfg == result[14]) {
355 current_row.add(cfg)
356 current_row.add(result[1])
357 }
358 }
359 csvContent.add(current_row)
360 }
361 csvContent.sort{a,b -> a[0] <=> b[0] ?: a[1] <=> b[1] ?: a[2] <=> b[2]}
362 build_summary = []
363 current_platform = ""
364 current_compiler = ""
365 current_build_type = ""
366 csvContent.each { build_cfg ->
367 if (current_platform != build_cfg[0] || \
368 current_compiler != build_cfg[1] || \
369 current_build_type != build_cfg[2]) {
370 current_platform = build_cfg[0]
371 current_compiler = build_cfg[1]
372 current_build_type = build_cfg[2]
373 csv_line = [current_platform, current_compiler, current_build_type]
374 cfgs.each {
375 csv_line.add("N.A.")
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800376 }
Xinyu Zhang4f2ef5a2020-11-09 18:11:43 +0800377 build_summary.add(csv_line)
378 }
379 i = 0
380 cfgs.each { cfg ->
381 if (cfg == build_cfg[3]) {
382 build_summary[-1][3+i] = build_cfg[4]
383 }
384 i += 1
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800385 }
386 }
Xinyu Zhang4f2ef5a2020-11-09 18:11:43 +0800387 build_summary.add(0, ['Platform', 'Compiler', 'Cmake Build Type'])
388 build_summary[0] += cfgs
389 return build_summary
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800390}
391
392def generateBuildCsv(results) {
393 def csvContent = generateCsvContent(results)
394 node("master") {
395 writeCSV file: 'build_results.csv', records: csvContent, format: CSVFormat.EXCEL
396 archiveArtifacts 'build_results.csv'
397 }
398}
Dean Bircha6ede7e2020-03-13 14:00:33 +0000399
400def buildCsv(results) {
Dean Birchd0f9f8c2020-03-26 11:10:33 +0000401 def summary = new Summary();
Dean Bircha6ede7e2020-03-13 14:00:33 +0000402 def csvContent = summary.getBuildCsv(results)
403 node("master") {
404 writeCSV file: 'build_results.csv', records: csvContent, format: CSVFormat.EXCEL
405 archiveArtifacts 'build_results.csv'
406 }
407}
408
409def writeSummary(results) {
Dean Birchd0f9f8c2020-03-26 11:10:33 +0000410 def summary = new Summary();
Dean Bircha6ede7e2020-03-13 14:00:33 +0000411 def buildLinks = summary.getLinks(results)
412 node("master") {
413 writeFile file: "build_links.html", text: buildLinks
414 archiveArtifacts 'build_links.html'
415 }
416}
417
Matthew Hartfb6fd362020-03-04 21:03:59 +0000418def lineInString(string, match) {
419 def lines = string.split("\n")
420 def result = lines.findAll { it.contains(match) }
421 return result[0]
422}
423
Xinyu Zhang97ee3fd2020-12-14 14:45:06 +0800424def showLinks(string) {
425 def lines = string.split("\n")
426 def result = lines.findAll { it.contains("Build Config: ")}
427 links = result.join("\n")
428 print(links)
429}
430
Matthew Hartfb6fd362020-03-04 21:03:59 +0000431def getResult(string, match) {
432 line = lineInString(string, match)
Dean Birch1d545c02020-05-29 14:09:21 +0100433 a = line.split(match)[1].split(' ')
434 score = a[0]
435 if (a.size() > 1)
436 {
437 fail_text = a[1..-1].join(" ")
438 return [score, fail_text]
439 }
440 return [score, ""]
Matthew Hartfb6fd362020-03-04 21:03:59 +0000441}
442
443def submitJobsToList(results) {
444 def all_jobs = []
445 for (String result : results){
446 jobs_s = result.split('JOBS: ')
447 if (jobs_s.size() > 1) {
448 all_jobs += jobs_s[1]
449 }
450 }
451 return(all_jobs)
452}
453
Dean Birch62c4f082020-01-17 16:13:26 +0000454def configs = []
455def builds = [:]
Matthew Hartfb6fd362020-03-04 21:03:59 +0000456def results = [:]
Dean Birch62c4f082020-01-17 16:13:26 +0000457
Xinyu Zhang4cdfd1b2021-05-21 15:10:49 +0800458timestamps {
459 node("docker-amd64-tf-m-bionic") {
460 stage("Init") {
461 cleanWs()
462 dir("tf-m-ci-scripts") {
463 checkout([$class: 'GitSCM', branches: [[name: '$CI_SCRIPTS_BRANCH']], userRemoteConfigs: [[credentialsId: 'GIT_SSH_KEY', url: '$CI_SCRIPTS_REPO']]])
464 }
465 }
466 stage("Configs") {
467 // Populate configs
468 listConfigs('tf-m-ci-scripts', configs, env.FILTER_GROUP)
469 results['builds'] = [:]
470 results['lava_jobs'] = []
471 for (config in configs) {
472 builds[config] = buildConfig("tf-m-ci-scripts", config, env.FILTER_GROUP, results)
473 }
474 builds["docs"] = buildDocs(results)
Dean Birch62c4f082020-01-17 16:13:26 +0000475 }
476 }
Karl Zhangfec84102020-06-24 09:56:36 +0800477
Xinyu Zhang4cdfd1b2021-05-21 15:10:49 +0800478 stage("Builds") {
479 def verify = 1
Matthew Hartfb6fd362020-03-04 21:03:59 +0000480 def success = true
Matthew Hartfb6fd362020-03-04 21:03:59 +0000481 try {
Xinyu Zhang4cdfd1b2021-05-21 15:10:49 +0800482 parallel(builds)
483 } catch (Exception e) {
484 print(e)
485 manager.buildFailure()
486 verify = -1
487 success = false
488 } finally {
489 print("Verifying status")
490 def failed_builds = filterFailedBuild(results['builds'])
491 emailNotification(success, 'build', failed_builds)
492 g = new Gerrit()
493 g.verifyStatus(verify, 'tf-m-build', 'build')
494 print("Building CSV")
495 generateBuildCsv(results['builds'])
496 writeSummary(results['builds'])
497 }
498 }
499
500 node("docker-amd64-tf-m-bionic") {
501 stage("Tests") {
502 dir("tf-m-ci-scripts") {
503 checkout([$class: 'GitSCM', branches: [[name: '$CI_SCRIPTS_BRANCH']], userRemoteConfigs: [[credentialsId: 'GIT_SSH_KEY', url: '$CI_SCRIPTS_REPO']]])
504 }
505 def all_jobs = []
506 def success = true
507 print("Wait for LAVA results here...")
508 try {
509 all_jobs = submitJobsToList(results['lava_jobs'])
510 if (all_jobs.size() > 0) {
511 dir("tf-m-ci-scripts") {
512 withCredentials([usernamePassword(credentialsId: env.LAVA_CREDENTIALS, passwordVariable: 'LAVA_TOKEN', usernameVariable: 'LAVA_USER')]) {
513 output = sh(script: """./lava_helper/lava_wait_jobs.py --job-ids ${all_jobs.join(",")} \
514 --lava-url ${env.LAVA_URL} --lava-user ${LAVA_USER} --lava-token ${LAVA_TOKEN} \
515 --artifacts-path lava_artifacts --lava-timeout 7200 \
516 """, returnStdout: true).trim()
517 showLinks(output)
518 archiveArtifacts artifacts: 'test_summary.*', allowEmptyArchive: true
519 archiveArtifacts artifacts: 'test_results.csv', allowEmptyArchive: true
520 g = new Gerrit()
521 def (boot_result, boot_output) = getResult(output, 'BOOT_RESULT: ')
522 if (boot_result) {
523 g.verifyStatus(boot_result, "lava_boot", "test")
524 }
525 def (test_result, test_output) = getResult(output, 'TEST_RESULT: ')
526 if (test_result) {
527 g.verifyStatus(test_result, "lava_test", "test")
528 }
529 if (boot_result.toInteger() < 1 || test_result.toInteger() < 1) {
530 error("Marking job as failed due to failed boots: ${boot_output} or tests: ${test_output}")
531 }
Matthew Hartfb6fd362020-03-04 21:03:59 +0000532 }
533 }
534 }
Xinyu Zhang4cdfd1b2021-05-21 15:10:49 +0800535 else {
536 print("There were no LAVA jobs to test.")
537 }
Matthew Hartfb6fd362020-03-04 21:03:59 +0000538 }
Xinyu Zhang4cdfd1b2021-05-21 15:10:49 +0800539 catch (Exception e) {
540 print("ERROR: ${e}")
541 success = false
542 } finally {
543 archiveArtifacts artifacts: 'tf-m-ci-scripts/lava_artifacts/**', allowEmptyArchive: true
544 if (all_jobs.size() > 0) {
545 emailNotification(success, 'test', filterFailedTest(output))
546 }
547 cleanWs()
548 if (!success) {
549 error("There was an Error waiting for LAVA jobs")
550 }
Matthew Hartfb6fd362020-03-04 21:03:59 +0000551 }
Dean Bircha6ede7e2020-03-13 14:00:33 +0000552 }
553 }
Dean Bircha6ede7e2020-03-13 14:00:33 +0000554}