source: Jenkinsfile@ 2284d20

ADT ast-experimental pthread-emulation
Last change on this file since 2284d20 was 6b00c53, checked in by Thierry Delisle <tdelisle@…>, 3 years ago

Jenkins no longer offers the option to build the old ast

  • Property mode set to 100644
File size: 13.1 KB
RevLine 
[a63ad80]1#!groovy
2
[7a230fd]3import groovy.transform.Field
4
[29f4fe62]5//===========================================================================================================
[9beae23]6// Main loop of the compilation
[29f4fe62]7//===========================================================================================================
[56a9ce6]8
[d3b95f1]9// Globals
[e018546]10BuildDir = null
11SrcDir = null
[d3b95f1]12Settings = null
13Tools = null
[4f9e706]14
[d3b95f1]15// Local variables
16def err = null
17def log_needed = false
[5b8413b4]18
[d3b95f1]19currentBuild.result = "SUCCESS"
[4f9e706]20
[d3b95f1]21try {
[47138ee]22 node {
23 //Wrap build to add timestamp to command line
24 wrap([$class: 'TimestamperBuildWrapper']) {
[85142648]25 Settings = prepare_build()
[d3b95f1]26 }
[47138ee]27 }
[952ee7a]28
[47138ee]29 node(Settings.Architecture.node) {
30 //Wrap build to add timestamp to command line
31 wrap([$class: 'TimestamperBuildWrapper']) {
[d3b95f1]32 BuildDir = pwd tmp: true
33 SrcDir = pwd tmp: false
34 currentBuild.description = "${currentBuild.description} on ${env.NODE_NAME}"
[7aebc62]35
[d3b95f1]36 Tools.Clean()
[fde808df]37
[d3b95f1]38 Tools.Checkout()
[95fdb0a]39
[d3b95f1]40 build()
[95fdb0a]41
[d3b95f1]42 test()
[95fdb0a]43
[d3b95f1]44 benchmark()
[7359098]45
[d3b95f1]46 build_doc()
[9beae23]47
[d3b95f1]48 publish()
[9beae23]49 }
[738cf8f]50 }
[d3b95f1]51}
[738cf8f]52
[d3b95f1]53//If an exception is caught we need to change the status and remember to
54//attach the build log to the email
55catch (Exception caughtError) {
56 // Store the result of the build log
57 currentBuild.result = "FAILURE"
[9dd31e7]58
[d3b95f1]59 // An error has occured, the build log is relevent
60 log_needed = true
[9beae23]61
[d3b95f1]62 // rethrow error later
63 err = caughtError
[852ae0ea]64
[d3b95f1]65 // print the error so it shows in the log
66 echo err.toString()
67}
[738cf8f]68
[d3b95f1]69finally {
70 //Send email with final results if this is not a full build
71 email(log_needed)
[9beae23]72
[d3b95f1]73 echo 'Build Completed'
[734891d]74
[d3b95f1]75 /* Must re-throw exception to propagate error */
76 if (err) {
77 throw err
[738cf8f]78 }
79}
[29f4fe62]80//===========================================================================================================
[9beae23]81// Main compilation routines
[29f4fe62]82//===========================================================================================================
[95fdb0a]83def build() {
[e507c11]84 debug = true
85 release = Settings.RunAllTests || Settings.RunBenchmark
[91aa5ab]86 Tools.BuildStage('Build : configure', true) {
[dcf1979]87 // Configure must be run inside the tree
88 dir (SrcDir) {
89 // Generate the necessary build files
90 sh './autogen.sh'
91 }
92
[50f2cfc]93 // Build outside of the src tree to ease cleaning
[5b8413b4]94 dir (BuildDir) {
[8e58264]95 //Configure the compilation (Output is not relevant)
[50f2cfc]96 //Use the current directory as the installation target so nothing escapes the sandbox
97 //Also specify the compiler by hand
[3fc5f010]98 targets=""
[d4510ea]99 if( Settings.RunAllTests || Settings.RunBenchmark ) {
[6bde81d]100 targets="--with-target-hosts='host:debug,host:nodebug'"
[3fc5f010]101 } else {
[6bde81d]102 targets="--with-target-hosts='host:debug'"
[3fc5f010]103 }
104
[6b00c53]105 sh "${SrcDir}/configure CXX=${Settings.Compiler.CXX} CC=${Settings.Compiler.CC} ${Settings.Architecture.flags} AR=gcc-ar RANLIB=gcc-ranlib ${targets} --quiet --prefix=${BuildDir}"
[f253e4a]106
107 // Configure libcfa
[0b4ddb71]108 sh 'make -j $(nproc) --no-print-directory configure-libcfa'
[e507c11]109 }
110 }
111
[91aa5ab]112 Tools.BuildStage('Build : cfa-cpp', true) {
[e507c11]113 // Build outside of the src tree to ease cleaning
114 dir (BuildDir) {
115 // Build driver
[0b4ddb71]116 sh 'make -j $(nproc) --no-print-directory -C driver'
[e507c11]117
118 // Build translator
[0b4ddb71]119 sh 'make -j $(nproc) --no-print-directory -C src'
[e507c11]120 }
121 }
[1752d0e]122
[91aa5ab]123 Tools.BuildStage('Build : libcfa(debug)', debug) {
[e507c11]124 // Build outside of the src tree to ease cleaning
125 dir (BuildDir) {
[14d5461]126 sh "make -j \$(nproc) --no-print-directory -C libcfa/${Settings.Architecture.name}-debug"
[e507c11]127 }
128 }
129
[91aa5ab]130 Tools.BuildStage('Build : libcfa(nodebug)', release) {
[e507c11]131 // Build outside of the src tree to ease cleaning
132 dir (BuildDir) {
[14d5461]133 sh "make -j \$(nproc) --no-print-directory -C libcfa/${Settings.Architecture.name}-nodebug"
[50f2cfc]134 }
[620dd2b]135 }
[aa96fba]136
[91aa5ab]137 Tools.BuildStage('Build : install', true) {
[aa96fba]138 // Build outside of the src tree to ease cleaning
139 dir (BuildDir) {
[14d5461]140 sh 'make -j $(nproc) --no-print-directory install'
[aa96fba]141 }
142 }
[95fdb0a]143}
[24eecab]144
[95fdb0a]145def test() {
[4c1b9ea8]146 try {
[1baf6ed]147 // Print potential limits before testing
148 // in case jenkins messes with them
[a33dcd5]149 sh 'free -h'
[1baf6ed]150 sh 'ulimit -a'
151
[91aa5ab]152 Tools.BuildStage('Test: short', !Settings.RunAllTests) {
[4c1b9ea8]153 dir (BuildDir) {
[3e93c00]154 //Run the tests from the tests directory
[4c51aca]155 sh "make --no-print-directory -C tests archiveerrors=${BuildDir}/tests/crashes/short"
[3e93c00]156 }
[4c1b9ea8]157 }
158
[91aa5ab]159 Tools.BuildStage('Test: full', Settings.RunAllTests) {
[4c1b9ea8]160 dir (BuildDir) {
[14d5461]161 jopt = '-j $(nproc)'
[7d84369]162 if( Settings.Architecture.node == 'x86' ) {
[14d5461]163 jopt = '-j2'
[7d84369]164 }
[4c1b9ea8]165 //Run the tests from the tests directory
[7d84369]166 sh """make ${jopt} --no-print-directory -C tests timeouts="--timeout=600 --global-timeout=14400" all-tests debug=yes archiveerrors=${BuildDir}/tests/crashes/full-debug"""
167 sh """make ${jopt} --no-print-directory -C tests timeouts="--timeout=600 --global-timeout=14400" all-tests debug=no archiveerrors=${BuildDir}/tests/crashes/full-nodebug"""
[143e6f3]168 }
[9beae23]169 }
[620dd2b]170 }
[4c1b9ea8]171 catch (Exception err) {
172 echo "Archiving core dumps"
[c95fdc9]173 dir (BuildDir) {
[cc9ec56]174 def exists = fileExists 'tests/crashes'
175 if( exists ) {
[cece53c]176 sh """${SrcDir}/tools/jenkins/archive-gen.sh"""
177 archiveArtifacts artifacts: "tests/crashes/**/*,lib/**/lib*.so*,setup.sh", fingerprint: true
178 }
[c95fdc9]179 }
[4c1b9ea8]180 throw err
181 }
[95fdb0a]182}
183
184def benchmark() {
[91aa5ab]185 Tools.BuildStage('Benchmark', Settings.RunBenchmark) {
[5b8413b4]186 dir (BuildDir) {
[0dc3ac3]187 //Append bench results
[c6f1f3e]188 sh "make --no-print-directory -C benchmark jenkins arch=${Settings.Architecture.name}"
[0dc3ac3]189 }
[620dd2b]190 }
[9beae23]191}
[efd60d67]192
[95fdb0a]193def build_doc() {
[91aa5ab]194 Tools.BuildStage('Documentation', Settings.BuildDocumentation) {
[9beae23]195 dir ('doc/user') {
196 make_doc()
197 }
198
199 dir ('doc/refrat') {
200 make_doc()
201 }
[620dd2b]202 }
[9beae23]203}
204
[95fdb0a]205def publish() {
[91aa5ab]206 Tools.BuildStage('Publish', true) {
[95fdb0a]207
[1b3eef8]208 if( Settings.Publish && !Settings.RunBenchmark ) { echo 'No results to publish!!!' }
[620dd2b]209 }
[95fdb0a]210}
211
[29f4fe62]212//===========================================================================================================
213//Routine responsible of sending the email notification once the build is completed
214//===========================================================================================================
[a336d46]215//Standard build email notification
[13c98a4]216def email(boolean log) {
[bd50205]217 node {
218 //Since tokenizer doesn't work, figure stuff out from the environnement variables and command line
219 //Configurations for email format
220 echo 'Notifying users of result'
221
222 def project_name = (env.JOB_NAME =~ /(.+)\/.+/)[0][1].toLowerCase()
223 def email_subject = "[${project_name} git][BUILD# ${env.BUILD_NUMBER} - ${currentBuild.result}] - branch ${env.BRANCH_NAME}"
224 def email_body = """<p>This is an automated email from the Jenkins build machine. It was
[1781e97]225generated because of a git hooks/post-receive script following
226a ref change which was pushed to the C\u2200 repository.</p>
[9824500]227
[1781e97]228<p>- Status --------------------------------------------------------------</p>
[9824500]229
[1781e97]230<p>BUILD# ${env.BUILD_NUMBER} - ${currentBuild.result}</p>
231<p>Check console output at ${env.BUILD_URL} to view the results.</p>
232""" + Tools.GitLogMessage()
[bd50205]233
234 def email_to = !Settings.IsSandbox ? "cforall@lists.uwaterloo.ca" : "tdelisle@uwaterloo.ca"
235
236 if( Settings && !Settings.Silent ) {
237 //send email notification
238 emailext body: email_body, subject: email_subject, to: email_to, attachLog: log
239 } else {
240 echo "Would send email to: ${email_to}"
241 echo "With title: ${email_subject}"
242 echo "Content: \n${email_body}"
243 }
[094a42c]244 }
[e8a22a7]245}
[5b8413b4]246
247//===========================================================================================================
248// Helper classes/variables/routines
249//===========================================================================================================
250//Description of a compiler (Must be serializable since pipelines are persistent)
251class CC_Desc implements Serializable {
[93fe3154]252 public String name
253 public String CXX
[6ebc13f]254 public String CC
[bf22bc6]255 public String lto
[93fe3154]256
[bf22bc6]257 CC_Desc(String name, String CXX, String CC, String lto) {
[93fe3154]258 this.name = name
259 this.CXX = CXX
[bf22bc6]260 this.CC = CC
261 this.lto = lto
[5b8413b4]262 }
263}
264
265//Description of an architecture (Must be serializable since pipelines are persistent)
266class Arch_Desc implements Serializable {
267 public String name
268 public String flags
[5307c33]269 public String node
[5b8413b4]270
[5307c33]271 Arch_Desc(String name, String flags, String node) {
[5b8413b4]272 this.name = name
273 this.flags = flags
[5307c33]274 this.node = node
[5b8413b4]275 }
276}
277
278class BuildSettings implements Serializable {
279 public final CC_Desc Compiler
280 public final Arch_Desc Architecture
281 public final Boolean RunAllTests
282 public final Boolean RunBenchmark
283 public final Boolean BuildDocumentation
284 public final Boolean Publish
285 public final Boolean Silent
286 public final Boolean IsSandbox
287 public final String DescLong
288 public final String DescShort
289
[a336d46]290 public String GitNewRef
291 public String GitOldRef
292
[490cb3c]293 BuildSettings(java.util.Collections$UnmodifiableMap param, String branch) {
[5b8413b4]294 switch( param.Compiler ) {
[8110bc3]295 case 'gcc-11':
296 this.Compiler = new CC_Desc('gcc-11', 'g++-11', 'gcc-11', '-flto=auto')
297 break
298 case 'gcc-10':
299 this.Compiler = new CC_Desc('gcc-10', 'g++-10', 'gcc-10', '-flto=auto')
300 break
[099f5bd]301 case 'gcc-9':
[bf22bc6]302 this.Compiler = new CC_Desc('gcc-9', 'g++-9', 'gcc-9', '-flto=auto')
[099f5bd]303 break
304 case 'gcc-8':
[bf22bc6]305 this.Compiler = new CC_Desc('gcc-8', 'g++-8', 'gcc-8', '-flto=auto')
[099f5bd]306 break
307 case 'gcc-7':
[bf22bc6]308 this.Compiler = new CC_Desc('gcc-7', 'g++-7', 'gcc-7', '-flto=auto')
[099f5bd]309 break
[5b8413b4]310 case 'gcc-6':
[bf22bc6]311 this.Compiler = new CC_Desc('gcc-6', 'g++-6', 'gcc-6', '-flto=auto')
[5b8413b4]312 break
313 case 'gcc-5':
[bf22bc6]314 this.Compiler = new CC_Desc('gcc-5', 'g++-5', 'gcc-5', '-flto=auto')
[5b8413b4]315 break
316 case 'gcc-4.9':
[bf22bc6]317 this.Compiler = new CC_Desc('gcc-4.9', 'g++-4.9', 'gcc-4.9', '-flto=auto')
[5b8413b4]318 break
319 case 'clang':
[8110bc3]320 this.Compiler = new CC_Desc('clang', 'clang++-10', 'gcc-10', '-flto=thin -flto-jobs=0')
[5b8413b4]321 break
322 default :
323 error "Unhandled compiler : ${cc}"
324 }
325
326 switch( param.Architecture ) {
327 case 'x64':
[a3e8281]328 this.Architecture = new Arch_Desc('x64', '--host=x86_64', 'x64')
[5b8413b4]329 break
330 case 'x86':
[a3e8281]331 this.Architecture = new Arch_Desc('x86', '--host=i386', 'x86')
[5b8413b4]332 break
333 default :
334 error "Unhandled architecture : ${arch}"
335 }
336
[f95e8f0]337 this.IsSandbox = (branch == "jenkins-sandbox")
[5b8413b4]338 this.RunAllTests = param.RunAllTests
[7a230fd]339 this.RunBenchmark = param.RunBenchmark
[5b8413b4]340 this.BuildDocumentation = param.BuildDocumentation
[7a230fd]341 this.Publish = param.Publish
[5b8413b4]342 this.Silent = param.Silent
343
344 def full = param.RunAllTests ? " (Full)" : ""
[490cb3c]345 this.DescShort = "${ this.Compiler.name }:${ this.Architecture.name }${full}"
[5b8413b4]346
[93fe3154]347 this.DescLong = """Compiler : ${ this.Compiler.name } (${ this.Compiler.CXX }/${ this.Compiler.CC })
[5b8413b4]348Architecture : ${ this.Architecture.name }
349Arc Flags : ${ this.Architecture.flags }
350Run All Tests : ${ this.RunAllTests.toString() }
351Run Benchmark : ${ this.RunBenchmark.toString() }
352Build Documentation : ${ this.BuildDocumentation.toString() }
353Publish : ${ this.Publish.toString() }
354Silent : ${ this.Silent.toString() }
355"""
[a336d46]356
357 this.GitNewRef = ''
358 this.GitOldRef = ''
[5b8413b4]359 }
360}
361
362def prepare_build() {
363 // prepare the properties
364 properties ([ \
[62f96ae]365 buildDiscarder(logRotator( \
366 artifactDaysToKeepStr: '', \
367 artifactNumToKeepStr: '', \
368 daysToKeepStr: '730', \
369 numToKeepStr: '1000' \
370 )), \
[5b8413b4]371 [$class: 'ParametersDefinitionProperty', \
372 parameterDefinitions: [ \
373 [$class: 'ChoiceParameterDefinition', \
374 description: 'Which compiler to use', \
375 name: 'Compiler', \
[b6f39aa]376 choices: 'gcc-11\ngcc-10\ngcc-9\ngcc-8\ngcc-7\ngcc-6\ngcc-5\ngcc-4.9\nclang', \
[fe27d99]377 defaultValue: 'gcc-8', \
[5b8413b4]378 ], \
379 [$class: 'ChoiceParameterDefinition', \
380 description: 'The target architecture', \
381 name: 'Architecture', \
382 choices: 'x64\nx86', \
383 defaultValue: 'x64', \
384 ], \
385 [$class: 'BooleanParameterDefinition', \
386 description: 'If false, only the quick test suite is ran', \
387 name: 'RunAllTests', \
388 defaultValue: false, \
[fe3d9ab]389 ], \
[5b8413b4]390 [$class: 'BooleanParameterDefinition', \
391 description: 'If true, jenkins also runs benchmarks', \
392 name: 'RunBenchmark', \
393 defaultValue: false, \
394 ], \
395 [$class: 'BooleanParameterDefinition', \
396 description: 'If true, jenkins also builds documentation', \
397 name: 'BuildDocumentation', \
398 defaultValue: true, \
399 ], \
400 [$class: 'BooleanParameterDefinition', \
401 description: 'If true, jenkins also publishes results', \
402 name: 'Publish', \
403 defaultValue: false, \
404 ], \
405 [$class: 'BooleanParameterDefinition', \
406 description: 'If true, jenkins will not send emails', \
407 name: 'Silent', \
408 defaultValue: false, \
409 ], \
410 ],
411 ]])
412
[bd8dca2]413 // It's unfortunate but it looks like we need to checkout the entire repo just to get
414 // - the pretty git printer
415 // - Jenkins.tools
[4c55047]416 checkout scm
[2407853]417
[1483a16]418 Tools = load "Jenkins/tools.groovy"
[bd8dca2]419
[490cb3c]420 final settings = new BuildSettings(params, env.BRANCH_NAME)
[5b8413b4]421
422 currentBuild.description = settings.DescShort
423 echo settings.DescLong
424
425 return settings
426}
427
428def make_doc() {
429 def err = null
430 try {
431 sh 'make clean > /dev/null'
432 sh 'make > /dev/null 2>&1'
433 }
434 catch (Exception caughtError) {
435 err = caughtError //rethrow error later
[65f4a51]436 sh 'cat build/*.log'
[5b8413b4]437 }
438 finally {
439 if (err) throw err // Must re-throw exception to propagate error
440 }
[a2a0065]441}
Note: See TracBrowser for help on using the repository browser.