source: Jenkinsfile @ b0ceb72

ADTast-experimentalpthread-emulation
Last change on this file since b0ceb72 was 6b00c53, checked in by Thierry Delisle <tdelisle@…>, 2 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.