Parse Build Result Summary into CSV Format
TF-M has transferred to a new build system.
Params have been changed.
Function to parse build result summary
also needs to be adjusted.
Change-Id: Ib4dacc2f8179f24c9ff82a9bb2614d63f6a20d27
Signed-off-by: Xinyu Zhang <xinyu.zhang@arm.com>
diff --git a/jenkins/ci.jpl b/jenkins/ci.jpl
index dee4fd1..4b49b72 100644
--- a/jenkins/ci.jpl
+++ b/jenkins/ci.jpl
@@ -33,6 +33,61 @@
"INITIAL_ATTESTATION": "Attest",
"IPC": "FF"]
+// BL2, NS, PSA_API, ISOLATION_LEVEL, TEST_REG, TEST_PSA_API, PROFILE, PARTITION_PS, OTP
+mapConfigs = [
+ ["True", "True", "False", "1", "False", "OFF", "N.A", "Default"],
+ ["True", "True", "True", "1", "False", "OFF", "N.A", "CoreIPC"],
+ ["True", "True", "True", "2", "False", "OFF", "N.A", "CoreIPCTfmLevel2"],
+ ["True", "True", "True", "3", "False", "OFF", "N.A", "CoreIPCTfmLevel3"],
+ ["True", "True", "False", "1", "False", "OFF", "profile_small", "DefaultProfileS"],
+ ["True", "True", "True", "2", "False", "OFF", "profile_medium", "DefaultProfileM"],
+ ["True", "True", "False", "1", "True", "OFF", "N.A", "Regression"],
+ ["True", "True", "True", "1", "True", "OFF", "N.A", "RegressionIPC"],
+ ["True", "True", "True", "2", "True", "OFF", "N.A", "RegressionIPCTfmLevel2"],
+ ["True", "True", "True", "3", "True", "OFF", "N.A", "RegressionIPCTfmLevel3"],
+ ["True", "True", "False", "1", "True", "OFF", "profile_small", "RegressionProfileS"],
+ ["True", "True", "True", "2", "True", "OFF", "profile_medium", "RegressionProfileM"],
+ ["True", "True", "False", "1", "False", "INTERNAL_TRUSTED_STORAGE", "N.A", "PsaApiTest (ITS)"],
+ ["True", "True", "False", "1", "False", "PROTECTED_STORAGE", "N.A", "PsaApiTest (PS)"],
+ ["True", "True", "False", "1", "False", "CRYPTO", "N.A", "PsaApiTest (Crypto)"],
+ ["True", "True", "False", "1", "False", "INITIAL_ATTESTATION", "N.A", "PsaApiTest (Attest)"],
+ ["True", "True", "False", "1", "False", "IPC", "N.A", "PsaApiTest (FF)"],
+ ["True", "True", "True", "1", "False", "INTERNAL_TRUSTED_STORAGE", "N.A", "PsaApiTestIPC (ITS)"],
+ ["True", "True", "True", "1", "False", "PROTECTED_STORAGE", "N.A", "PsaApiTestIPC (PS)"],
+ ["True", "True", "True", "1", "False", "CRYPTO", "N.A", "PsaApiTestIPC (Crypto)"],
+ ["True", "True", "True", "1", "False", "INITIAL_ATTESTATION", "N.A", "PsaApiTestIPC (Attest)"],
+ ["True", "True", "True", "1", "False", "IPC", "N.A", "PsaApiTestIPC (FF)"],
+ ["True", "True", "True", "2", "False", "INTERNAL_TRUSTED_STORAGE", "N.A", "PsaApiTestIPCTfmLevel2 (ITS)"],
+ ["True", "True", "True", "2", "False", "PROTECTED_STORAGE", "N.A", "PsaApiTestIPCTfmLevel2 (PS)"],
+ ["True", "True", "True", "2", "False", "CRYPTO", "N.A", "PsaApiTestIPCTfmLevel2 (Crypto)"],
+ ["True", "True", "True", "2", "False", "INITIAL_ATTESTATION", "N.A", "PsaApiTestIPCTfmLevel2 (Attest)"],
+ ["True", "True", "True", "2", "False", "IPC", "N.A", "PsaApiTestIPCTfmLevel2 (FF)"],
+ ["True", "True", "True", "3", "False", "INTERNAL_TRUSTED_STORAGE", "N.A", "PsaApiTestIPCTfmLevel3 (ITS)"],
+ ["True", "True", "True", "3", "False", "PROTECTED_STORAGE", "N.A", "PsaApiTestIPCTfmLevel3 (PS)"],
+ ["True", "True", "True", "3", "False", "CRYPTO", "N.A", "PsaApiTestIPCTfmLevel3 (Crypto)"],
+ ["True", "True", "True", "3", "False", "INITIAL_ATTESTATION", "N.A", "PsaApiTestIPCTfmLevel3 (Attest)"],
+ ["True", "True", "True", "3", "False", "IPC", "N.A", "PsaApiTestIPCTfmLevel3 (FF)"],
+]
+
+cfgs = ["Default", "CoreIPC", "CoreIPCTfmLevel2", "CoreIPCTfmLevel3",
+ "Regression", "RegressionIPC",
+ "RegressionIPCTfmLevel2", "RegressionIPCTfmLevel3",
+ "DefaultProfileS", "RegressionProfileS",
+ "DefaultProfileM", "RegressionProfileM", "RegressionProfileM PSOFF",
+ "PsaApiTest (Attest)", "PsaApiTestIPC (Attest)",
+ "PsaApiTestIPCTfmLevel2 (Attest)",
+ "PsaApiTest (Crypto)", "PsaApiTestIPC (Crypto)",
+ "PsaApiTestIPCTfmLevel2 (Crypto)",
+ "PsaApiTest (PS)", "PsaApiTestIPC (PS)",
+ "PsaApiTestIPCTfmLevel2 (PS)",
+ "PsaApiTest (ITS)", "PsaApiTestIPC (ITS)",
+ "PsaApiTestIPCTfmLevel2 (ITS)",
+ "PsaApiTestIPC (FF)",
+ "PsaApiTestIPCTfmLevel2 (FF)",
+ "PsaApiTestIPCTfmLevel3 (ITS)", "PsaApiTestIPCTfmLevel3 (PS)",
+ "PsaApiTestIPCTfmLevel3 (Crypto)", "PsaApiTestIPCTfmLevel3 (Attest)",
+ "PsaApiTestIPCTfmLevel3 (FF)"]
+
def generateLavaParam(build_params) {
def params = []
params += string(name: "TARGET_PLATFORM", \
@@ -306,97 +361,88 @@
def generateCsvContent(results) {
def resultsParam = []
results.each { result ->
- resultsParam.add([result.value[1], \
- result.value[0].getResult(), \
- result.value[2]['TARGET_PLATFORM'], \
- result.value[2]['COMPILER'], \
- result.value[2]['PROJ_CONFIG'], \
- result.value[2]['CMAKE_BUILD_TYPE'], \
- result.value[2]['BL2'], \
- result.value[2]['PSA_API_SUITE']])
+ if (result.value[2]['BL2'] == "True") {
+ resultsParam.add([result.value[1], \
+ result.value[0].getResult(), \
+ result.value[2]['TFM_PLATFORM'], \
+ result.value[2]['TOOLCHAIN_FILE'], \
+ result.value[2]['CMAKE_BUILD_TYPE'], \
+ result.value[2]['BL2'], \
+ result.value[2]['NS'], \
+ result.value[2]['PSA_API'], \
+ result.value[2]['ISOLATION_LEVEL'], \
+ result.value[2]['TEST_REGRESSION'], \
+ result.value[2]['TEST_PSA_API'], \
+ result.value[2]['PROFILE'], \
+ result.value[2]['PARTITION_PS'], \
+ result.value[2]['OTP']])
+ }
}
- def configs = [] as Set
resultsParam.each { result ->
- if (result[2] == 'MUSCA_B1') {
- if (result[0].contains('_OTP_')) {
- result[2] += '_OTP'
+ if (result[2] == 'musca_b1') {
+ if (result[13] != 'off') {
+ result[2] = 'musca_b1_OTP'
}
}
- if (result[6] == 'True') {
- result[6] = 'BL2'
+ result[3] = mapCompiler[result[3]]
+ build_params = result[5..12]
+ configName = ""
+ for (map_cfg in mapConfigs) {
+ if (build_params[0..6] == map_cfg[0..6]) {
+ configName = map_cfg[7]
+ break
+ }
}
- else {
- result[6] = 'NOBL2'
+ if (configName == "") {
+ configName = "Default"
}
- config = result[4]
- if (result[7] != "''") {
- config += ' (' + result[7] + ') '
+ else if (configName == "RegressionProfileM") {
+ if (build_params[7] == "OFF") {
+ configName = "RegressionProfileM PSOFF"
+ }
}
- configs.add(config)
- result.add(config)
+ result.add(configName)
}
- configs.sort()
def csvContent = []
resultsParam.each { result ->
- def configExists = false
- for (csvLine in csvContent) {
- if (csvLine[0] == result[2] && \
- csvLine[1] == result[3] && \
- csvLine[2] == result[5] && \
- csvLine[3] == result[6]) {
- csvLine[4][result[8]] = result[1]
- configExists = true
- break
+ current_row = result[2..4]
+ cfgs.each {cfg ->
+ if (cfg == result[14]) {
+ current_row.add(cfg)
+ current_row.add(result[1])
+ }
+ }
+ csvContent.add(current_row)
+ }
+ csvContent.sort{a,b -> a[0] <=> b[0] ?: a[1] <=> b[1] ?: a[2] <=> b[2]}
+ build_summary = []
+ current_platform = ""
+ current_compiler = ""
+ current_build_type = ""
+ csvContent.each { build_cfg ->
+ if (current_platform != build_cfg[0] || \
+ current_compiler != build_cfg[1] || \
+ current_build_type != build_cfg[2]) {
+ current_platform = build_cfg[0]
+ current_compiler = build_cfg[1]
+ current_build_type = build_cfg[2]
+ csv_line = [current_platform, current_compiler, current_build_type]
+ cfgs.each {
+ csv_line.add("N.A.")
}
- }
- if (!configExists) {
- csvContent.add([result[2], result[3], result[5], result[6], [:]])
- csvContent.last()[4][result[8]] = result[1]
+ build_summary.add(csv_line)
+ }
+ i = 0
+ cfgs.each { cfg ->
+ if (cfg == build_cfg[3]) {
+ build_summary[-1][3+i] = build_cfg[4]
+ }
+ i += 1
}
}
- csvContent.sort{a,b -> a[0] <=> b[0] ?: a[1] <=> b[1] ?: a[2] <=> b[2] ?: a[3] <=> b[3]}
- def csvTable = [['Platform', 'Compiler', 'Cmake Build Type', 'BL2']]
- csvTable[0] += configs
- def currentPlatform = ''
- def currentCompiler = ''
- def currentBuild = ''
- csvContent.each { csvLine ->
- // Modify CSV output format for a better layout
- if (currentPlatform == csvLine[0]) {
- csvTable.add([''])
- }
- else {
- csvTable.add([csvLine[0]])
- currentPlatform = csvLine[0]
- currentCompiler = ''
- currentBuild = ''
- }
- if (currentCompiler == csvLine[1]) {
- csvTable.last().add('')
- }
- else {
- csvTable.last().add(csvLine[1])
- currentCompiler = csvLine[1]
- currentBuild = ''
- }
- if (currentBuild == csvLine[2]) {
- csvTable.last().add('')
- }
- else {
- csvTable.last().add(csvLine[2])
- currentBuild = csvLine[2]
- }
- csvTable.last().add(csvLine[3])
- configs.each { config ->
- if (csvLine[4].containsKey(config)) {
- csvTable.last().add(csvLine[4][config])
- }
- else {
- csvTable.last().add('N/A')
- }
- }
- }
- return csvTable
+ build_summary.add(0, ['Platform', 'Compiler', 'Cmake Build Type'])
+ build_summary[0] += cfgs
+ return build_summary
}
def generateBuildCsv(results) {