blob: a93edde3ce37a2a659d923ce2af5103e8dd726c7 [file] [log] [blame]
Dean Birch62c4f082020-01-17 16:13:26 +00001#!/usr/bin/env groovy
2//-------------------------------------------------------------------------------
3// Copyright (c) 2020, Arm Limited and Contributors. All rights reserved.
4//
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
Xinyu Zhang5c4bbca2020-09-24 16:36:03 +080013mapPlatform = ["cypress/psoc64": "psoc64",
14 "mps2/an519": "AN519",
15 "mps2/an521": "AN521",
16 "mps2/an539": "AN539",
17 "mps2/sse-200_aws": "SSE-200_AWS",
18 "mps3/an524": "AN524",
19 "musca_a": "MUSCA_A",
20 "musca_b1": "MUSCA_B1",
21 "musca_s1": "MUSCA_S1"]
22
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 Zhang4f2ef5a2020-11-09 18:11:43 +080036// BL2, NS, PSA_API, ISOLATION_LEVEL, TEST_REG, TEST_PSA_API, PROFILE, PARTITION_PS, OTP
37mapConfigs = [
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"],
44 ["True", "True", "False", "1", "True", "OFF", "N.A", "Regression"],
45 ["True", "True", "True", "1", "True", "OFF", "N.A", "RegressionIPC"],
46 ["True", "True", "True", "2", "True", "OFF", "N.A", "RegressionIPCTfmLevel2"],
47 ["True", "True", "True", "3", "True", "OFF", "N.A", "RegressionIPCTfmLevel3"],
48 ["True", "True", "False", "1", "True", "OFF", "profile_small", "RegressionProfileS"],
49 ["True", "True", "True", "2", "True", "OFF", "profile_medium", "RegressionProfileM"],
50 ["True", "True", "False", "1", "False", "INTERNAL_TRUSTED_STORAGE", "N.A", "PsaApiTest (ITS)"],
51 ["True", "True", "False", "1", "False", "PROTECTED_STORAGE", "N.A", "PsaApiTest (PS)"],
52 ["True", "True", "False", "1", "False", "CRYPTO", "N.A", "PsaApiTest (Crypto)"],
53 ["True", "True", "False", "1", "False", "INITIAL_ATTESTATION", "N.A", "PsaApiTest (Attest)"],
54 ["True", "True", "False", "1", "False", "IPC", "N.A", "PsaApiTest (FF)"],
55 ["True", "True", "True", "1", "False", "INTERNAL_TRUSTED_STORAGE", "N.A", "PsaApiTestIPC (ITS)"],
56 ["True", "True", "True", "1", "False", "PROTECTED_STORAGE", "N.A", "PsaApiTestIPC (PS)"],
57 ["True", "True", "True", "1", "False", "CRYPTO", "N.A", "PsaApiTestIPC (Crypto)"],
58 ["True", "True", "True", "1", "False", "INITIAL_ATTESTATION", "N.A", "PsaApiTestIPC (Attest)"],
59 ["True", "True", "True", "1", "False", "IPC", "N.A", "PsaApiTestIPC (FF)"],
60 ["True", "True", "True", "2", "False", "INTERNAL_TRUSTED_STORAGE", "N.A", "PsaApiTestIPCTfmLevel2 (ITS)"],
61 ["True", "True", "True", "2", "False", "PROTECTED_STORAGE", "N.A", "PsaApiTestIPCTfmLevel2 (PS)"],
62 ["True", "True", "True", "2", "False", "CRYPTO", "N.A", "PsaApiTestIPCTfmLevel2 (Crypto)"],
63 ["True", "True", "True", "2", "False", "INITIAL_ATTESTATION", "N.A", "PsaApiTestIPCTfmLevel2 (Attest)"],
64 ["True", "True", "True", "2", "False", "IPC", "N.A", "PsaApiTestIPCTfmLevel2 (FF)"],
65 ["True", "True", "True", "3", "False", "INTERNAL_TRUSTED_STORAGE", "N.A", "PsaApiTestIPCTfmLevel3 (ITS)"],
66 ["True", "True", "True", "3", "False", "PROTECTED_STORAGE", "N.A", "PsaApiTestIPCTfmLevel3 (PS)"],
67 ["True", "True", "True", "3", "False", "CRYPTO", "N.A", "PsaApiTestIPCTfmLevel3 (Crypto)"],
68 ["True", "True", "True", "3", "False", "INITIAL_ATTESTATION", "N.A", "PsaApiTestIPCTfmLevel3 (Attest)"],
69 ["True", "True", "True", "3", "False", "IPC", "N.A", "PsaApiTestIPCTfmLevel3 (FF)"],
70]
71
72cfgs = ["Default", "CoreIPC", "CoreIPCTfmLevel2", "CoreIPCTfmLevel3",
73 "Regression", "RegressionIPC",
74 "RegressionIPCTfmLevel2", "RegressionIPCTfmLevel3",
75 "DefaultProfileS", "RegressionProfileS",
76 "DefaultProfileM", "RegressionProfileM", "RegressionProfileM PSOFF",
77 "PsaApiTest (Attest)", "PsaApiTestIPC (Attest)",
78 "PsaApiTestIPCTfmLevel2 (Attest)",
79 "PsaApiTest (Crypto)", "PsaApiTestIPC (Crypto)",
80 "PsaApiTestIPCTfmLevel2 (Crypto)",
81 "PsaApiTest (PS)", "PsaApiTestIPC (PS)",
82 "PsaApiTestIPCTfmLevel2 (PS)",
83 "PsaApiTest (ITS)", "PsaApiTestIPC (ITS)",
84 "PsaApiTestIPCTfmLevel2 (ITS)",
85 "PsaApiTestIPC (FF)",
86 "PsaApiTestIPCTfmLevel2 (FF)",
87 "PsaApiTestIPCTfmLevel3 (ITS)", "PsaApiTestIPCTfmLevel3 (PS)",
88 "PsaApiTestIPCTfmLevel3 (Crypto)", "PsaApiTestIPCTfmLevel3 (Attest)",
89 "PsaApiTestIPCTfmLevel3 (FF)"]
90
Xinyu Zhang5c4bbca2020-09-24 16:36:03 +080091def generateLavaParam(build_params) {
92 def params = []
93 params += string(name: "TARGET_PLATFORM", \
94 value: mapPlatform[build_params["TFM_PLATFORM"]])
95 params += string(name: "COMPILER", \
96 value: mapCompiler[build_params["TOOLCHAIN_FILE"]])
97 params += string(name: "PSA_API_SUITE", \
98 value: mapTestPsaApi[build_params["TEST_PSA_API"]])
99
100 if (build_params["BL2"] == "True" && \
101 build_params["NS"] == "True" && \
102 build_params["PSA_API"] == "False" && \
103 build_params["ISOLATION_LEVEL"] == "1" && \
104 build_params["TEST_REGRESSION"] == "False" && \
105 build_params["TEST_PSA_API"] == "OFF" && \
Xinyu Zhang29adbbb2020-09-29 11:29:18 +0800106 build_params["PROFILE"] == "N.A") {
Xinyu Zhang5c4bbca2020-09-24 16:36:03 +0800107 params += string(name: "PROJ_CONFIG", value: "ConfigDefault")
108 }
Xinyu Zhang29adbbb2020-09-29 11:29:18 +0800109 else if (build_params["BL2"] == "True" && \
Xinyu Zhang5c4bbca2020-09-24 16:36:03 +0800110 build_params["NS"] == "True" && \
111 build_params["PSA_API"] == "True" && \
112 build_params["ISOLATION_LEVEL"] == "1" && \
113 build_params["TEST_REGRESSION"] == "False" && \
114 build_params["TEST_PSA_API"] == "OFF" && \
Xinyu Zhang29adbbb2020-09-29 11:29:18 +0800115 build_params["PROFILE"] == "N.A") {
Xinyu Zhang5c4bbca2020-09-24 16:36:03 +0800116 params += string(name: "PROJ_CONFIG", value: "ConfigCoreIPC")
117 }
Xinyu Zhang29adbbb2020-09-29 11:29:18 +0800118 else if (build_params["BL2"] == "True" && \
Xinyu Zhang5c4bbca2020-09-24 16:36:03 +0800119 build_params["NS"] == "True" && \
120 build_params["PSA_API"] == "True" && \
121 build_params["ISOLATION_LEVEL"] == "2" && \
122 build_params["TEST_REGRESSION"] == "False" && \
123 build_params["TEST_PSA_API"] == "OFF" && \
Xinyu Zhang29adbbb2020-09-29 11:29:18 +0800124 build_params["PROFILE"] == "N.A") {
Xinyu Zhang5c4bbca2020-09-24 16:36:03 +0800125 params += string(name: "PROJ_CONFIG", value: "ConfigCoreIPCTfmLevel2")
126 }
Karl Zhang3b092ef2020-11-06 16:56:25 +0800127 else if (build_params["BL2"] == "True" && \
128 build_params["NS"] == "True" && \
129 build_params["PSA_API"] == "True" && \
130 build_params["ISOLATION_LEVEL"] == "3" && \
131 build_params["TEST_REGRESSION"] == "False" && \
132 build_params["TEST_PSA_API"] == "OFF" && \
133 build_params["PROFILE"] == "N.A") {
134 params += string(name: "PROJ_CONFIG", value: "ConfigCoreIPCTfmLevel3")
135 }
Xinyu Zhang29adbbb2020-09-29 11:29:18 +0800136 else if (build_params["BL2"] == "True" && \
Xinyu Zhang5c4bbca2020-09-24 16:36:03 +0800137 build_params["NS"] == "True" && \
138 build_params["PSA_API"] == "False" && \
139 build_params["ISOLATION_LEVEL"] == "1" && \
Xinyu Zhang29adbbb2020-09-29 11:29:18 +0800140 build_params["PROFILE"] == "profile_small" && \
Xinyu Zhang5c4bbca2020-09-24 16:36:03 +0800141 build_params["TEST_REGRESSION"] == "False" && \
142 build_params["TEST_PSA_API"] == "OFF") {
143 params += string(name: "PROJ_CONFIG", value: "ConfigDefaultProfileS")
144 }
Xinyu Zhang29adbbb2020-09-29 11:29:18 +0800145 else if (build_params["BL2"] == "True" && \
Xinyu Zhang5c4bbca2020-09-24 16:36:03 +0800146 build_params["NS"] == "True" && \
Xinyu Zhang9fd74242020-10-22 11:30:50 +0800147 build_params["PSA_API"] == "True" && \
148 build_params["ISOLATION_LEVEL"] == "2" && \
Xinyu Zhang29adbbb2020-09-29 11:29:18 +0800149 build_params["PROFILE"] == "profile_medium"&& \
Xinyu Zhang5c4bbca2020-09-24 16:36:03 +0800150 build_params["TEST_REGRESSION"] == "False" && \
151 build_params["TEST_PSA_API"] == "OFF") {
152 params += string(name: "PROJ_CONFIG", value: "ConfigDefaultProfileM")
153 }
Xinyu Zhang29adbbb2020-09-29 11:29:18 +0800154 else if (build_params["BL2"] == "True" && \
Xinyu Zhang5c4bbca2020-09-24 16:36:03 +0800155 build_params["NS"] == "True" && \
156 build_params["PSA_API"] == "False" && \
157 build_params["ISOLATION_LEVEL"] == "1" && \
158 build_params["TEST_REGRESSION"] == "True" && \
159 build_params["TEST_PSA_API"] == "OFF" && \
Xinyu Zhang29adbbb2020-09-29 11:29:18 +0800160 build_params["PROFILE"] == "N.A") {
Xinyu Zhang5c4bbca2020-09-24 16:36:03 +0800161 params += string(name: "PROJ_CONFIG", value: "ConfigRegression")
162 }
Xinyu Zhang29adbbb2020-09-29 11:29:18 +0800163 else if (build_params["BL2"] == "True" && \
Xinyu Zhang5c4bbca2020-09-24 16:36:03 +0800164 build_params["NS"] == "True" && \
165 build_params["PSA_API"] == "True" && \
166 build_params["ISOLATION_LEVEL"] == "1" && \
167 build_params["TEST_REGRESSION"] == "True" && \
168 build_params["TEST_PSA_API"] == "OFF" && \
Xinyu Zhang29adbbb2020-09-29 11:29:18 +0800169 build_params["PROFILE"] == "N.A") {
Xinyu Zhang5c4bbca2020-09-24 16:36:03 +0800170 params += string(name: "PROJ_CONFIG", value: "ConfigRegressionIPC")
171 }
Xinyu Zhang29adbbb2020-09-29 11:29:18 +0800172 else if (build_params["BL2"] == "True" && \
Xinyu Zhang5c4bbca2020-09-24 16:36:03 +0800173 build_params["NS"] == "True" && \
174 build_params["PSA_API"] == "True" && \
175 build_params["ISOLATION_LEVEL"] == "2" && \
176 build_params["TEST_REGRESSION"] == "True" && \
177 build_params["TEST_PSA_API"] == "OFF" && \
Xinyu Zhang29adbbb2020-09-29 11:29:18 +0800178 build_params["PROFILE"] == "N.A") {
Xinyu Zhang5c4bbca2020-09-24 16:36:03 +0800179 params += string(name: "PROJ_CONFIG", value: "ConfigRegressionIPCTfmLevel2")
180 }
Karl Zhang3b092ef2020-11-06 16:56:25 +0800181 else if (build_params["BL2"] == "True" && \
182 build_params["NS"] == "True" && \
183 build_params["PSA_API"] == "True" && \
184 build_params["ISOLATION_LEVEL"] == "3" && \
185 build_params["TEST_REGRESSION"] == "True" && \
186 build_params["TEST_PSA_API"] == "OFF" && \
187 build_params["PROFILE"] == "N.A") {
188 params += string(name: "PROJ_CONFIG", value: "ConfigRegressionIPCTfmLevel3")
189 }
Xinyu Zhang29adbbb2020-09-29 11:29:18 +0800190 else if (build_params["BL2"] == "True" && \
Xinyu Zhang5c4bbca2020-09-24 16:36:03 +0800191 build_params["NS"] == "True" && \
192 build_params["PSA_API"] == "False" && \
193 build_params["ISOLATION_LEVEL"] == "1" && \
Xinyu Zhang29adbbb2020-09-29 11:29:18 +0800194 build_params["PROFILE"] == "profile_small" && \
Xinyu Zhang5c4bbca2020-09-24 16:36:03 +0800195 build_params["TEST_REGRESSION"] == "True" && \
196 build_params["TEST_PSA_API"] == "OFF") {
197 params += string(name: "PROJ_CONFIG", value: "ConfigRegressionProfileS")
198 }
Xinyu Zhang29adbbb2020-09-29 11:29:18 +0800199 else if (build_params["BL2"] == "True" && \
Xinyu Zhang5c4bbca2020-09-24 16:36:03 +0800200 build_params["NS"] == "True" && \
Xinyu Zhang9fd74242020-10-22 11:30:50 +0800201 build_params["PSA_API"] == "True" && \
202 build_params["ISOLATION_LEVEL"] == "2" && \
Xinyu Zhang29adbbb2020-09-29 11:29:18 +0800203 build_params["PROFILE"] == "profile_medium"&& \
Xinyu Zhang5c4bbca2020-09-24 16:36:03 +0800204 build_params["TEST_REGRESSION"] == "True" && \
205 build_params["TEST_PSA_API"] == "OFF") {
206 params += string(name: "PROJ_CONFIG", value: "ConfigRegressionProfileM")
207 }
Xinyu Zhang29adbbb2020-09-29 11:29:18 +0800208 else if (build_params["BL2"] == "True" && \
Xinyu Zhang5c4bbca2020-09-24 16:36:03 +0800209 build_params["NS"] == "True" && \
210 build_params["PSA_API"] == "False" && \
211 build_params["ISOLATION_LEVEL"] == "1" && \
212 build_params["TEST_REGRESSION"] == "False" && \
213 build_params["TEST_PSA_API"] != "OFF" && \
Xinyu Zhang29adbbb2020-09-29 11:29:18 +0800214 build_params["PROFILE"] == "N.A") {
Xinyu Zhang5c4bbca2020-09-24 16:36:03 +0800215 params += string(name: "PROJ_CONFIG", value: "ConfigPsaApiTest")
216 }
Xinyu Zhang29adbbb2020-09-29 11:29:18 +0800217 else if (build_params["BL2"] == "True" && \
Xinyu Zhang5c4bbca2020-09-24 16:36:03 +0800218 build_params["NS"] == "True" && \
219 build_params["PSA_API"] == "True" && \
220 build_params["ISOLATION_LEVEL"] == "1" && \
221 build_params["TEST_REGRESSION"] == "False" && \
222 build_params["TEST_PSA_API"] != "OFF" && \
Xinyu Zhang29adbbb2020-09-29 11:29:18 +0800223 build_params["PROFILE"] == "N.A") {
Xinyu Zhang5c4bbca2020-09-24 16:36:03 +0800224 params += string(name: "PROJ_CONFIG", value: "ConfigPsaApiTestIPC")
225 }
Xinyu Zhang29adbbb2020-09-29 11:29:18 +0800226 else if (build_params["BL2"] == "True" && \
Xinyu Zhang5c4bbca2020-09-24 16:36:03 +0800227 build_params["NS"] == "True" && \
228 build_params["PSA_API"] == "True" && \
229 build_params["ISOLATION_LEVEL"] == "2" && \
230 build_params["TEST_REGRESSION"] == "False" && \
231 build_params["TEST_PSA_API"] != "OFF" && \
Xinyu Zhang29adbbb2020-09-29 11:29:18 +0800232 build_params["PROFILE"] == "N.A") {
Xinyu Zhang5c4bbca2020-09-24 16:36:03 +0800233 params += string(name: "PROJ_CONFIG", value: "ConfigPsaApiTestIPCTfmLevel2")
234 }
Karl Zhang3b092ef2020-11-06 16:56:25 +0800235 else if (build_params["BL2"] == "True" && \
236 build_params["NS"] == "True" && \
237 build_params["PSA_API"] == "True" && \
238 build_params["ISOLATION_LEVEL"] == "3" && \
239 build_params["TEST_REGRESSION"] == "False" && \
240 build_params["TEST_PSA_API"] != "OFF" && \
241 build_params["PROFILE"] == "N.A") {
242 params += string(name: "PROJ_CONFIG", value: "ConfigPsaApiTestIPCTfmLevel3")
243 }
Xinyu Zhang5c4bbca2020-09-24 16:36:03 +0800244 else {
245 params += string(name: "PROJ_CONFIG", value: "ConfigDefault")
246 }
247 return params
248}
249
Dean Birch62c4f082020-01-17 16:13:26 +0000250def listConfigs(ci_scripts_dir, config_list, filter_group) {
251 dir(ci_scripts_dir) {
252 echo "Obtaining list of configs."
Matthew Hartfb6fd362020-03-04 21:03:59 +0000253 echo "Running: python3 ./configs.py -g ${filter_group.replace(" ", " -g ")}"
Dean Birch62c4f082020-01-17 16:13:26 +0000254 def build_config_list_raw = sh(script: """\
Matthew Hartfb6fd362020-03-04 21:03:59 +0000255python3 ./configs.py -g ${filter_group.replace(" ", " -g ")}
Dean Birch62c4f082020-01-17 16:13:26 +0000256""", returnStdout: true).trim()
257 def build_config_list = build_config_list_raw.tokenize('\n')
258 config_list.addAll(build_config_list)
259 }
260}
261
Matthew Hartfb6fd362020-03-04 21:03:59 +0000262def buildConfig(ci_scripts_dir, config, filter_group, results) {
Dean Birch62c4f082020-01-17 16:13:26 +0000263 def params = []
Matthew Hartfb6fd362020-03-04 21:03:59 +0000264 def params_collection = [:]
Dean Birch62c4f082020-01-17 16:13:26 +0000265 def build_config_params
266 dir(ci_scripts_dir) {
267 echo "Obtaining build configuration for config ${config}"
Matthew Hartfb6fd362020-03-04 21:03:59 +0000268 echo "Running: python3 ./configs.py -g ${filter_group.replace(" ", " -g ")} ${config}"
Dean Birch62c4f082020-01-17 16:13:26 +0000269 build_config_params = sh(script: """\
Matthew Hartfb6fd362020-03-04 21:03:59 +0000270python3 ./configs.py -g ${filter_group.replace(" ", " -g ")} ${config}
Dean Birch62c4f082020-01-17 16:13:26 +0000271""", returnStdout: true).trim()
272 }
273 def lines = build_config_params.tokenize('\n')
274 for (String line : lines) {
275 def key, value
276 (key, value) = line.tokenize('=')
277 params += string(name: key, value: value)
Matthew Hartfb6fd362020-03-04 21:03:59 +0000278 params_collection[key] = value
Dean Birch62c4f082020-01-17 16:13:26 +0000279 }
280 params += string(name: 'GERRIT_BRANCH', value: env.GERRIT_BRANCH)
Dean Birchd0f9f8c2020-03-26 11:10:33 +0000281 params += string(name: 'GERRIT_HOST', value: env.GERRIT_HOST)
282 params += string(name: 'GERRIT_CHANGE_NUMBER', value: env.GERRIT_CHANGE_NUMBER)
283 params += string(name: 'GERRIT_PATCHSET_REVISION', value: env.GERRIT_PATCHSET_REVISION)
Dean Birch62c4f082020-01-17 16:13:26 +0000284 params += string(name: 'GERRIT_REFSPEC', value: env.GERRIT_REFSPEC)
Karl Zhang02d30352020-08-20 13:48:52 +0800285 params += string(name: 'MBEDTLS_VERSION', value: env.MBEDTLS_VERSION)
Dean Birch62c4f082020-01-17 16:13:26 +0000286 params += string(name: 'CODE_REPO', value: env.CODE_REPO)
Karl Zhangf6f467e2020-07-10 16:24:45 +0800287 params += string(name: 'CODE_COVERAGE_EN', value: env.CODE_COVERAGE_EN)
Dean Bircha6ede7e2020-03-13 14:00:33 +0000288 return { -> results
289 def build_res = build(job: 'tf-m-build-config', parameters: params, propagate: false)
290 def build_info = [build_res, config, params_collection]
291 results['builds'][build_res.number] = build_info
292 def build_url = build_res.getAbsoluteUrl()
293 print("${build_res.number}: ${config} ${build_res.result} ${build_url}")
294 failure_states = ["FAILURE", "ABORTED", "UNSTABLE", "NOT_BUILT"]
295 if (build_res.result in failure_states) {
296 error("Build failed at ${build_url}")
297 }
Karl Zhang2b10b342020-11-09 14:50:11 +0800298 else if (params_collection["NS"] == "False" || \
299 (params_collection["PROFILE"] == "profile_medium" && \
300 params_collection["PARTITION_PS"] == "OFF")) {
Xinyu Zhang5c4bbca2020-09-24 16:36:03 +0800301 print("LAVA is not needed for ${build_url}")
302 }
Dean Bircha6ede7e2020-03-13 14:00:33 +0000303 else {
304 print("Doing LAVA stuff for ${build_url}")
Xinyu Zhang5c4bbca2020-09-24 16:36:03 +0800305 params += generateLavaParam(params_collection)
Dean Bircha6ede7e2020-03-13 14:00:33 +0000306 params += string(name: 'BUILD_NUMBER', value: "${build_res.number}")
307 params += string(name: 'BUILD_URL', value: build_url)
Matthew Hartfb6fd362020-03-04 21:03:59 +0000308 params += string(name: 'LAVA_URL', value: env.LAVA_URL)
Dean Birch956416f2020-08-12 10:36:16 +0100309 params += string(name: 'CI_SCRIPTS_BRANCH', value: env.CI_SCRIPTS_BRANCH)
310 params += string(name: 'LAVA_CREDENTIALS', value: env.LAVA_CREDENTIALS)
Dean Bircha6ede7e2020-03-13 14:00:33 +0000311 def lava_res = build(job: 'tf-m-lava-submit', parameters: params, propagate: false)
Matthew Hartfb6fd362020-03-04 21:03:59 +0000312 if (lava_res.result in failure_states) {
313 error("LAVA Create and Submit failed at ${lava_res.getAbsoluteUrl()}")
314 }
315 else {
316 results['lava_jobs'] += lava_res.getDescription()
317 }
Dean Birch62c4f082020-01-17 16:13:26 +0000318 }
319 }
320}
321
Matthew Hart06340d72020-06-15 16:08:20 +0100322def buildDocs(results) {
Dean Birch62c4f082020-01-17 16:13:26 +0000323 def params = []
324 params += string(name: 'GERRIT_BRANCH', value: env.GERRIT_BRANCH)
Dean Birchd0f9f8c2020-03-26 11:10:33 +0000325 params += string(name: 'GERRIT_HOST', value: env.GERRIT_HOST)
326 params += string(name: 'GERRIT_CHANGE_NUMBER', value: env.GERRIT_CHANGE_NUMBER)
327 params += string(name: 'GERRIT_PATCHSET_REVISION', value: env.GERRIT_PATCHSET_REVISION)
Dean Birch62c4f082020-01-17 16:13:26 +0000328 params += string(name: 'GERRIT_REFSPEC', value: env.GERRIT_REFSPEC)
Karl Zhang02d30352020-08-20 13:48:52 +0800329 params += string(name: 'MBEDTLS_VERSION', value: env.MBEDTLS_VERSION)
Dean Birch62c4f082020-01-17 16:13:26 +0000330 params += string(name: 'CODE_REPO', value: env.CODE_REPO)
Matthew Hart06340d72020-06-15 16:08:20 +0100331 return { -> results
Dean Birch62c4f082020-01-17 16:13:26 +0000332 def res = build(job: 'tf-m-build-docs', parameters: params, propagate:false)
333 print("${res.number}: Docs ${res.result} ${res.getAbsoluteUrl()}")
Matthew Hart06340d72020-06-15 16:08:20 +0100334 results['docs'] = [res.number, res.result, params]
Dean Bircha6ede7e2020-03-13 14:00:33 +0000335 if (res.result in ["FAILURE", "ABORTED", "UNSTABLE", "NOT_BUILT"]) {
Dean Birch62c4f082020-01-17 16:13:26 +0000336 error("Build failed at ${res.getAbsoluteUrl()}")
337 }
338 }
339}
340
Karl Zhang182ecdf2020-10-10 09:52:12 +0800341def emailNotification(results, stage) {
Karl Zhang0413e972020-09-18 17:59:26 +0800342 script {
343 if (env.JOB_NAME.equals("tf-m-nightly") && !env.EMAIL_NOTIFICATION.equals('')) {
344 def result = "Fail."
Karl Zhang182ecdf2020-10-10 09:52:12 +0800345 if (results == true) {
Karl Zhang0413e972020-09-18 17:59:26 +0800346 result = "Success."
Karl Zhang182ecdf2020-10-10 09:52:12 +0800347 print("Skip sending as ${result} for ${stage}")
348 }
349 else {
350 emailext (
351 subject: ("Job ${env.JOB_NAME} ${stage} ${env.BUILD_NUMBER} ${result}"),
352 body: "Check console output at ${env.BUILD_URL}",
353 to: "${EMAIL_NOTIFICATION}"
354 )
355 }
Karl Zhang0413e972020-09-18 17:59:26 +0800356 }
357 } /* script */
358}
359
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800360@NonCPS
361def generateCsvContent(results) {
362 def resultsParam = []
363 results.each { result ->
Xinyu Zhang4f2ef5a2020-11-09 18:11:43 +0800364 if (result.value[2]['BL2'] == "True") {
365 resultsParam.add([result.value[1], \
366 result.value[0].getResult(), \
367 result.value[2]['TFM_PLATFORM'], \
368 result.value[2]['TOOLCHAIN_FILE'], \
369 result.value[2]['CMAKE_BUILD_TYPE'], \
370 result.value[2]['BL2'], \
371 result.value[2]['NS'], \
372 result.value[2]['PSA_API'], \
373 result.value[2]['ISOLATION_LEVEL'], \
374 result.value[2]['TEST_REGRESSION'], \
375 result.value[2]['TEST_PSA_API'], \
376 result.value[2]['PROFILE'], \
377 result.value[2]['PARTITION_PS'], \
378 result.value[2]['OTP']])
379 }
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800380 }
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800381 resultsParam.each { result ->
Xinyu Zhang4f2ef5a2020-11-09 18:11:43 +0800382 if (result[2] == 'musca_b1') {
383 if (result[13] != 'off') {
384 result[2] = 'musca_b1_OTP'
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800385 }
386 }
Xinyu Zhang4f2ef5a2020-11-09 18:11:43 +0800387 result[3] = mapCompiler[result[3]]
388 build_params = result[5..12]
389 configName = ""
390 for (map_cfg in mapConfigs) {
391 if (build_params[0..6] == map_cfg[0..6]) {
392 configName = map_cfg[7]
393 break
394 }
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800395 }
Xinyu Zhang4f2ef5a2020-11-09 18:11:43 +0800396 if (configName == "") {
397 configName = "Default"
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800398 }
Xinyu Zhang4f2ef5a2020-11-09 18:11:43 +0800399 else if (configName == "RegressionProfileM") {
400 if (build_params[7] == "OFF") {
401 configName = "RegressionProfileM PSOFF"
402 }
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800403 }
Xinyu Zhang4f2ef5a2020-11-09 18:11:43 +0800404 result.add(configName)
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800405 }
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800406 def csvContent = []
407 resultsParam.each { result ->
Xinyu Zhang4f2ef5a2020-11-09 18:11:43 +0800408 current_row = result[2..4]
409 cfgs.each {cfg ->
410 if (cfg == result[14]) {
411 current_row.add(cfg)
412 current_row.add(result[1])
413 }
414 }
415 csvContent.add(current_row)
416 }
417 csvContent.sort{a,b -> a[0] <=> b[0] ?: a[1] <=> b[1] ?: a[2] <=> b[2]}
418 build_summary = []
419 current_platform = ""
420 current_compiler = ""
421 current_build_type = ""
422 csvContent.each { build_cfg ->
423 if (current_platform != build_cfg[0] || \
424 current_compiler != build_cfg[1] || \
425 current_build_type != build_cfg[2]) {
426 current_platform = build_cfg[0]
427 current_compiler = build_cfg[1]
428 current_build_type = build_cfg[2]
429 csv_line = [current_platform, current_compiler, current_build_type]
430 cfgs.each {
431 csv_line.add("N.A.")
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800432 }
Xinyu Zhang4f2ef5a2020-11-09 18:11:43 +0800433 build_summary.add(csv_line)
434 }
435 i = 0
436 cfgs.each { cfg ->
437 if (cfg == build_cfg[3]) {
438 build_summary[-1][3+i] = build_cfg[4]
439 }
440 i += 1
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800441 }
442 }
Xinyu Zhang4f2ef5a2020-11-09 18:11:43 +0800443 build_summary.add(0, ['Platform', 'Compiler', 'Cmake Build Type'])
444 build_summary[0] += cfgs
445 return build_summary
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800446}
447
448def generateBuildCsv(results) {
449 def csvContent = generateCsvContent(results)
450 node("master") {
451 writeCSV file: 'build_results.csv', records: csvContent, format: CSVFormat.EXCEL
452 archiveArtifacts 'build_results.csv'
453 }
454}
Dean Bircha6ede7e2020-03-13 14:00:33 +0000455
456def buildCsv(results) {
Dean Birchd0f9f8c2020-03-26 11:10:33 +0000457 def summary = new Summary();
Dean Bircha6ede7e2020-03-13 14:00:33 +0000458 def csvContent = summary.getBuildCsv(results)
459 node("master") {
460 writeCSV file: 'build_results.csv', records: csvContent, format: CSVFormat.EXCEL
461 archiveArtifacts 'build_results.csv'
462 }
463}
464
465def writeSummary(results) {
Dean Birchd0f9f8c2020-03-26 11:10:33 +0000466 def summary = new Summary();
Dean Bircha6ede7e2020-03-13 14:00:33 +0000467 def buildLinks = summary.getLinks(results)
468 node("master") {
469 writeFile file: "build_links.html", text: buildLinks
470 archiveArtifacts 'build_links.html'
471 }
472}
473
Matthew Hartfb6fd362020-03-04 21:03:59 +0000474def lineInString(string, match) {
475 def lines = string.split("\n")
476 def result = lines.findAll { it.contains(match) }
477 return result[0]
478}
479
480def getResult(string, match) {
481 line = lineInString(string, match)
Dean Birch1d545c02020-05-29 14:09:21 +0100482 a = line.split(match)[1].split(' ')
483 score = a[0]
484 if (a.size() > 1)
485 {
486 fail_text = a[1..-1].join(" ")
487 return [score, fail_text]
488 }
489 return [score, ""]
Matthew Hartfb6fd362020-03-04 21:03:59 +0000490}
491
492def submitJobsToList(results) {
493 def all_jobs = []
494 for (String result : results){
495 jobs_s = result.split('JOBS: ')
496 if (jobs_s.size() > 1) {
497 all_jobs += jobs_s[1]
498 }
499 }
500 return(all_jobs)
501}
502
Dean Birch62c4f082020-01-17 16:13:26 +0000503def configs = []
504def builds = [:]
Matthew Hartfb6fd362020-03-04 21:03:59 +0000505def results = [:]
Dean Birch62c4f082020-01-17 16:13:26 +0000506
Benjamin Copelandbe53b032020-10-30 19:57:59 +0000507node("docker-amd64-tf-m-bionic") {
Dean Birch62c4f082020-01-17 16:13:26 +0000508 stage("Init") {
509 cleanWs()
510 dir("tf-m-ci-scripts") {
Matthew Hartfb6fd362020-03-04 21:03:59 +0000511 git url: '$CI_SCRIPTS_REPO', branch: '$CI_SCRIPTS_BRANCH', credentialsId: 'GIT_SSH_KEY'
Dean Birch62c4f082020-01-17 16:13:26 +0000512 }
513 }
514 stage("Configs") {
515 // Populate configs
516 listConfigs('tf-m-ci-scripts', configs, env.FILTER_GROUP)
Dean Bircha6ede7e2020-03-13 14:00:33 +0000517 results['builds'] = [:]
518 results['lava_jobs'] = []
Dean Birch62c4f082020-01-17 16:13:26 +0000519 for (config in configs) {
Matthew Hartfb6fd362020-03-04 21:03:59 +0000520 builds[config] = buildConfig("tf-m-ci-scripts", config, env.FILTER_GROUP, results)
Dean Birch62c4f082020-01-17 16:13:26 +0000521 }
Matthew Hart06340d72020-06-15 16:08:20 +0100522 builds["docs"] = buildDocs(results)
Dean Birch62c4f082020-01-17 16:13:26 +0000523 }
524}
Karl Zhangfec84102020-06-24 09:56:36 +0800525
Dean Birch62c4f082020-01-17 16:13:26 +0000526stage("Builds") {
527 def verify = 1
Karl Zhang182ecdf2020-10-10 09:52:12 +0800528 def success = true
Dean Birch62c4f082020-01-17 16:13:26 +0000529 try {
530 parallel(builds)
531 } catch (Exception e) {
Dean Bircha6ede7e2020-03-13 14:00:33 +0000532 print(e)
Dean Birch62c4f082020-01-17 16:13:26 +0000533 manager.buildFailure()
534 verify = -1
Karl Zhang182ecdf2020-10-10 09:52:12 +0800535 success = false
Dean Birch62c4f082020-01-17 16:13:26 +0000536 } finally {
Dean Bircha6ede7e2020-03-13 14:00:33 +0000537 print("Verifying status")
Karl Zhang182ecdf2020-10-10 09:52:12 +0800538 emailNotification(success, 'Build')
Dean Birchd0f9f8c2020-03-26 11:10:33 +0000539 g = new Gerrit()
540 g.verifyStatus(verify, 'tf-m-build', 'build')
Dean Bircha6ede7e2020-03-13 14:00:33 +0000541 print("Building CSV")
xinyu-tfmb4fc0412020-08-19 10:49:51 +0800542 generateBuildCsv(results['builds'])
Dean Bircha6ede7e2020-03-13 14:00:33 +0000543 writeSummary(results['builds'])
Dean Birch62c4f082020-01-17 16:13:26 +0000544 }
545}
Matthew Hart06340d72020-06-15 16:08:20 +0100546
Benjamin Copelandbe53b032020-10-30 19:57:59 +0000547node("docker-amd64-tf-m-bionic") {
Matthew Hart06340d72020-06-15 16:08:20 +0100548 stage("Copy Docs") {
Karl Zhang32497972020-09-21 14:38:29 +0800549 if (env.JOB_NAME.equals("tf-m-build-and-test")) {
550 step([$class: 'CopyArtifact', projectName: 'tf-m-build-docs',
551 selector: specific("${results['docs'][0]}"), target: './docs/',
552 optional: true])
553 archiveArtifacts artifacts: 'docs/**', allowEmptyArchive: true
554 }
555 else {
556 print("No doc copy for job: ${env.JOB_NAME}")
557 }
Matthew Hart06340d72020-06-15 16:08:20 +0100558 }
Dean Bircha6ede7e2020-03-13 14:00:33 +0000559 stage("Tests") {
560 dir("tf-m-ci-scripts") {
Matthew Hartfb6fd362020-03-04 21:03:59 +0000561 git url: '$CI_SCRIPTS_REPO', branch: '$CI_SCRIPTS_BRANCH', credentialsId: 'GIT_SSH_KEY'
Dean Bircha6ede7e2020-03-13 14:00:33 +0000562 }
Matthew Hartfb6fd362020-03-04 21:03:59 +0000563 def all_jobs = []
564 def success = true
Dean Bircha6ede7e2020-03-13 14:00:33 +0000565 print("Wait for LAVA results here...")
Matthew Hartfb6fd362020-03-04 21:03:59 +0000566 try {
567 all_jobs = submitJobsToList(results['lava_jobs'])
568 if (all_jobs.size() > 0) {
569 dir("tf-m-ci-scripts") {
Dean Birch956416f2020-08-12 10:36:16 +0100570 withCredentials([usernamePassword(credentialsId: env.LAVA_CREDENTIALS, passwordVariable: 'LAVA_TOKEN', usernameVariable: 'LAVA_USER')]) {
Matthew Hartfb6fd362020-03-04 21:03:59 +0000571 output = sh(script: """./lava_helper/lava_wait_jobs.py --job-ids ${all_jobs.join(",")} \
572 --lava-url ${env.LAVA_URL} --lava-user ${LAVA_USER} --lava-token ${LAVA_TOKEN} \
Matthew Hart05a59b52020-05-27 17:54:51 +0100573 --artifacts-path lava_artifacts --lava-timeout 7200 \
Matthew Hartfb6fd362020-03-04 21:03:59 +0000574 """, returnStdout: true).trim()
575 archiveArtifacts artifacts: 'test_summary.*', allowEmptyArchive: true
576 print(output)
577 g = new Gerrit()
Dean Birch1d545c02020-05-29 14:09:21 +0100578 def (boot_result, boot_output) = getResult(output, 'BOOT_RESULT: ')
Matthew Hartfb6fd362020-03-04 21:03:59 +0000579 if (boot_result) {
580 g.verifyStatus(boot_result, "lava_boot", "test")
581 }
Dean Birch1d545c02020-05-29 14:09:21 +0100582 def (test_result, test_output) = getResult(output, 'TEST_RESULT: ')
Matthew Hartfb6fd362020-03-04 21:03:59 +0000583 if (test_result) {
584 g.verifyStatus(test_result, "lava_test", "test")
585 }
586 if (boot_result.toInteger() < 1 || test_result.toInteger() < 1) {
Dean Birch1d545c02020-05-29 14:09:21 +0100587 error("Marking job as failed due to failed boots: ${boot_output} or tests: ${test_output}")
Matthew Hartfb6fd362020-03-04 21:03:59 +0000588 }
589 }
590 }
591 }
592 else {
593 print("There were no LAVA jobs to test.")
594 }
595 }
596 catch (Exception e) {
597 print("ERROR: ${e}")
598 success = false
599 } finally {
600 archiveArtifacts artifacts: 'tf-m-ci-scripts/lava_artifacts/**', allowEmptyArchive: true
Karl Zhang182ecdf2020-10-10 09:52:12 +0800601 emailNotification(success, 'Test')
Matthew Hartfb6fd362020-03-04 21:03:59 +0000602 cleanWs()
603 if (!success) {
604 error("There was an Error waiting for LAVA jobs")
605 }
Dean Bircha6ede7e2020-03-13 14:00:33 +0000606 }
607 }
Dean Bircha6ede7e2020-03-13 14:00:33 +0000608}