Skip to content

Commit 2af0180

Browse files
thst-nordicmbolivar-nordic
authored andcommitted
[nrf noup] ci: force gnuarmemb sanitycheck and run in parallel
jenkins now load balances the parallel tasks better also. Signed-off-by: Thomas Stilwell <[email protected]> (cherry picked from commit 05f1cb3) Signed-off-by: Martí Bolívar <[email protected]>
1 parent d553bda commit 2af0180

File tree

1 file changed

+145
-81
lines changed

1 file changed

+145
-81
lines changed

Jenkinsfile

Lines changed: 145 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -6,28 +6,85 @@ def IMAGE_TAG = lib_Main.getDockerImage(JOB_NAME)
66
def TIMEOUT = lib_Main.getTimeout(JOB_NAME)
77
def INPUT_STATE = lib_Main.getInputState(JOB_NAME)
88
def CI_STATE = new HashMap()
9+
def TestExecutionList = [:]
10+
11+
12+
def generateParallelStageNRF(subset, compiler, AGENT_LABELS, DOCKER_REG, IMAGE_TAG, JOB_NAME, CI_STATE) {
13+
return {
14+
node (AGENT_LABELS) {
15+
stage('Sanity Check - Zephyr'){
16+
docker.image("$DOCKER_REG/$IMAGE_TAG").inside {
17+
lib_Main.cloneCItools(JOB_NAME)
18+
dir('zephyr') {
19+
checkout scm
20+
CI_STATE.ZEPHYR.REPORT_SHA = lib_Main.checkoutRepo(
21+
CI_STATE.ZEPHYR.GIT_URL, "ZEPHYR", CI_STATE.ZEPHYR, false)
22+
lib_West.AddManifestUpdate("ZEPHYR", 'zephyr',
23+
CI_STATE.ZEPHYR.GIT_URL, CI_STATE.ZEPHYR.GIT_REF, CI_STATE)
24+
}
25+
lib_West.InitUpdate('zephyr')
26+
lib_West.ApplyManifestUpdates(CI_STATE)
27+
dir('zephyr') {
28+
def PLATFORM_ARGS = lib_Main.getPlatformArgs(CI_STATE.ZEPHYR.PLATFORMS)
29+
println "$compiler SANITY NRF PLATFORMS_ARGS = $PLATFORM_ARGS"
30+
sh """
31+
export ZEPHYR_TOOLCHAIN_VARIANT='$compiler' && \
32+
source zephyr-env.sh && \
33+
(./scripts/sanitycheck $SANITYCHECK_OPTIONS $ARCH $PLATFORM_ARGS --subset $subset || $SANITYCHECK_RETRY_CMDS
34+
"""
35+
}
36+
}
37+
cleanWs()
38+
}
39+
}
40+
}
41+
}
42+
43+
def generateParallelStageALL(subset, compiler, AGENT_LABELS, DOCKER_REG, IMAGE_TAG, JOB_NAME, CI_STATE) {
44+
return {
45+
node (AGENT_LABELS) {
46+
stage('Sanity Check - Zephyr'){
47+
docker.image("$DOCKER_REG/$IMAGE_TAG").inside {
48+
lib_Main.cloneCItools(JOB_NAME)
49+
dir('zephyr') {
50+
checkout scm
51+
CI_STATE.ZEPHYR.REPORT_SHA = lib_Main.checkoutRepo(
52+
CI_STATE.ZEPHYR.GIT_URL, "ZEPHYR", CI_STATE.ZEPHYR, false)
53+
lib_West.AddManifestUpdate("ZEPHYR", 'zephyr',
54+
CI_STATE.ZEPHYR.GIT_URL, CI_STATE.ZEPHYR.GIT_REF, CI_STATE)
55+
}
56+
lib_West.InitUpdate('zephyr')
57+
lib_West.ApplyManifestUpdates(CI_STATE)
58+
dir('zephyr') {
59+
sh """
60+
export ZEPHYR_TOOLCHAIN_VARIANT='$compiler' && \
61+
source zephyr-env.sh && \
62+
(./scripts/sanitycheck $SANITYCHECK_OPTIONS $ARCH --subset $subset || $SANITYCHECK_RETRY_CMDS
63+
"""
64+
}
65+
}
66+
}
67+
}
68+
}
69+
}
70+
971

