source: Jenkinsfile @ 2407853

ADTaaron-thesisarm-ehast-experimentalcleanup-dtorsenumforall-pointer-decayjacob/cs343-translationjenkins-sandboxnew-astnew-ast-unique-exprno_listpersistent-indexerpthread-emulationqualifiedEnum
Last change on this file since 2407853 was 2407853, checked in by Thierry Delisle <tdelisle@…>, 5 years ago

This is probably going to break but I'm not sure how

  • Property mode set to 100644
File size: 11.5 KB
RevLine 
[a63ad80]1#!groovy
2
[29f4fe62]3//===========================================================================================================
[9beae23]4// Main loop of the compilation
[29f4fe62]5//===========================================================================================================
[56a9ce6]6
[5307c33]7node('master') {
[5b8413b4]8        // Globals
[bf9d323]9        BuildDir  = null
10        SrcDir    = null
[5b8413b4]11        Settings  = null
12        StageName = ''
13
14        // Local variables
[9beae23]15        def err = null
16        def log_needed = false
[0ef06b6]17
18        currentBuild.result = "SUCCESS"
19
[9beae23]20        try {
[95fdb0a]21                //Wrap build to add timestamp to command line
22                wrap([$class: 'TimestamperBuildWrapper']) {
[23a14d86]23
[8c700c1]24                        notify_server(0)
[95fdb0a]25
[c431138]26                        Settings = prepare_build()
[7aebc62]27
[5307c33]28                        node(Settings.Architecture.node) {
[bf9d323]29                                BuildDir  = pwd tmp: true
30                                SrcDir    = pwd tmp: false
31
[5307c33]32                                clean()
[0dc3ac3]33
[5307c33]34                                checkout()
[fde808df]35
[5307c33]36                                notify_server(0)
[8c700c1]37
[5307c33]38                                build()
[95fdb0a]39
[5307c33]40                                test()
[95fdb0a]41
[5307c33]42                                benchmark()
[95fdb0a]43
[5307c33]44                                build_doc()
[7359098]45
[5307c33]46                                publish()
47                        }
[9beae23]48
[65f9dec]49                        notify_server(45)
[9beae23]50                }
[738cf8f]51        }
52
[9beae23]53        //If an exception is caught we need to change the status and remember to
54        //attach the build log to the email
[738cf8f]55        catch (Exception caughtError) {
56                //rethrow error later
57                err = caughtError
58
[e966ec0]59                echo err.toString()
60
[9beae23]61                //An error has occured, the build log is relevent
62                log_needed = true
63
64                //Store the result of the build log
[5b8413b4]65                currentBuild.result = "${StageName} FAILURE".trim()
[738cf8f]66        }
67
68        finally {
[9beae23]69                //Send email with final results if this is not a full build
[e966ec0]70                if( Settings && !Settings.Silent ) {
[e57ebb5]71                        email(log_needed, Settings.IsSandbox)
[9beae23]72                }
73
[734891d]74                echo 'Build Completed'
75
[738cf8f]76                /* Must re-throw exception to propagate error */
77                if (err) {
78                        throw err
79                }
80        }
81}
[29f4fe62]82//===========================================================================================================
[9beae23]83// Main compilation routines
[29f4fe62]84//===========================================================================================================
[0dc3ac3]85def clean() {
86        build_stage('Cleanup') {
87                // clean the build by wipping the build directory
[5b8413b4]88                dir(BuildDir) {
[d4cd491]89                        deleteDir()
[ece8a80]90                }
[620dd2b]91        }
[95fdb0a]92}
[29f4fe62]93
[0dc3ac3]94//Compilation script is done here but environnement set-up and error handling is done in main loop
95def checkout() {
96        build_stage('Checkout') {
97                //checkout the source code and clean the repo
[a336d46]98                final scmVars = checkout scm
99                Settings.GitNewRef = scmVars.GIT_COMMIT
100                Settings.GitOldRef = scmVars.GIT_PREVIOUS_COMMIT
[d3a4564a]101
[a336d46]102                echo GitLogMessage()
[0dc3ac3]103        }
104}
105
[95fdb0a]106def build() {
[620dd2b]107        build_stage('Build') {
[50f2cfc]108                // Build outside of the src tree to ease cleaning
[5b8413b4]109                dir (BuildDir) {
[50f2cfc]110                        //Configure the conpilation (Output is not relevant)
111                        //Use the current directory as the installation target so nothing escapes the sandbox
112                        //Also specify the compiler by hand
[3fc5f010]113                        targets=""
[5afeab9]114                        if( Settings.RunAllTests ) {
[6bde81d]115                                targets="--with-target-hosts='host:debug,host:nodebug'"
[3fc5f010]116                        } else {
[6bde81d]117                                targets="--with-target-hosts='host:debug'"
[3fc5f010]118                        }
119
[93fe3154]120                        sh "${SrcDir}/configure CXX=${Settings.Compiler.CXX} CC=${Settings.Compiler.CC} ${Settings.Architecture.flags} ${targets} --quiet"
[1752d0e]121
[50f2cfc]122                        //Compile the project
123                        sh 'make -j 8 --no-print-directory'
124                }
[620dd2b]125        }
[95fdb0a]126}
[24eecab]127
[95fdb0a]128def test() {
[620dd2b]129        build_stage('Test') {
[9e5f409]130
[5b8413b4]131                dir (BuildDir) {
[0dc3ac3]132                        //Run the tests from the tests directory
[5afeab9]133                        if ( Settings.RunAllTests ) {
[b90aace]134                                sh 'make --no-print-directory -C tests timeouts="--timeout=600" all-tests debug=yes'
135                                sh 'make --no-print-directory -C tests timeouts="--timeout=600" all-tests debug=no '
[0dc3ac3]136                        }
137                        else {
[7428ad9]138                                sh 'make --no-print-directory -C tests'
[0dc3ac3]139                        }
[9beae23]140                }
[620dd2b]141        }
[95fdb0a]142}
143
144def benchmark() {
[620dd2b]145        build_stage('Benchmark') {
[29f4fe62]146
[5afeab9]147                if( !Settings.RunBenchmark ) return
[ae28ee2]148
[5b8413b4]149                dir (BuildDir) {
[0dc3ac3]150                        //Append bench results
[7a927ed0]151                        sh "make --no-print-directory -C benchmark jenkins githash=${Settings.GitNewRef} arch=${Settings.Architecture} | tee ${SrcDir}/bench.json"
[0dc3ac3]152                }
[620dd2b]153        }
[9beae23]154}
[efd60d67]155
[95fdb0a]156def build_doc() {
[620dd2b]157        build_stage('Documentation') {
[9beae23]158
[5afeab9]159                if( !Settings.BuildDocumentation ) return
[9beae23]160
161                dir ('doc/user') {
162                        make_doc()
163                }
164
165                dir ('doc/refrat') {
166                        make_doc()
167                }
[620dd2b]168        }
[9beae23]169}
170
[95fdb0a]171def publish() {
[620dd2b]172        build_stage('Publish') {
[95fdb0a]173
[5afeab9]174                if( !Settings.Publish ) return
[95fdb0a]175
176                //Then publish the results
[50f2cfc]177                sh 'curl --silent --show-error -H \'Content-Type: application/json\' --data @bench.json https://cforall.uwaterloo.ca:8082/jenkins/publish > /dev/null || true'
[620dd2b]178        }
[95fdb0a]179}
180
[29f4fe62]181//===========================================================================================================
182//Routine responsible of sending the email notification once the build is completed
183//===========================================================================================================
[a336d46]184def GitLogMessage() {
185        if (!Settings || !Settings.GitOldRef || !Settings.GitNewRef) return "\nERROR retrieveing git information!\n"
[e8a22a7]186
[9f5bb817]187        sh "${SrcDir}/tools/PrettyGitLogs.sh ${SrcDir} ${BuildDir} ${Settings.GitOldRef} ${Settings.GitNewRef}"
[6e31c43]188
[eda8175]189        def gitUpdate = readFile("${BuildDir}/GIT_UPDATE")
190        def gitLog    = readFile("${BuildDir}/GIT_LOG")
191        def gitDiff   = readFile("${BuildDir}/GIT_DIFF")
[7a927ed0]192
[a336d46]193        return """
[848fb00]194The branch ${env.BRANCH_NAME} has been updated.
[7a927ed0]195${gitUpdate}
[7b1a604]196
197Check console output at ${env.BUILD_URL} to view the results.
198
199- Status --------------------------------------------------------------
200
[e57ebb5]201BUILD# ${env.BUILD_NUMBER} - ${currentBuild.result}
[e8a22a7]202
[7b1a604]203- Log -----------------------------------------------------------------
[7a927ed0]204${gitLog}
[7b1a604]205-----------------------------------------------------------------------
206Summary of changes:
[7a927ed0]207${gitDiff}
[7b1a604]208"""
[a336d46]209}
210
211//Standard build email notification
212def email(boolean log, boolean bIsSandbox) {
213        //Since tokenizer doesn't work, figure stuff out from the environnement variables and command line
214        //Configurations for email format
215        echo 'Notifying users of result'
216
217        def project_name = (env.JOB_NAME =~ /(.+)\/.+/)[0][1].toLowerCase()
218        def email_subject = "[${project_name} git][BUILD# ${env.BUILD_NUMBER} - ${currentBuild.result}] - branch ${env.BRANCH_NAME}"
219        def email_body = """This is an automated email from the Jenkins build machine. It was
220generated because of a git hooks/post-receive script following
221a ref change which was pushed to the Cforall repository.
222""" + GitLogMessage()
[e8a22a7]223
[e39647e]224        def email_to = "cforall@lists.uwaterloo.ca"
[e8a22a7]225
[e0549dba]226        if( Settings && !Settings.IsSandbox ) {
[094a42c]227                //send email notification
228                emailext body: email_body, subject: email_subject, to: email_to, attachLog: log
229        } else {
230                echo "Would send email to: ${email_to}"
231                echo "With title: ${email_subject}"
232                echo "Content: \n${email_body}"
233        }
[e8a22a7]234}
[5b8413b4]235
236//===========================================================================================================
237// Helper classes/variables/routines
238//===========================================================================================================
239//Description of a compiler (Must be serializable since pipelines are persistent)
240class CC_Desc implements Serializable {
[93fe3154]241        public String name
242        public String CXX
[6ebc13f]243        public String CC
[93fe3154]244
[6ebc13f]245        CC_Desc(String name, String CXX, String CC) {
[93fe3154]246                this.name = name
247                this.CXX = CXX
[6ebc13f]248                this.CC = CC
[5b8413b4]249        }
250}
251
252//Description of an architecture (Must be serializable since pipelines are persistent)
253class Arch_Desc implements Serializable {
254        public String name
255        public String flags
[5307c33]256        public String node
[5b8413b4]257
[5307c33]258        Arch_Desc(String name, String flags, String node) {
[5b8413b4]259                this.name  = name
260                this.flags = flags
[5307c33]261                this.node  = node
[5b8413b4]262        }
263}
264
265class BuildSettings implements Serializable {
266        public final CC_Desc Compiler
267        public final Arch_Desc Architecture
268        public final Boolean RunAllTests
269        public final Boolean RunBenchmark
270        public final Boolean BuildDocumentation
271        public final Boolean Publish
272        public final Boolean Silent
273        public final Boolean IsSandbox
274        public final String DescLong
275        public final String DescShort
276
[a336d46]277        public String GitNewRef
278        public String GitOldRef
279
[5b8413b4]280        BuildSettings(java.util.Collections$UnmodifiableMap param, String branch) {
281                switch( param.Compiler ) {
282                        case 'gcc-6':
283                                this.Compiler = new CC_Desc('gcc-6', 'g++-6', 'gcc-6')
284                        break
285                        case 'gcc-5':
286                                this.Compiler = new CC_Desc('gcc-5', 'g++-5', 'gcc-5')
287                        break
288                        case 'gcc-4.9':
289                                this.Compiler = new CC_Desc('gcc-4.9', 'g++-4.9', 'gcc-4.9')
290                        break
291                        case 'clang':
292                                this.Compiler = new CC_Desc('clang', 'clang++', 'gcc-6')
293                        break
294                        default :
295                                error "Unhandled compiler : ${cc}"
296                }
297
298                switch( param.Architecture ) {
299                        case 'x64':
[a3e8281]300                                this.Architecture = new Arch_Desc('x64', '--host=x86_64', 'x64')
[5b8413b4]301                        break
302                        case 'x86':
[a3e8281]303                                this.Architecture = new Arch_Desc('x86', '--host=i386', 'x86')
[5b8413b4]304                        break
305                        default :
306                                error "Unhandled architecture : ${arch}"
307                }
308
309                this.RunAllTests        = param.RunAllTests
310                this.RunBenchmark       = param.RunBenchmark
311                this.BuildDocumentation = param.BuildDocumentation
312                this.Publish            = param.Publish
313                this.Silent             = param.Silent
314                this.IsSandbox          = (branch == "jenkins-sandbox")
315
316                def full = param.RunAllTests ? " (Full)" : ""
[93fe3154]317                this.DescShort = "${ this.Compiler.name }:${ this.Architecture.name }${full}"
[5b8413b4]318
[93fe3154]319                this.DescLong = """Compiler              : ${ this.Compiler.name } (${ this.Compiler.CXX }/${ this.Compiler.CC })
[5b8413b4]320Architecture            : ${ this.Architecture.name }
321Arc Flags               : ${ this.Architecture.flags }
322Run All Tests           : ${ this.RunAllTests.toString() }
323Run Benchmark           : ${ this.RunBenchmark.toString() }
324Build Documentation     : ${ this.BuildDocumentation.toString() }
325Publish                 : ${ this.Publish.toString() }
326Silent                  : ${ this.Silent.toString() }
327"""
[a336d46]328
329                this.GitNewRef = ''
330                this.GitOldRef = ''
[5b8413b4]331        }
332}
333
334def prepare_build() {
335        // prepare the properties
336        properties ([                                                                                                   \
337                [$class: 'ParametersDefinitionProperty',                                                                \
338                        parameterDefinitions: [                                                                         \
339                                [$class: 'ChoiceParameterDefinition',                                           \
340                                        description: 'Which compiler to use',                                   \
341                                        name: 'Compiler',                                                                       \
342                                        choices: 'gcc-6\ngcc-5\ngcc-4.9\nclang',                                        \
343                                        defaultValue: 'gcc-6',                                                          \
344                                ],                                                                                              \
345                                [$class: 'ChoiceParameterDefinition',                                           \
346                                        description: 'The target architecture',                                 \
347                                        name: 'Architecture',                                                           \
348                                        choices: 'x64\nx86',                                                            \
349                                        defaultValue: 'x64',                                                            \
350                                ],                                                                                              \
351                                [$class: 'BooleanParameterDefinition',                                                  \
352                                        description: 'If false, only the quick test suite is ran',              \
353                                        name: 'RunAllTests',                                                            \
354                                        defaultValue: false,                                                            \
355                                ],                                                                                              \
356                                [$class: 'BooleanParameterDefinition',                                                  \
357                                        description: 'If true, jenkins also runs benchmarks',           \
358                                        name: 'RunBenchmark',                                                           \
359                                        defaultValue: false,                                                            \
360                                ],                                                                                              \
361                                [$class: 'BooleanParameterDefinition',                                                  \
362                                        description: 'If true, jenkins also builds documentation',              \
363                                        name: 'BuildDocumentation',                                                     \
364                                        defaultValue: true,                                                             \
365                                ],                                                                                              \
366                                [$class: 'BooleanParameterDefinition',                                                  \
367                                        description: 'If true, jenkins also publishes results',                 \
368                                        name: 'Publish',                                                                        \
369                                        defaultValue: false,                                                            \
370                                ],                                                                                              \
371                                [$class: 'BooleanParameterDefinition',                                                  \
372                                        description: 'If true, jenkins will not send emails',           \
373                                        name: 'Silent',                                                                         \
374                                        defaultValue: false,                                                            \
375                                ],                                                                                              \
376                        ],
377                ]])
378
[2407853]379        load "${SrcDir}/tools/PrettyGitLogs.sh"
380
[5b8413b4]381        final settings = new BuildSettings(params, env.BRANCH_NAME)
382
383        currentBuild.description = settings.DescShort
384        echo                       settings.DescLong
385
386        return settings
387}
388
389def build_stage(String name, Closure block ) {
390        StageName = name
391        echo " -------- ${StageName} -------- "
[939fd39]392        stage(name, block)
[5b8413b4]393}
394
395def notify_server(int wait) {
396        sh """curl --silent --show-error --data "wait=${wait}" -X POST https://cforall.uwaterloo.ca:8082/jenkins/notify > /dev/null || true"""
397        return
398}
399
400def make_doc() {
401        def err = null
402        try {
403                sh 'make clean > /dev/null'
404                sh 'make > /dev/null 2>&1'
405        }
406        catch (Exception caughtError) {
407                err = caughtError //rethrow error later
408                sh 'cat *.log'
409        }
410        finally {
411                if (err) throw err // Must re-throw exception to propagate error
412        }
413}
Note: See TracBrowser for help on using the repository browser.