source: Jenkinsfile_disabled@ 90ce35aa

ADT arm-eh ast-experimental enum forall-pointer-decay jacob/cs343-translation new-ast new-ast-unique-expr pthread-emulation qualifiedEnum
Last change on this file since 90ce35aa was 4a60488, checked in by Andrew Beach <ajbeach@…>, 6 years ago

Merged from master taking the lvalue changes to expression and everything before that.

  • Property mode set to 100644
File size: 14.9 KB
Line 
1#!groovy
2
3import groovy.transform.Field
4
5// For skipping stages
6import org.jenkinsci.plugins.pipeline.modeldefinition.Utils
7
8//===========================================================================================================
9// Main loop of the compilation
10//===========================================================================================================
11
12node('master') {
13 // Globals
14 BuildDir = pwd tmp: true
15 SrcDir = pwd tmp: false
16 Settings = null
17 StageName = ''
18
19 // Local variables
20 def err = null
21 def log_needed = false
22
23 currentBuild.result = "SUCCESS"
24
25 try {
26 //Wrap build to add timestamp to command line
27 wrap([$class: 'TimestamperBuildWrapper']) {
28
29 Settings = prepare_build()
30
31 node(Settings.Architecture.node) {
32 BuildDir = pwd tmp: true
33 SrcDir = pwd tmp: false
34
35 clean()
36
37 checkout()
38
39 build()
40
41 test()
42
43 benchmark()
44
45 build_doc()
46
47 publish()
48 }
49
50 // Update the build directories when exiting the node
51 BuildDir = pwd tmp: true
52 SrcDir = pwd tmp: false
53 }
54 }
55
56 //If an exception is caught we need to change the status and remember to
57 //attach the build log to the email
58 catch (Exception caughtError) {
59 //rethrow error later
60 err = caughtError
61
62 echo err.toString()
63
64 //An error has occured, the build log is relevent
65 log_needed = true
66
67 //Store the result of the build log
68 currentBuild.result = "${StageName} FAILURE".trim()
69 }
70
71 finally {
72 //Send email with final results if this is not a full build
73 email(log_needed)
74
75 echo 'Build Completed'
76
77 /* Must re-throw exception to propagate error */
78 if (err) {
79 throw err
80 }
81 }
82}
83//===========================================================================================================
84// Main compilation routines
85//===========================================================================================================
86def clean() {
87 build_stage('Cleanup', true) {
88 // clean the build by wipping the build directory
89 dir(BuildDir) {
90 deleteDir()
91 }
92 }
93}
94
95//Compilation script is done here but environnement set-up and error handling is done in main loop
96def checkout() {
97 build_stage('Checkout', true) {
98 //checkout the source code and clean the repo
99 final scmVars = checkout scm
100 Settings.GitNewRef = scmVars.GIT_COMMIT
101 Settings.GitOldRef = scmVars.GIT_PREVIOUS_COMMIT
102
103 echo GitLogMessage()
104 }
105}
106
107def build() {
108 debug = true
109 release = Settings.RunAllTests || Settings.RunBenchmark
110 build_stage('Build : configure', true) {
111 // Build outside of the src tree to ease cleaning
112 dir (BuildDir) {
113 //Configure the conpilation (Output is not relevant)
114 //Use the current directory as the installation target so nothing escapes the sandbox
115 //Also specify the compiler by hand
116 targets=""
117 if( Settings.RunAllTests || Settings.RunBenchmark ) {
118 targets="--with-target-hosts='host:debug,host:nodebug'"
119 } else {
120 targets="--with-target-hosts='host:debug'"
121 }
122
123 sh "${SrcDir}/configure CXX=${Settings.Compiler.CXX} CC=${Settings.Compiler.CC} ${Settings.Architecture.flags} ${targets} --quiet"
124
125 // Configure libcfa
126 sh 'make -j 8 --no-print-directory configure-libcfa'
127 }
128 }
129
130 build_stage('Build : cfa-cpp', true) {
131 // Build outside of the src tree to ease cleaning
132 dir (BuildDir) {
133 // Build driver
134 sh 'make -j 8 --no-print-directory -C driver'
135
136 // Build translator
137 sh 'make -j 8 --no-print-directory -C src'
138 }
139 }
140
141 build_stage('Build : libcfa(debug)', debug) {
142 // Build outside of the src tree to ease cleaning
143 dir (BuildDir) {
144 sh "make -j 8 --no-print-directory -C libcfa/${Settings.Architecture.name}-debug"
145 }
146 }
147
148 build_stage('Build : libcfa(nodebug)', release) {
149 // Build outside of the src tree to ease cleaning
150 dir (BuildDir) {
151 sh "make -j 8 --no-print-directory -C libcfa/${Settings.Architecture.name}-nodebug"
152 }
153 }
154}
155
156def test() {
157 try {
158 build_stage('Test: short', !Settings.RunAllTests) {
159 dir (BuildDir) {
160 //Run the tests from the tests directory
161 sh "make --no-print-directory -C tests archiveerrors=${BuildDir}/tests/crashes/short"
162 }
163 }
164
165 build_stage('Test: full', Settings.RunAllTests) {
166 dir (BuildDir) {
167 //Run the tests from the tests directory
168 sh """make --no-print-directory -C tests timeouts="--timeout=600 --global-timeout=14400" all-tests debug=yes archiveerrors=${BuildDir}/tests/crashes/full-debug"""
169 sh """make --no-print-directory -C tests timeouts="--timeout=600 --global-timeout=14400" all-tests debug=no archiveerrors=${BuildDir}/tests/crashes/full-nodebug"""
170 }
171 }
172 }
173 catch (Exception err) {
174 echo "Archiving core dumps"
175 dir (BuildDir) {
176 archiveArtifacts artifacts: "tests/crashes/**/*", fingerprint: true
177 }
178 throw err
179 }
180}
181
182def benchmark() {
183 build_stage('Benchmark', Settings.RunBenchmark) {
184 dir (BuildDir) {
185 //Append bench results
186 sh "make --no-print-directory -C benchmark jenkins arch=${Settings.Architecture.name}"
187 }
188 }
189}
190
191def build_doc() {
192 build_stage('Documentation', Settings.BuildDocumentation) {
193 dir ('doc/user') {
194 make_doc()
195 }
196
197 dir ('doc/refrat') {
198 make_doc()
199 }
200 }
201}
202
203def publish() {
204 build_stage('Publish', true) {
205
206 if( Settings.Publish && !Settings.RunBenchmark ) { echo 'No results to publish!!!' }
207
208 def groupCompile = new PlotGroup('Compilation', 'duration (s) - lower is better', true)
209 def groupConcurrency = new PlotGroup('Concurrency', 'duration (n) - lower is better', false)
210
211 //Then publish the results
212 do_plot(Settings.RunBenchmark && Settings.Publish, 'compile' , groupCompile , false, 'Compilation')
213 do_plot(Settings.RunBenchmark && Settings.Publish, 'compile.diff' , groupCompile , true , 'Compilation (relative)')
214 do_plot(Settings.RunBenchmark && Settings.Publish, 'ctxswitch' , groupConcurrency, false, 'Context Switching')
215 do_plot(Settings.RunBenchmark && Settings.Publish, 'ctxswitch.diff', groupConcurrency, true , 'Context Switching (relative)')
216 do_plot(Settings.RunBenchmark && Settings.Publish, 'mutex' , groupConcurrency, false, 'Mutual Exclusion')
217 do_plot(Settings.RunBenchmark && Settings.Publish, 'mutex.diff' , groupConcurrency, true , 'Mutual Exclusion (relative)')
218 do_plot(Settings.RunBenchmark && Settings.Publish, 'signal' , groupConcurrency, false, 'Internal and External Scheduling')
219 do_plot(Settings.RunBenchmark && Settings.Publish, 'signal.diff' , groupConcurrency, true , 'Internal and External Scheduling (relative)')
220 }
221}
222
223//===========================================================================================================
224//Routine responsible of sending the email notification once the build is completed
225//===========================================================================================================
226def GitLogMessage() {
227 if (!Settings || !Settings.GitOldRef || !Settings.GitNewRef) return "\nERROR retrieveing git information!\n"
228
229 sh "${SrcDir}/tools/PrettyGitLogs.sh ${SrcDir} ${BuildDir} ${Settings.GitOldRef} ${Settings.GitNewRef}"
230
231 def gitUpdate = readFile("${BuildDir}/GIT_UPDATE")
232 def gitLog = readFile("${BuildDir}/GIT_LOG")
233 def gitDiff = readFile("${BuildDir}/GIT_DIFF")
234
235 return """
236<pre>
237The branch ${env.BRANCH_NAME} has been updated.
238${gitUpdate}
239</pre>
240
241<p>Check console output at ${env.BUILD_URL} to view the results.</p>
242
243<p>- Status --------------------------------------------------------------</p>
244
245<p>BUILD# ${env.BUILD_NUMBER} - ${currentBuild.result}</p>
246
247<p>- Log -----------------------------------------------------------------</p>
248
249<pre>
250${gitLog}
251</pre>
252
253<p>-----------------------------------------------------------------------</p>
254<pre>
255Summary of changes:
256${gitDiff}
257</pre>
258"""
259}
260
261//Standard build email notification
262def email(boolean log) {
263 //Since tokenizer doesn't work, figure stuff out from the environnement variables and command line
264 //Configurations for email format
265 echo 'Notifying users of result'
266
267 def project_name = (env.JOB_NAME =~ /(.+)\/.+/)[0][1].toLowerCase()
268 def email_subject = "[${project_name} git][BUILD# ${env.BUILD_NUMBER} - ${currentBuild.result}] - branch ${env.BRANCH_NAME}"
269 def email_body = """<p>This is an automated email from the Jenkins build machine. It was
270generated because of a git hooks/post-receive script following
271a ref change which was pushed to the C\u2200 repository.</p>
272""" + GitLogMessage()
273
274 def email_to = !Settings.IsSandbox ? "cforall@lists.uwaterloo.ca" : "tdelisle@uwaterloo.ca"
275
276 if( Settings && !Settings.Silent ) {
277 //send email notification
278 emailext body: email_body, subject: email_subject, to: email_to, attachLog: log
279 } else {
280 echo "Would send email to: ${email_to}"
281 echo "With title: ${email_subject}"
282 echo "Content: \n${email_body}"
283 }
284}
285
286//===========================================================================================================
287// Helper classes/variables/routines
288//===========================================================================================================
289//Description of a compiler (Must be serializable since pipelines are persistent)
290class CC_Desc implements Serializable {
291 public String name
292 public String CXX
293 public String CC
294
295 CC_Desc(String name, String CXX, String CC) {
296 this.name = name
297 this.CXX = CXX
298 this.CC = CC
299 }
300}
301
302//Description of an architecture (Must be serializable since pipelines are persistent)
303class Arch_Desc implements Serializable {
304 public String name
305 public String flags
306 public String node
307
308 Arch_Desc(String name, String flags, String node) {
309 this.name = name
310 this.flags = flags
311 this.node = node
312 }
313}
314
315class BuildSettings implements Serializable {
316 public final CC_Desc Compiler
317 public final Arch_Desc Architecture
318 public final Boolean RunAllTests
319 public final Boolean RunBenchmark
320 public final Boolean BuildDocumentation
321 public final Boolean Publish
322 public final Boolean Silent
323 public final Boolean IsSandbox
324 public final String DescLong
325 public final String DescShort
326
327 public String GitNewRef
328 public String GitOldRef
329
330 BuildSettings(java.util.Collections$UnmodifiableMap param, String branch) {
331 switch( param.Compiler ) {
332 case 'gcc-6':
333 this.Compiler = new CC_Desc('gcc-6', 'g++-6', 'gcc-6')
334 break
335 case 'gcc-5':
336 this.Compiler = new CC_Desc('gcc-5', 'g++-5', 'gcc-5')
337 break
338 case 'gcc-4.9':
339 this.Compiler = new CC_Desc('gcc-4.9', 'g++-4.9', 'gcc-4.9')
340 break
341 case 'clang':
342 this.Compiler = new CC_Desc('clang', 'clang++', 'gcc-6')
343 break
344 default :
345 error "Unhandled compiler : ${cc}"
346 }
347
348 switch( param.Architecture ) {
349 case 'x64':
350 this.Architecture = new Arch_Desc('x64', '--host=x86_64', 'x64')
351 break
352 case 'x86':
353 this.Architecture = new Arch_Desc('x86', '--host=i386', 'x86')
354 break
355 default :
356 error "Unhandled architecture : ${arch}"
357 }
358
359 this.IsSandbox = (branch == "jenkins-sandbox")
360 this.RunAllTests = param.RunAllTests
361 this.RunBenchmark = param.RunBenchmark
362 this.BuildDocumentation = param.BuildDocumentation
363 this.Publish = param.Publish
364 this.Silent = param.Silent
365
366 def full = param.RunAllTests ? " (Full)" : ""
367 this.DescShort = "${ this.Compiler.name }:${ this.Architecture.name }${full}"
368
369 this.DescLong = """Compiler : ${ this.Compiler.name } (${ this.Compiler.CXX }/${ this.Compiler.CC })
370Architecture : ${ this.Architecture.name }
371Arc Flags : ${ this.Architecture.flags }
372Run All Tests : ${ this.RunAllTests.toString() }
373Run Benchmark : ${ this.RunBenchmark.toString() }
374Build Documentation : ${ this.BuildDocumentation.toString() }
375Publish : ${ this.Publish.toString() }
376Silent : ${ this.Silent.toString() }
377"""
378
379 this.GitNewRef = ''
380 this.GitOldRef = ''
381 }
382}
383
384class PlotGroup implements Serializable {
385 public String name
386 public String unit
387 public boolean log
388
389 PlotGroup(String name, String unit, boolean log) {
390 this.name = name
391 this.unit = unit
392 this.log = log
393 }
394}
395
396def prepare_build() {
397 // prepare the properties
398 properties ([ \
399 [$class: 'ParametersDefinitionProperty', \
400 parameterDefinitions: [ \
401 [$class: 'ChoiceParameterDefinition', \
402 description: 'Which compiler to use', \
403 name: 'Compiler', \
404 choices: 'gcc-6\ngcc-5\ngcc-4.9\nclang', \
405 defaultValue: 'gcc-6', \
406 ], \
407 [$class: 'ChoiceParameterDefinition', \
408 description: 'The target architecture', \
409 name: 'Architecture', \
410 choices: 'x64\nx86', \
411 defaultValue: 'x64', \
412 ], \
413 [$class: 'BooleanParameterDefinition', \
414 description: 'If false, only the quick test suite is ran', \
415 name: 'RunAllTests', \
416 defaultValue: false, \
417 ], \
418 [$class: 'BooleanParameterDefinition', \
419 description: 'If true, jenkins also runs benchmarks', \
420 name: 'RunBenchmark', \
421 defaultValue: false, \
422 ], \
423 [$class: 'BooleanParameterDefinition', \
424 description: 'If true, jenkins also builds documentation', \
425 name: 'BuildDocumentation', \
426 defaultValue: true, \
427 ], \
428 [$class: 'BooleanParameterDefinition', \
429 description: 'If true, jenkins also publishes results', \
430 name: 'Publish', \
431 defaultValue: false, \
432 ], \
433 [$class: 'BooleanParameterDefinition', \
434 description: 'If true, jenkins will not send emails', \
435 name: 'Silent', \
436 defaultValue: false, \
437 ], \
438 ],
439 ]])
440
441 // It's unfortunate but it looks like we need to checkout the entire repo just to get the pretty git printer
442 checkout scm
443
444 final settings = new BuildSettings(params, env.BRANCH_NAME)
445
446 currentBuild.description = settings.DescShort
447 echo settings.DescLong
448
449 return settings
450}
451
452def build_stage(String name, boolean run, Closure block ) {
453 StageName = name
454 echo " -------- ${StageName} -------- "
455 if(run) {
456 stage(name, block)
457 } else {
458 stage(name) { Utils.markStageSkippedForConditional(STAGE_NAME) }
459 }
460}
461
462def make_doc() {
463 def err = null
464 try {
465 sh 'make clean > /dev/null'
466 sh 'make > /dev/null 2>&1'
467 }
468 catch (Exception caughtError) {
469 err = caughtError //rethrow error later
470 sh 'cat build/*.log'
471 }
472 finally {
473 if (err) throw err // Must re-throw exception to propagate error
474 }
475}
476
477def do_plot(boolean new_data, String file, PlotGroup group, boolean relative, String title) {
478
479 if(new_data) {
480 echo "Publishing new data"
481 }
482
483 def series = new_data ? [[
484 file: "${file}.csv",
485 exclusionValues: '',
486 displayTableFlag: false,
487 inclusionFlag: 'OFF',
488 url: ''
489 ]] : [];
490
491 echo "file is ${BuildDir}/benchmark/${file}.csv, group ${group}, title ${title}"
492 dir("${BuildDir}/benchmark/") {
493 plot csvFileName: "cforall-${env.BRANCH_NAME}-${file}.csv",
494 csvSeries: series,
495 group: "${group.name}",
496 title: "${title}",
497 style: 'lineSimple',
498 exclZero: false,
499 keepRecords: false,
500 logarithmic: !relative && group.log,
501 numBuilds: '120',
502 useDescr: true,
503 yaxis: group.unit,
504 yaxisMaximum: '',
505 yaxisMinimum: ''
506 }
507}
Note: See TracBrowser for help on using the repository browser.