| 1 | #!groovy
 | 
|---|
| 2 | 
 | 
|---|
| 3 | import groovy.transform.Field
 | 
|---|
| 4 | 
 | 
|---|
| 5 | // For skipping stages
 | 
|---|
| 6 | import org.jenkinsci.plugins.pipeline.modeldefinition.Utils
 | 
|---|
| 7 | 
 | 
|---|
| 8 | // wrapper around stage declaretion to be more verbose
 | 
|---|
| 9 | // and allow showing as skipped in the UI
 | 
|---|
| 10 | def BuildStage(String name, boolean run, Closure block ) {
 | 
|---|
| 11 |         echo " -------- ${name} -------- "
 | 
|---|
| 12 |         if(run) {
 | 
|---|
| 13 |                 stage(name, block)
 | 
|---|
| 14 |         } else {
 | 
|---|
| 15 |                 stage(name) { Utils.markStageSkippedForConditional(STAGE_NAME) }
 | 
|---|
| 16 |         }
 | 
|---|
| 17 | }
 | 
|---|
| 18 | 
 | 
|---|
| 19 | //===========================================================================================================
 | 
|---|
| 20 | // Common compilation routines
 | 
|---|
| 21 | //===========================================================================================================
 | 
|---|
| 22 | def Clean() {
 | 
|---|
| 23 |         BuildStage('Cleanup', true) {
 | 
|---|
| 24 |                 // clean the build by wipping the build directory
 | 
|---|
| 25 |                 dir(BuildDir) {
 | 
|---|
| 26 |                         deleteDir()
 | 
|---|
| 27 |                 }
 | 
|---|
| 28 |         }
 | 
|---|
| 29 | }
 | 
|---|
| 30 | 
 | 
|---|
| 31 | def Checkout(commitHash = null) {
 | 
|---|
| 32 |         BuildStage('Checkout', true) {
 | 
|---|
| 33 |                 //checkout the source code and clean the repo
 | 
|---|
| 34 |                 if(commitHash) {
 | 
|---|
| 35 |                         echo "Checking out commit <${commitHash}>"
 | 
|---|
| 36 |                         final scmVars = checkout([$class: 'GitSCM', branches: [[name: commitHash ]],
 | 
|---|
| 37 |                                 userRemoteConfigs: [[
 | 
|---|
| 38 |                                         url: 'cforall@plg.uwaterloo.ca:software/cfa/cfa-cc',
 | 
|---|
| 39 |                                         credentialsId: 'git_key_aug20']]
 | 
|---|
| 40 |                         ])
 | 
|---|
| 41 |                         echo GitLogMessage(scmVars.GIT_COMMIT, scmVars.GIT_PREVIOUS_COMMIT)
 | 
|---|
| 42 |                 } else {
 | 
|---|
| 43 |                         final scmVars = checkout scm
 | 
|---|
| 44 |                         echo GitLogMessage(scmVars.GIT_COMMIT, scmVars.GIT_PREVIOUS_COMMIT)
 | 
|---|
| 45 |                 }
 | 
|---|
| 46 |         }
 | 
|---|
| 47 | }
 | 
|---|
| 48 | 
 | 
|---|
| 49 | //===========================================================================================================
 | 
|---|
| 50 | //Routine responsible of sending the email notification once the build is completed
 | 
|---|
| 51 | //===========================================================================================================
 | 
|---|
| 52 | @NonCPS
 | 
|---|
| 53 | def SplitLines(String text) {
 | 
|---|
| 54 |         def list = []
 | 
|---|
| 55 | 
 | 
|---|
| 56 |         text.eachLine {
 | 
|---|
| 57 |                 list += it
 | 
|---|
| 58 |         }
 | 
|---|
| 59 | 
 | 
|---|
| 60 |         return list
 | 
|---|
| 61 | }
 | 
|---|
| 62 | 
 | 
