Changeset f80e0218 for Jenkinsfile
- Timestamp:
- Jun 30, 2016, 4:32:56 PM (10 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, ctor, deferred_resn, demangler, enum, forall-pointer-decay, gc_noraii, jacob/cs343-translation, jenkins-sandbox, master, memory, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
- Children:
- ea29e73
- Parents:
- 1b5c81ed (diff), 84d4d6f (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)links above to see all the changes relative to each parent. - File:
-
- 1 edited
-
Jenkinsfile (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
Jenkinsfile
r1b5c81ed rf80e0218 1 node ('linux'){ 2 stage 'Build' 3 checkout scm //checkout the source code from source control 4 sh 'CC=gcc-4.9 CXX=g++-4.9 ./configure' 5 sh 'make -j 8' 6 } 1 #!groovy 2 3 //=========================================================================================================== 4 // Main compilation routine 5 //=========================================================================================================== 6 //Compilation script is done here but environnement set-up and error handling is done in main loop 7 def cfa_build(boolean full_build) { 8 build_stage 'Checkout' 9 def install_dir = pwd tmp: true 10 //checkout the source code and clean the repo 11 checkout scm 12 13 //Clean all temporary files to make sure no artifacts of the previous build remain 14 sh 'git clean -fdqx' 15 16 //Reset the git repo so no local changes persist 17 sh 'git reset --hard' 18 19 build_stage 'Build' 20 21 //Configure the conpilation (Output is not relevant) 22 //Use the current directory as the installation target so nothing 23 //escapes the sandbox 24 //Also specify the compiler by hand 25 sh "./configure CXX=${currentCC.cpp_cc} --with-backend-compiler=${currentCC.cfa_backend_cc} --prefix=${install_dir} --enable-silent-rules --quiet" 26 27 //Compile the project 28 sh 'make -j 8 --no-print-directory V=0 install' 29 30 build_stage 'Test' 31 32 //Run the tests from the tests directory 33 dir ('src/tests') { 34 if (full_build) { 35 sh 'make all-tests' 36 } 37 else { 38 sh 'make' 39 } 40 } 41 42 build_stage 'Cleanup' 43 44 //do a maintainer-clean to make sure we need to remake from scratch 45 sh 'make maintainer-clean > /dev/null' 46 } 47 48 def make_doc() { 49 def err = null 50 51 try { 52 sh 'make clean > /dev/null' 53 sh 'make > /dev/null 2>&1' 54 } 55 56 catch (Exception caughtError) { 57 //rethrow error later 58 err = caughtError 59 60 sh 'cat *.log' 61 } 62 63 finally { 64 /* Must re-throw exception to propagate error */ 65 if (err) { 66 throw err 67 } 68 } 69 } 70 71 def doc_build() { 72 stage 'Documentation' 73 74 status_prefix = 'Documentation' 75 76 dir ('doc/user') { 77 make_doc() 78 } 79 80 dir ('doc/refrat') { 81 make_doc() 82 } 83 } 84 85 def push_build() { 86 //Don't use the build_stage function which outputs the compiler 87 stage 'Push' 88 89 status_prefix = 'Push' 90 91 def out_dir = pwd tmp: true 92 sh "mkdir -p ${out_dir}" 93 94 //parse git logs to find what changed 95 sh "git remote > ${out_dir}/GIT_REMOTE" 96 git_remote = readFile("${out_dir}/GIT_REMOTE") 97 remoteDoLangExists = git_remote.contains("DoLang") 98 99 if( !remoteDoLangExists ) { 100 sh 'git remote add DoLang git@gitlab.do-lang.org:internal/cfa-cc.git' 101 } 102 103 sh "git push DoLang ${gitRefNewValue}:master" 104 } 105 106 //=========================================================================================================== 107 // Helper classes/variables/routines to make the status and stage name easier to use 108 //=========================================================================================================== 109 //Description of a compiler (Must be serializable since pipelines are persistent) 110 class CC_Desc implements Serializable { 111 public String cc_name 112 public String cpp_cc 113 public String cfa_backend_cc 114 115 CC_Desc(String cc_name, String cpp_cc, String cfa_backend_cc) { 116 this.cc_name = cc_name 117 this.cpp_cc = cpp_cc 118 this.cfa_backend_cc = cfa_backend_cc 119 } 120 } 121 122 //Global Variables defining the compiler and at which point in the build we are 123 // These variables are used but can't be declared before hand because of wierd scripting rules 124 // @Field String currentCC 125 // @Field String status_prefix 126 127 //Wrapper to sync stage name and status name 128 def build_stage(String name) { 129 def stage_name = "${currentCC.cc_name} ${name}".trim() 130 stage stage_name 131 132 status_prefix = stage_name 133 } 134 135 //Helper routine to collect information about the git history 136 def collect_git_info() { 137 138 //create the temporary output directory in case it doesn't already exist 139 def out_dir = pwd tmp: true 140 sh "mkdir -p ${out_dir}" 141 142 //parse git logs to find what changed 143 gitRefName = env.BRANCH_NAME 144 dir("../${gitRefName}@script") { 145 sh "git reflog > ${out_dir}/GIT_COMMIT" 146 } 147 git_reflog = readFile("${out_dir}/GIT_COMMIT") 148 gitRefOldValue = (git_reflog =~ /moving from (.+) to (.+)/)[0][1] 149 gitRefNewValue = (git_reflog =~ /moving from (.+) to (.+)/)[0][2] 150 } 151 152 //=========================================================================================================== 153 // Main loop of the compilation 154 //=========================================================================================================== 155 node ('master'){ 156 157 boolean doPromoteBuild2DoLang 158 def err = null 159 def log_needed = false 160 currentBuild.result = "SUCCESS" 161 status_prefix = '' 162 163 try { 164 //Prevent the build from exceeding 30 minutes 165 timeout(60) { 166 167 //Wrap build to add timestamp to command line 168 wrap([$class: 'TimestamperBuildWrapper']) { 169 170 collect_git_info() 171 172 properties ([ \ 173 [$class: 'ParametersDefinitionProperty', \ 174 parameterDefinitions: [ \ 175 [$class: 'BooleanParameterDefinition', \ 176 defaultValue: false, \ 177 description: 'If true, the build will be promoted to the do-lang git repository (on successful builds only)', \ 178 name: 'promoteBuild2DoLang' \ 179 ]] \ 180 ]]) 181 182 doPromoteBuild2DoLang = promoteBuild2DoLang == 'true' 183 184 echo "FULL BUILD = ${doPromoteBuild2DoLang}" 185 186 //Compile using gcc-4.9 187 currentCC = new CC_Desc('gcc-4.9', 'g++-4.9', 'gcc-4.9') 188 cfa_build(doPromoteBuild2DoLang) 189 190 //Compile latex documentation 191 doc_build() 192 193 if( doPromoteBuild2DoLang ) { 194 //Compile using gcc-5 195 currentCC = new CC_Desc('gcc-5', 'g++-5', 'gcc-5') 196 cfa_build(true) 197 198 //Compile using gcc-4.9 199 currentCC = new CC_Desc('gcc-6', 'g++-6', 'gcc-6') 200 cfa_build(true) 201 202 //Push latest changes to do-lang repo 203 push_build() 204 } 205 } 206 } 207 } 208 209 //If an exception is caught we need to change the status and remember to 210 //attach the build log to the email 211 catch (Exception caughtError) { 212 //rethrow error later 213 err = caughtError 214 215 //An error has occured, the build log is relevent 216 log_needed = true 217 218 //Store the result of the build log 219 currentBuild.result = "${status_prefix} FAILURE".trim() 220 } 221 222 finally { 223 //Send email with final results 224 notify_result(doPromoteBuild2DoLang, err, currentBuild.result, log_needed) 225 226 /* Must re-throw exception to propagate error */ 227 if (err) { 228 throw err 229 } 230 } 231 } 232 233 //=========================================================================================================== 234 //Routine responsible of sending the email notification once the build is completed 235 //=========================================================================================================== 236 def notify_result(boolean promote, Exception err, String status, boolean log) { 237 echo 'Build completed, sending result notification' 238 if(promote) { 239 if( err ) { 240 promote_email(status) 241 } 242 } 243 else { 244 email(status, log) 245 } 246 } 247 248 //Email notification on a full build failure 249 def promote_email(String status) { 250 //Since tokenizer doesn't work, figure stuff out from the environnement variables and command line 251 //Configurations for email format 252 def email_subject = "[cforall git][PROMOTE - FAILURE]" 253 def email_body = """This is an automated email from the Jenkins build machine. It was 254 generated because of a git hooks/post-receive script following 255 a ref change was pushed to the repository containing 256 the project "UNNAMED PROJECT". 257 258 Check console output at ${env.BUILD_URL} to view the results. 259 260 - Status -------------------------------------------------------------- 261 262 PROMOTE FAILURE - ${status} 263 """ 264 265 def email_to = "pabuhr@uwaterloo.ca, rschlunt@uwaterloo.ca, a3moss@uwaterloo.ca, tdelisle@uwaterloo.ca, brice.dobry@huawei.com" 266 267 //send email notification 268 emailext body: email_body, subject: email_subject, to: email_to, attachLog: true 269 } 270 271 //Standard build email notification 272 def email(String status, boolean log) { 273 //Since tokenizer doesn't work, figure stuff out from the environnement variables and command line 274 //Configurations for email format 275 def project_name = (env.JOB_NAME =~ /(.+)\/.+/)[0][1].toLowerCase() 276 277 def gitLog = 'Error retrieving git logs' 278 def gitDiff = 'Error retrieving git diff' 279 280 try { 281 282 sh "git rev-list --format=short ${gitRefOldValue}...${gitRefNewValue} > GIT_LOG" 283 gitLog = readFile('GIT_LOG') 284 285 sh "git diff --stat ${gitRefNewValue} ${gitRefOldValue} > GIT_DIFF" 286 gitDiff = readFile('GIT_DIFF') 287 } 288 catch (Exception error) {} 289 290 def email_subject = "[${project_name} git][BUILD# ${env.BUILD_NUMBER} - ${status}] - branch ${env.BRANCH_NAME}" 291 def email_body = """This is an automated email from the Jenkins build machine. It was 292 generated because of a git hooks/post-receive script following 293 a ref change was pushed to the repository containing 294 the project "UNNAMED PROJECT". 295 296 The branch ${env.BRANCH_NAME} has been updated. 297 via ${gitRefOldValue} (commit) 298 from ${gitRefNewValue} (commit) 299 300 Check console output at ${env.BUILD_URL} to view the results. 301 302 - Status -------------------------------------------------------------- 303 304 BUILD# ${env.BUILD_NUMBER} - ${status} 305 306 - Log ----------------------------------------------------------------- 307 ${gitLog} 308 ----------------------------------------------------------------------- 309 Summary of changes: 310 ${gitDiff} 311 """ 312 313 def email_to = "pabuhr@uwaterloo.ca, rschlunt@uwaterloo.ca, a3moss@uwaterloo.ca, tdelisle@uwaterloo.ca, brice.dobry@huawei.com" 314 315 //send email notification 316 emailext body: email_body, subject: email_subject, to: email_to, attachLog: log 317 }
Note:
See TracChangeset
for help on using the changeset viewer.