1072
pipeline {
1173

1274
parameters {
1375
booleanParam(name: 'RUN_DOWNSTREAM', description: 'if false skip downstream jobs', defaultValue: true)
1476
booleanParam(name: 'RUN_TESTS', description: 'if false skip testing', defaultValue: true)
1577
booleanParam(name: 'RUN_BUILD', description: 'if false skip building', defaultValue: true)
16-
string(name: 'PLATFORMS', description: 'Default Platforms to test', defaultValue: 'nrf9160_pca10090 nrf52_pca10040 nrf52840_pca10056')
78+
string(name: 'PLATFORMS', description: 'Default Platforms to test', defaultValue: 'nrf9160_pca10090 nrf9160_pca10090ns nrf52_pca10040 nrf52840_pca10056')
1779
string(name: 'jsonstr_CI_STATE', description: 'Default State if no upstream job',
1880
defaultValue: INPUT_STATE)
1981
}
82+
agent { label AGENT_LABELS }
2083

21-
agent {
22-
docker {
23-
image IMAGE_TAG
24-
label AGENT_LABELS
25-
args '-e PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/workdir/.local/bin'
26-
}
27-
}
2884
options {
2985
// Checkout the repository to this folder instead of root
3086
checkoutToSubdirectory('zephyr')
87+
parallelsAlwaysFailFast()
3188
timeout(time: TIMEOUT.time, unit: TIMEOUT.unit)
3289
}
3390

@@ -46,91 +103,98 @@ pipeline {
46103
(sleep 10; ./scripts/sanitycheck $SANITYCHECK_OPTIONS --only-failed --outdir=out-2nd-pass) ||
47104
(sleep 10; ./scripts/sanitycheck $SANITYCHECK_OPTIONS --only-failed --outdir=out-3rd-pass))
48105
"""
49-
50-
// ENVs for building (triggered by sanitycheck)
51-
ZEPHYR_TOOLCHAIN_VARIANT = 'zephyr'
52-
GNUARMEMB_TOOLCHAIN_PATH = '/workdir/gcc-arm-none-eabi-7-2018-q2-update'
53-
ZEPHYR_SDK_INSTALL_DIR = '/opt/zephyr-sdk'
54106
}
55107

56108
stages {
57109
stage('Load') { steps { script { CI_STATE = lib_Stage.load('ZEPHYR') }}}
58-
stage('Checkout') {
59-
steps { script {
60-
lib_Main.cloneCItools(JOB_NAME)
61-
dir('zephyr') {
62-
CI_STATE.ZEPHYR.REPORT_SHA = lib_Main.checkoutRepo(CI_STATE.ZEPHYR.GIT_URL, "ZEPHYR", CI_STATE.ZEPHYR, false)
63-
lib_West.AddManifestUpdate("ZEPHYR", 'zephyr', CI_STATE.ZEPHYR.GIT_URL, CI_STATE.ZEPHYR.GIT_REF, CI_STATE)
64-
}
65-
}}
66-
}
67-
stage('Get nRF && Apply Parent Manifest Updates') {
68-
when { expression { CI_STATE.ZEPHYR.RUN_TESTS || CI_STATE.ZEPHYR.RUN_BUILD } }
69-
steps { script {
70-
lib_Status.set("PENDING", 'ZEPHYR', CI_STATE);
71-
lib_West.InitUpdate('zephyr')
72-
lib_West.ApplyManifestUpdates(CI_STATE)
73-
}}
74-
}
75-
stage('Run compliance check') {
76-
when { expression { CI_STATE.ZEPHYR.RUN_TESTS } }
77-
steps {
78-
dir('zephyr') {
79-
script {
80-
def BUILD_TYPE = lib_Main.getBuildType(CI_STATE.ZEPHYR)
81-
if (BUILD_TYPE == "PR") {
82-
COMMIT_RANGE = "$CI_STATE.ZEPHYR.MERGE_BASE..$CI_STATE.ZEPHYR.REPORT_SHA"
83-
COMPLIANCE_ARGS = "$COMPLIANCE_ARGS -p $CHANGE_ID -S $CI_STATE.ZEPHYR.REPORT_SHA -g"
84-
println "Building a PR [$CHANGE_ID]: $COMMIT_RANGE"
85-
}
86-
else if (BUILD_TYPE == "TAG") {
87-
COMMIT_RANGE = "tags/${env.BRANCH_NAME}..tags/${env.BRANCH_NAME}"
88-
println "Building a Tag: " + COMMIT_RANGE
89-
}
90-
// If not a PR, it's a non-PR-branch or master build. Compare against the origin.
91-
else if (BUILD_TYPE == "BRANCH") {
92-
COMMIT_RANGE = "origin/${env.BRANCH_NAME}..HEAD"
93-
println "Building a Branch: " + COMMIT_RANGE
94-
}
95-
else {
96-
assert condition : "Build fails because it is not a PR/Tag/Branch"
97-
}
110+
stage('Specification') { steps { script {
98111

99-
// Run the compliance check
100-
try {
101-
sh "(source ../zephyr/zephyr-env.sh && ../ci-tools/scripts/check_compliance.py $COMPLIANCE_ARGS --commits $COMMIT_RANGE)"
102-
}
103-
finally {
104-
junit 'compliance.xml'
105-
archiveArtifacts artifacts: 'compliance.xml'
112+
def TestStages = [:]
113+
114+
TestStages["compliance"] = {
115+
node (AGENT_LABELS) {
116+
stage('Compliance Test'){
117+
docker.image("$DOCKER_REG/$IMAGE_TAG").inside {
118+
lib_Main.cloneCItools(JOB_NAME)
119+
dir('zephyr') {
120+
checkout scm
121+
CI_STATE.ZEPHYR.REPORT_SHA = lib_Main.checkoutRepo(
122+
CI_STATE.ZEPHYR.GIT_URL, "ZEPHYR", CI_STATE.ZEPHYR, false)
123+
lib_West.AddManifestUpdate("ZEPHYR", 'zephyr',
124+
CI_STATE.ZEPHYR.GIT_URL, CI_STATE.ZEPHYR.GIT_REF, CI_STATE)
125+
}
126+
lib_West.InitUpdate('zephyr')
127+
lib_West.ApplyManifestUpdates(CI_STATE)
128+
129+
dir('zephyr') {
130+
def BUILD_TYPE = lib_Main.getBuildType(CI_STATE.ZEPHYR)
131+
if (BUILD_TYPE == "PR") {
132+
COMMIT_RANGE = "$CI_STATE.ZEPHYR.MERGE_BASE..$CI_STATE.ZEPHYR.REPORT_SHA"
133+
COMPLIANCE_ARGS = "$COMPLIANCE_ARGS -p $CHANGE_ID -S $CI_STATE.ZEPHYR.REPORT_SHA -g"
134+
println "Building a PR [$CHANGE_ID]: $COMMIT_RANGE"
135+
}
136+
else if (BUILD_TYPE == "TAG") {
137+
COMMIT_RANGE = "tags/${env.BRANCH_NAME}..tags/${env.BRANCH_NAME}"
138+
println "Building a Tag: " + COMMIT_RANGE
139+
}
140+
// If not a PR, it's a non-PR-branch or master build. Compare against the origin.
141+
else if (BUILD_TYPE == "BRANCH") {
142+
COMMIT_RANGE = "origin/${env.BRANCH_NAME}..HEAD"
143+
println "Building a Branch: " + COMMIT_RANGE
144+
}
145+
else {
146+
assert condition : "Build fails because it is not a PR/Tag/Branch"
147+
}
148+
149+
// Run the compliance check
150+
try {
151+
sh "(source ../zephyr/zephyr-env.sh && ../ci-tools/scripts/check_compliance.py $COMPLIANCE_ARGS --commits $COMMIT_RANGE)"
152+
}
153+
finally {
154+
junit 'compliance.xml'
155+
archiveArtifacts artifacts: 'compliance.xml'
156+
}
157+
}
106158
}
107159
}
108160
}
109161
}
110-
}
111-
stage('Sanitycheck') {
112-
when { expression { CI_STATE.ZEPHYR.RUN_BUILD } }
113-
parallel {
114-
stage('nRF Platforms') {
115-
steps { script {
116-
dir('zephyr') {
117-
def PLATFORM_ARGS = lib_Main.getPlatformArgs(CI_STATE.ZEPHYR.PLATFORMS)
118-
sh "source zephyr-env.sh && \
119-
(./scripts/sanitycheck $SANITYCHECK_OPTIONS $ARCH $PLATFORM_ARGS || $SANITYCHECK_RETRY_CMDS"
120-
}
121-
}}
162+
163+
if (CI_STATE.ZEPHYR.RUN_TESTS) {
164+
TestExecutionList['compliance'] = TestStages["compliance"]
165+
}
166+
167+
if (CI_STATE.ZEPHYR.RUN_BUILD) {
168+
def SUBSET_LIST = ['1/4', '2/4', '3/4', '4/4' ]
169+
def COMPILER_LIST = ['gnuarmemb'] // 'zephyr',
170+
def INPUT_MAP = [set : SUBSET_LIST, compiler : COMPILER_LIST ]
171+
172+
def OUTPUT_MAP = INPUT_MAP.values().combinations { args ->
173+
[INPUT_MAP.keySet().toList(), args].transpose().collectEntries { [(it[0]): it[1]]}
122174
}
123-
stage('All Platforms') {
124-
when { expression { CI_STATE.ORIGIN.BUILD_TYPE != 'PR' } }
125-
steps { script {
126-
dir('zephyr') {
127-
sh "source zephyr-env.sh && \
128-
(./scripts/sanitycheck $SANITYCHECK_OPTIONS $ARCH || $SANITYCHECK_RETRY_CMDS"
129-
}
175+
176+
def sanityCheckNRFStages = OUTPUT_MAP.collectEntries {
177+
["SanityCheckNRF\n${it.compiler}\n${it.set}" : generateParallelStageNRF(it.set, it.compiler,
178+
AGENT_LABELS, DOCKER_REG, IMAGE_TAG, JOB_NAME, CI_STATE)]
179+
}
180+
TestExecutionList = TestExecutionList.plus(sanityCheckNRFStages)
181+
182+
if (lib_Main.getBuildType(CI_STATE.ZEPHYR) != 'PR') {
183+
def sanityCheckALLStages = OUTPUT_MAP.collectEntries {
184+
["SanityCheckALL\n${it.compiler}\n${it.set}" : generateParallelStageALL(it.set, it.compiler,
185+
AGENT_LABELS, DOCKER_REG, IMAGE_TAG, JOB_NAME, CI_STATE)]
130186
}
131-
}}
187+
TestExecutionList = TestExecutionList.plus(sanityCheckALLStages)
188+
}
132189
}
133-
}
190+
191+
println "TestExecutionList = $TestExecutionList"
192+
193+
}}}
194+
195+
stage('Exectuion') { steps { script {
196+
parallel TestExecutionList
197+
}}}
134198

135199
stage('Trigger testing build') {
136200
when { expression { CI_STATE.ZEPHYR.RUN_DOWNSTREAM } }

0 commit comments

Comments
 (0)