|---|
| 63 | def ConstructGitLogMessage(String oldRef, String newRef) {
 | 
|---|
| 64 |         def revText = sh(returnStdout: true, script: "git rev-list ${oldRef}..${newRef}").trim()
 | 
|---|
| 65 |         def revList = SplitLines( revText )
 | 
|---|
| 66 | 
 | 
|---|
| 67 |         def gitUpdate = ""
 | 
|---|
| 68 |         revList.each { rev ->
 | 
|---|
| 69 |                 def type = sh(returnStdout: true, script: "git cat-file -t ${rev}").trim()
 | 
|---|
| 70 |                 gitUpdate = gitUpdate + "       via  ${rev} (${type})"
 | 
|---|
| 71 |         }
 | 
|---|
| 72 | 
 | 
|---|
| 73 |         def rev = oldRef
 | 
|---|
| 74 |         def type = sh(returnStdout: true, script: "git cat-file -t ${rev}").trim()
 | 
|---|
| 75 |         gitUpdate = gitUpdate + "      from  ${rev} (${type})"
 | 
|---|
| 76 | 
 | 
|---|
| 77 |         def gitLog    = sh(returnStdout: true, script: "git rev-list --format=short ${oldRef}...${newRef}").trim()
 | 
|---|
| 78 | 
 | 
|---|
| 79 |         def gitDiff   = sh(returnStdout: true, script: "git diff --stat --color ${newRef} ${oldRef}").trim()
 | 
|---|
| 80 |         gitDiff = gitDiff.replace('[32m', '<span style="color: #00AA00;">')
 | 
|---|
| 81 |         gitDiff = gitDiff.replace('[31m', '<span style="color: #AA0000;">')
 | 
|---|
| 82 |         gitDiff = gitDiff.replace('[m', '</span>')
 | 
|---|
| 83 | 
 | 
|---|
| 84 |         return """
 | 
|---|
| 85 | <p>- Changes -------------------------------------------------------------</p>
 | 
|---|
| 86 | 
 | 
|---|
| 87 | <pre>
 | 
|---|
| 88 | The branch ${env.BRANCH_NAME} has been updated.
 | 
|---|
| 89 | ${gitUpdate}
 | 
|---|
| 90 | </pre>
 | 
|---|
| 91 | 
 | 
|---|
| 92 | <p>- Log -----------------------------------------------------------------</p>
 | 
|---|
| 93 | 
 | 
|---|
| 94 | <pre>
 | 
|---|
| 95 | ${gitLog}
 | 
|---|
| 96 | </pre>
 | 
|---|
| 97 | 
 | 
|---|
| 98 | <p>-----------------------------------------------------------------------</p>
 | 
|---|
| 99 | <pre>
 | 
|---|
| 100 | Summary of changes:
 | 
|---|
| 101 | ${gitDiff}
 | 
|---|
| 102 | </pre>
 | 
|---|
| 103 | """
 | 
|---|
| 104 | }
 | 
|---|
| 105 | 
 | 
|---|
| 106 | EmailMessage = ''
 | 
|---|
| 107 | def GitLogMessage(String oldRef = '', String newRef = '') {
 | 
|---|
| 108 |         if(!EmailMessage) {
 | 
|---|
| 109 |                 if (!oldRef) { return "\nERROR retrieveing current git information!\n"  }
 | 
|---|
| 110 |                 if (!newRef) { return "\nERROR retrieveing previous git information!\n" }
 | 
|---|
| 111 | 
 | 
|---|
| 112 |                 echo "Constructing new git message"
 | 
|---|
| 113 | 
 | 
|---|
| 114 |                 EmailMessage = ConstructGitLogMessage(oldRef, newRef)
 | 
|---|
| 115 |         }
 | 
|---|
| 116 |         else {
 | 
|---|
| 117 |                 echo "Reusing previously constructed message"
 | 
|---|
| 118 |         }
 | 
|---|
| 119 |         return EmailMessage;
 | 
|---|
| 120 | }
 | 
|---|
| 121 | 
 | 
|---|
| 122 | return this;
 | 
|---|