Kenji Arai / mbed-os_TYBLE16

Dependents:   TYBLE16_simple_data_logger TYBLE16_MP3_Air

Committer:
kenjiArai
Date:
Tue Dec 17 23:23:45 2019 +0000
Revision:
0:5b88d5760320
mbed-os5 only for TYBLE16

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 0:5b88d5760320 1 echo "Start to build"
kenjiArai 0:5b88d5760320 2
kenjiArai 0:5b88d5760320 3 properties ([
kenjiArai 0:5b88d5760320 4 buildDiscarder(
kenjiArai 0:5b88d5760320 5 logRotator(
kenjiArai 0:5b88d5760320 6 artifactNumToKeepStr: '10',
kenjiArai 0:5b88d5760320 7 numToKeepStr: '100'
kenjiArai 0:5b88d5760320 8 )
kenjiArai 0:5b88d5760320 9 )
kenjiArai 0:5b88d5760320 10 ])
kenjiArai 0:5b88d5760320 11
kenjiArai 0:5b88d5760320 12 // List of targets to compile
kenjiArai 0:5b88d5760320 13 def morpheusTargets = [
kenjiArai 0:5b88d5760320 14 //"LPC1768",
kenjiArai 0:5b88d5760320 15 //"NUCLEO_F401RE",
kenjiArai 0:5b88d5760320 16 //"NRF51DK",
kenjiArai 0:5b88d5760320 17 "K64F"
kenjiArai 0:5b88d5760320 18 ]
kenjiArai 0:5b88d5760320 19 // Map morpheus toolchains to compiler labels on Jenkins
kenjiArai 0:5b88d5760320 20 def toolchains = [
kenjiArai 0:5b88d5760320 21 ARM: "armcc",
kenjiArai 0:5b88d5760320 22 IAR: "iar_arm",
kenjiArai 0:5b88d5760320 23 GCC_ARM: "arm-none-eabi-gcc"
kenjiArai 0:5b88d5760320 24 ]
kenjiArai 0:5b88d5760320 25 // yotta target includes toolchain
kenjiArai 0:5b88d5760320 26 def yottaTargets = [
kenjiArai 0:5b88d5760320 27 "frdm-k64f-gcc": "gcc",
kenjiArai 0:5b88d5760320 28 "frdm-k64f-armcc": "armcc",
kenjiArai 0:5b88d5760320 29 "nrf51dk-gcc": "gcc",
kenjiArai 0:5b88d5760320 30 "stm32f429i-disco-gcc": "gcc",
kenjiArai 0:5b88d5760320 31 "x86-linux-native": "linux && astyle"
kenjiArai 0:5b88d5760320 32 ]
kenjiArai 0:5b88d5760320 33
kenjiArai 0:5b88d5760320 34 // Initial maps for parallel build steps
kenjiArai 0:5b88d5760320 35 def stepsForParallel = [:]
kenjiArai 0:5b88d5760320 36 // Jenkins pipeline does not support map.each, we need to use oldschool for loop
kenjiArai 0:5b88d5760320 37 for (int i = 0; i < morpheusTargets.size(); i++) {
kenjiArai 0:5b88d5760320 38 for(int j = 0; j < toolchains.size(); j++) {
kenjiArai 0:5b88d5760320 39 def target = morpheusTargets.get(i)
kenjiArai 0:5b88d5760320 40 def toolchain = toolchains.keySet().asList().get(j)
kenjiArai 0:5b88d5760320 41 def compilerLabel = toolchains.get(toolchain)
kenjiArai 0:5b88d5760320 42 def stepName = "mbed-os5-${target} ${toolchain}"
kenjiArai 0:5b88d5760320 43 stepsForParallel[stepName] = morpheusBuildStep(target, compilerLabel, toolchain)
kenjiArai 0:5b88d5760320 44 }
kenjiArai 0:5b88d5760320 45 }
kenjiArai 0:5b88d5760320 46 // map yotta steps
kenjiArai 0:5b88d5760320 47 for (int i = 0; i < yottaTargets.size(); i++) {
kenjiArai 0:5b88d5760320 48 def target = yottaTargets.keySet().asList().get(i)
kenjiArai 0:5b88d5760320 49 def compilerLabel = yottaTargets.get(target)
kenjiArai 0:5b88d5760320 50 def stepName = "mbed-os3-${target}"
kenjiArai 0:5b88d5760320 51 stepsForParallel[stepName] = yottaBuildStep(target, compilerLabel)
kenjiArai 0:5b88d5760320 52 }
kenjiArai 0:5b88d5760320 53
kenjiArai 0:5b88d5760320 54 /* Jenkins does not allow stages inside parallel execution,
kenjiArai 0:5b88d5760320 55 * https://issues.jenkins-ci.org/browse/JENKINS-26107 will solve this by adding labeled blocks
kenjiArai 0:5b88d5760320 56 */
kenjiArai 0:5b88d5760320 57 // Actually run the steps in parallel - parallel takes a map as an argument, hence the above.
kenjiArai 0:5b88d5760320 58 timestamps {
kenjiArai 0:5b88d5760320 59 timeout(time: 30, unit: "MINUTES") {
kenjiArai 0:5b88d5760320 60 parallel stepsForParallel
kenjiArai 0:5b88d5760320 61 }
kenjiArai 0:5b88d5760320 62 }
kenjiArai 0:5b88d5760320 63
kenjiArai 0:5b88d5760320 64 def execute(cmd) {
kenjiArai 0:5b88d5760320 65 if(isUnix()) {
kenjiArai 0:5b88d5760320 66 sh "${cmd}"
kenjiArai 0:5b88d5760320 67 } else {
kenjiArai 0:5b88d5760320 68 bat "${cmd}"
kenjiArai 0:5b88d5760320 69 }
kenjiArai 0:5b88d5760320 70 }
kenjiArai 0:5b88d5760320 71
kenjiArai 0:5b88d5760320 72 //Create morpheus build steps for parallel execution
kenjiArai 0:5b88d5760320 73 def morpheusBuildStep(target, compilerLabel, toolchain) {
kenjiArai 0:5b88d5760320 74 return {
kenjiArai 0:5b88d5760320 75 node ("${compilerLabel}") {
kenjiArai 0:5b88d5760320 76 deleteDir()
kenjiArai 0:5b88d5760320 77 dir("mbed-trace") {
kenjiArai 0:5b88d5760320 78 String buildName = "mbed-os5-${target}-${toolchain}"
kenjiArai 0:5b88d5760320 79 def scmVars = checkout scm
kenjiArai 0:5b88d5760320 80 env.GIT_COMMIT_HASH = scmVars.GIT_COMMIT
kenjiArai 0:5b88d5760320 81 setBuildStatus('PENDING', "build ${buildName}", 'build starts')
kenjiArai 0:5b88d5760320 82 stage ("build:${buildName}") {
kenjiArai 0:5b88d5760320 83 try{
kenjiArai 0:5b88d5760320 84 execute("mbed --version")
kenjiArai 0:5b88d5760320 85 execute("echo https://github.com/armmbed/mbed-os/#6a0a86538c0b9b2bfcc4583b1e2b7fea8f4e71e9 > mbed-os.lib")
kenjiArai 0:5b88d5760320 86 execute("mbed deploy")
kenjiArai 0:5b88d5760320 87 execute("rm -rf ./mbed-os/features/frameworks/mbed-trace")
kenjiArai 0:5b88d5760320 88 execute("mbed compile -m ${target} -t ${toolchain} --library")
kenjiArai 0:5b88d5760320 89 setBuildStatus('SUCCESS', "build ${buildName}", "build done")
kenjiArai 0:5b88d5760320 90 } catch (err) {
kenjiArai 0:5b88d5760320 91 echo "Caught exception: ${err}"
kenjiArai 0:5b88d5760320 92 setBuildStatus('FAILURE', "build ${buildName}", "build failed")
kenjiArai 0:5b88d5760320 93 throw err
kenjiArai 0:5b88d5760320 94 }
kenjiArai 0:5b88d5760320 95 }
kenjiArai 0:5b88d5760320 96 stage("build:example:${buildName}") {
kenjiArai 0:5b88d5760320 97 execute("mkdir ../example-mbed-os-5 || true")
kenjiArai 0:5b88d5760320 98 execute("cp -R example/mbed-os-5 ../example-mbed-os-5")
kenjiArai 0:5b88d5760320 99 dir("../example-mbed-os-5") {
kenjiArai 0:5b88d5760320 100 def exampleName = "example-${buildName}"
kenjiArai 0:5b88d5760320 101 setBuildStatus('PENDING', "build ${exampleName}", 'build starts')
kenjiArai 0:5b88d5760320 102 try {
kenjiArai 0:5b88d5760320 103 execute("echo \"https://github.com/ARMmbed/mbed-os/#6a0a86538c0b9b2bfcc4583b1e2b7fea8f4e71e9\" > mbed-os.lib")
kenjiArai 0:5b88d5760320 104 execute("echo \"https://github.com/ARMmbed/mbed-trace#${env.GIT_COMMIT_HASH}\" > mbed-trace.lib")
kenjiArai 0:5b88d5760320 105 execute("mbed new .")
kenjiArai 0:5b88d5760320 106 execute("mbed deploy")
kenjiArai 0:5b88d5760320 107 execute("rm -rf ./mbed-os/features/frameworks/mbed-trace")
kenjiArai 0:5b88d5760320 108 execute("rm -rf ./mbed-trace/example")
kenjiArai 0:5b88d5760320 109 execute("rm -rf ./mbed-trace/test")
kenjiArai 0:5b88d5760320 110 execute("mbed compile -t ${toolchain} -m ${target}")
kenjiArai 0:5b88d5760320 111 setBuildStatus('SUCCESS', "build ${exampleName}", "build done")
kenjiArai 0:5b88d5760320 112 } catch(err) {
kenjiArai 0:5b88d5760320 113 echo "Caught exception: ${err}"
kenjiArai 0:5b88d5760320 114 setBuildStatus('FAILURE', "build ${exampleName}", "build failed")
kenjiArai 0:5b88d5760320 115 currentBuild.result = 'FAILURE'
kenjiArai 0:5b88d5760320 116 } finally {
kenjiArai 0:5b88d5760320 117 // clean up
kenjiArai 0:5b88d5760320 118 postBuild(buildName, false)
kenjiArai 0:5b88d5760320 119 step([$class: 'WsCleanup'])
kenjiArai 0:5b88d5760320 120 }
kenjiArai 0:5b88d5760320 121 }
kenjiArai 0:5b88d5760320 122 }
kenjiArai 0:5b88d5760320 123 }
kenjiArai 0:5b88d5760320 124 }
kenjiArai 0:5b88d5760320 125 }
kenjiArai 0:5b88d5760320 126 }
kenjiArai 0:5b88d5760320 127
kenjiArai 0:5b88d5760320 128 //Create yotta build steps for parallel execution
kenjiArai 0:5b88d5760320 129 def yottaBuildStep(target, compilerLabel) {
kenjiArai 0:5b88d5760320 130 return {
kenjiArai 0:5b88d5760320 131 String buildName = "mbed-os3-${target}"
kenjiArai 0:5b88d5760320 132 node ("${compilerLabel}") {
kenjiArai 0:5b88d5760320 133 deleteDir()
kenjiArai 0:5b88d5760320 134 dir("mbed-trace") {
kenjiArai 0:5b88d5760320 135 def scmVars = checkout scm
kenjiArai 0:5b88d5760320 136 env.GIT_COMMIT_HASH = scmVars.GIT_COMMIT
kenjiArai 0:5b88d5760320 137 def isTest = target == "x86-linux-native" // tests are valid only in linux target
kenjiArai 0:5b88d5760320 138 stage ("build:${buildName}") {
kenjiArai 0:5b88d5760320 139 setBuildStatus('PENDING', "build ${buildName}", 'build starts')
kenjiArai 0:5b88d5760320 140 try{
kenjiArai 0:5b88d5760320 141 execute("yotta --version")
kenjiArai 0:5b88d5760320 142 execute("yotta target $target")
kenjiArai 0:5b88d5760320 143 execute("yotta --plain build mbed-trace")
kenjiArai 0:5b88d5760320 144 setBuildStatus('SUCCESS', "build ${buildName}", "build done")
kenjiArai 0:5b88d5760320 145 } catch (err) {
kenjiArai 0:5b88d5760320 146 echo "Caught exception: ${err}"
kenjiArai 0:5b88d5760320 147 setBuildStatus('FAILURE', "build ${buildName}", "build failed")
kenjiArai 0:5b88d5760320 148 currentBuild.result = 'FAILURE'
kenjiArai 0:5b88d5760320 149 }
kenjiArai 0:5b88d5760320 150 } // stage
kenjiArai 0:5b88d5760320 151 if (isTest) {
kenjiArai 0:5b88d5760320 152 stage("test:${buildName}") {
kenjiArai 0:5b88d5760320 153 setBuildStatus('PENDING', "test ${buildName}", 'test starts')
kenjiArai 0:5b88d5760320 154 try {
kenjiArai 0:5b88d5760320 155 execute("yotta test mbed_trace_test")
kenjiArai 0:5b88d5760320 156 execute("lcov --base-directory . --directory . --capture --output-file coverage.info")
kenjiArai 0:5b88d5760320 157 execute("genhtml -o ./test_coverage coverage.info")
kenjiArai 0:5b88d5760320 158 execute("gcovr -x -o junit.xml")
kenjiArai 0:5b88d5760320 159 execute("cppcheck --enable=all --std=c99 --inline-suppr --template=\"{file},{line},{severity},{id},{message}\" source 2> cppcheck.txt")
kenjiArai 0:5b88d5760320 160
kenjiArai 0:5b88d5760320 161 // check if astyle is correct
kenjiArai 0:5b88d5760320 162 execute("astyle --options=.astylerc source/*.c mbed-trace/*.h")
kenjiArai 0:5b88d5760320 163 // check differency
kenjiArai 0:5b88d5760320 164 execute("git diff-index -p --exit-code HEAD")
kenjiArai 0:5b88d5760320 165
kenjiArai 0:5b88d5760320 166 setBuildStatus('SUCCESS', "test ${buildName}", "test done")
kenjiArai 0:5b88d5760320 167 } catch(err) {
kenjiArai 0:5b88d5760320 168 echo "Caught exception: ${err}"
kenjiArai 0:5b88d5760320 169 setBuildStatus('FAILURE', "test ${buildName}", "test failed")
kenjiArai 0:5b88d5760320 170 currentBuild.result = 'FAILURE'
kenjiArai 0:5b88d5760320 171 }
kenjiArai 0:5b88d5760320 172 } // stage
kenjiArai 0:5b88d5760320 173 stage("example:${buildName}") {
kenjiArai 0:5b88d5760320 174 dir("example/linux") {
kenjiArai 0:5b88d5760320 175 def exampleName = "example-linux"
kenjiArai 0:5b88d5760320 176 setBuildStatus('PENDING', "build ${exampleName}", 'build starts')
kenjiArai 0:5b88d5760320 177 try {
kenjiArai 0:5b88d5760320 178 execute("make")
kenjiArai 0:5b88d5760320 179 setBuildStatus('SUCCESS', "build ${exampleName}", "build done")
kenjiArai 0:5b88d5760320 180 } catch(err) {
kenjiArai 0:5b88d5760320 181 echo "Caught exception: ${err}"
kenjiArai 0:5b88d5760320 182 setBuildStatus('FAILURE', "build ${exampleName}", "build failed")
kenjiArai 0:5b88d5760320 183 currentBuild.result = 'FAILURE'
kenjiArai 0:5b88d5760320 184 }
kenjiArai 0:5b88d5760320 185 }
kenjiArai 0:5b88d5760320 186 } // stage
kenjiArai 0:5b88d5760320 187
kenjiArai 0:5b88d5760320 188 stage("leak-check:${buildName}") {
kenjiArai 0:5b88d5760320 189 dir("example/linux") {
kenjiArai 0:5b88d5760320 190 def stageName = "leak-check"
kenjiArai 0:5b88d5760320 191 setBuildStatus('PENDING', "test ${stageName}", 'test starts')
kenjiArai 0:5b88d5760320 192 try {
kenjiArai 0:5b88d5760320 193 execute("./memtest.sh")
kenjiArai 0:5b88d5760320 194 setBuildStatus('SUCCESS', "test ${stageName}", "test done")
kenjiArai 0:5b88d5760320 195 } catch(err) {
kenjiArai 0:5b88d5760320 196 echo "Caught exception: ${err}"
kenjiArai 0:5b88d5760320 197 setBuildStatus('FAILURE', "test ${stageName}", "test failed")
kenjiArai 0:5b88d5760320 198 currentBuild.result = 'FAILURE'
kenjiArai 0:5b88d5760320 199 }
kenjiArai 0:5b88d5760320 200 }
kenjiArai 0:5b88d5760320 201 } // stage
kenjiArai 0:5b88d5760320 202 } // if linux
kenjiArai 0:5b88d5760320 203 postBuild(buildName, isTest)
kenjiArai 0:5b88d5760320 204 step([$class: 'WsCleanup'])
kenjiArai 0:5b88d5760320 205 } // dir
kenjiArai 0:5b88d5760320 206 }
kenjiArai 0:5b88d5760320 207 }
kenjiArai 0:5b88d5760320 208 }
kenjiArai 0:5b88d5760320 209
kenjiArai 0:5b88d5760320 210 def postBuild(buildName, isTest) {
kenjiArai 0:5b88d5760320 211 // move files to target+toolchain specific folder
kenjiArai 0:5b88d5760320 212 execute("mkdir -p output/${buildName}")
kenjiArai 0:5b88d5760320 213 execute("find . -name 'libmbed-trace.a' -exec mv {} 'output/${buildName}' \\;")
kenjiArai 0:5b88d5760320 214 execute("find . -name 'mbed-trace.ar' -exec mv {} 'output/${buildName}' \\;")
kenjiArai 0:5b88d5760320 215 execute("find ../example-mbed-os-5 -name 'example-mbed-os-5.bin' -exec mv {} 'output/${buildName}/example-mbed-os-5.bin' \\; || true")
kenjiArai 0:5b88d5760320 216 // Archive artifacts
kenjiArai 0:5b88d5760320 217 step([
kenjiArai 0:5b88d5760320 218 $class: 'ArtifactArchiver',
kenjiArai 0:5b88d5760320 219 artifacts: "cppcheck.txt,output/**",
kenjiArai 0:5b88d5760320 220 fingerprint: true,
kenjiArai 0:5b88d5760320 221 allowEmptyArchive: true
kenjiArai 0:5b88d5760320 222 ])
kenjiArai 0:5b88d5760320 223 if (isTest) {
kenjiArai 0:5b88d5760320 224 // Publish cobertura
kenjiArai 0:5b88d5760320 225 step([
kenjiArai 0:5b88d5760320 226 $class: 'CoberturaPublisher',
kenjiArai 0:5b88d5760320 227 coberturaReportFile: 'junit.xml'
kenjiArai 0:5b88d5760320 228 ])
kenjiArai 0:5b88d5760320 229 // Publish compiler warnings
kenjiArai 0:5b88d5760320 230 step([
kenjiArai 0:5b88d5760320 231 $class: 'WarningsPublisher',
kenjiArai 0:5b88d5760320 232 parserConfigurations: [[
kenjiArai 0:5b88d5760320 233 parserName: 'GNU Make + GNU C Compiler (gcc)',
kenjiArai 0:5b88d5760320 234 pattern: 'mbed-trace/*.h,source/*.c,test/*.cpp'
kenjiArai 0:5b88d5760320 235 ]],
kenjiArai 0:5b88d5760320 236 unstableTotalAll: '0',
kenjiArai 0:5b88d5760320 237 useDeltaValues: true,
kenjiArai 0:5b88d5760320 238 usePreviousBuildAsReference: true
kenjiArai 0:5b88d5760320 239 ])
kenjiArai 0:5b88d5760320 240 // Publish HTML reports
kenjiArai 0:5b88d5760320 241 publishHTML(target: [
kenjiArai 0:5b88d5760320 242 alwayLinkToLastBuild: false,
kenjiArai 0:5b88d5760320 243 keepAll: true,
kenjiArai 0:5b88d5760320 244 reportDir: "test_coverage",
kenjiArai 0:5b88d5760320 245 reportFiles: "index.html",
kenjiArai 0:5b88d5760320 246 reportName: "Build HTML Report"
kenjiArai 0:5b88d5760320 247 ])
kenjiArai 0:5b88d5760320 248 }
kenjiArai 0:5b88d5760320 249 }
kenjiArai 0:5b88d5760320 250 // helper function to set build status to github PR
kenjiArai 0:5b88d5760320 251 def setBuildStatus(String state, String context, String message) {
kenjiArai 0:5b88d5760320 252 step([
kenjiArai 0:5b88d5760320 253 $class: "GitHubCommitStatusSetter",
kenjiArai 0:5b88d5760320 254 reposSource: [
kenjiArai 0:5b88d5760320 255 $class: "ManuallyEnteredRepositorySource",
kenjiArai 0:5b88d5760320 256 url: "https://github.com/ARMmbed/mbed-trace.git"
kenjiArai 0:5b88d5760320 257 ],
kenjiArai 0:5b88d5760320 258 contextSource: [
kenjiArai 0:5b88d5760320 259 $class: "ManuallyEnteredCommitContextSource",
kenjiArai 0:5b88d5760320 260 context: context
kenjiArai 0:5b88d5760320 261 ],
kenjiArai 0:5b88d5760320 262 errorHandlers: [[
kenjiArai 0:5b88d5760320 263 $class: "ChangingBuildStatusErrorHandler",
kenjiArai 0:5b88d5760320 264 result: "UNSTABLE"
kenjiArai 0:5b88d5760320 265 ]],
kenjiArai 0:5b88d5760320 266 commitShaSource: [
kenjiArai 0:5b88d5760320 267 $class: "ManuallyEnteredShaSource",
kenjiArai 0:5b88d5760320 268 sha: env.GIT_COMMIT_HASH
kenjiArai 0:5b88d5760320 269 ],
kenjiArai 0:5b88d5760320 270 statusResultSource: [
kenjiArai 0:5b88d5760320 271 $class: 'ConditionalStatusResultSource',
kenjiArai 0:5b88d5760320 272 results: [
kenjiArai 0:5b88d5760320 273 [
kenjiArai 0:5b88d5760320 274 $class: 'AnyBuildResult',
kenjiArai 0:5b88d5760320 275 message: message,
kenjiArai 0:5b88d5760320 276 state: state
kenjiArai 0:5b88d5760320 277 ]
kenjiArai 0:5b88d5760320 278 ]
kenjiArai 0:5b88d5760320 279 ]
kenjiArai 0:5b88d5760320 280 ])
kenjiArai 0:5b88d5760320 281 }