@@ -6,28 +6,85 @@ def IMAGE_TAG = lib_Main.getDockerImage(JOB_NAME)
66def TIMEOUT = lib_Main. getTimeout(JOB_NAME )
77def INPUT_STATE = lib_Main. getInputState(JOB_NAME )
88def 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
1072pipeline {
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 $S ANITYCHECK_OPTIONS $A RCH $P LATFORM_ARGS || $S ANITYCHECK_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