netci.groovy 7.7 KB
Newer Older
1 2 3
// Groovy Script: http://www.groovy-lang.org/syntax.html
// Jenkins DSL: https://github.com/jenkinsci/job-dsl-plugin/wiki

4
import jobs.generation.*;
J
Jared Parsons 已提交
5

J
Jared Parsons 已提交
6 7 8 9 10 11
// The input project name (e.g. dotnet/corefx)
def projectName = GithubProject
// The input branch name (e.g. master)
def branchName = GithubBranchName
// Folder that the project jobs reside in (project/branch)
def projectFoldername = Utilities.getFolderName(projectName) + '/' + Utilities.getFolderName(branchName)
J
Jared Parsons 已提交
12

13
// Email the results of aborted / failed jobs to our infrastructure alias
14 15 16
static void addEmailPublisher(def myJob) {
  myJob.with {
    publishers {
T
Ty Overby 已提交
17 18 19 20
      extendedEmail('mlinfraswat@microsoft.com', '$DEFAULT_SUBJECT', '$DEFAULT_CONTENT') {
	// trigger(trigger name, subject, body, recipient list, send to developers, send to requester, include culprits, send to recipient list)
        trigger('Aborted', '$PROJECT_DEFAULT_SUBJECT', '$PROJECT_DEFAULT_CONTENT', null, false, false, false, true)
        trigger('Failure', '$PROJECT_DEFAULT_SUBJECT', '$PROJECT_DEFAULT_CONTENT', null, false, false, false, true)
21 22 23 24 25
      }
    }
  }
}

26 27 28 29 30 31 32 33 34 35 36 37
// Calls a web hook on Jenkins build events.  Allows our build monitoring jobs to be push notified
// vs. polling
static void addBuildEventWebHook(def myJob) {
  myJob.with {
    notifications {
      endpoint('https://jaredpar.azurewebsites.net/api/BuildEvent?code=tts2pvyelahoiliwu7lo6flxr8ps9kaip4hyr4m0ofa3o3l3di77tzcdpk22kf9gex5m6cbrcnmi') {
        event('all')
      }
    }
  }   
}

38 39
// Generates the standard trigger phrases.  This is the regex which ends up matching lines like:
//  test win32 please
J
Jared Parsons 已提交
40
static String generateTriggerPhrase(String jobName, String opsysName, String triggerKeyword = 'this') {
41 42 43
    return "(?i).*test\\W+(${jobName.replace('_', '/').substring(7)}|${opsysName}|${triggerKeyword}|${opsysName}\\W+${triggerKeyword}|${triggerKeyword}\\W+${opsysName})\\W+please.*";
}

J
Jared Parsons 已提交
44
static void addRoslynJob(def myJob, String jobName, String branchName, Boolean isPr, String triggerPhraseExtra, Boolean triggerPhraseOnly = false) {
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
  def archiveSettings = new ArchivalSettings()
  archiveSettings.addFiles('Binaries/**/*.pdb')
  archiveSettings.addFiles('Binaries/**/*.xml')
  archiveSettings.addFiles('Binaries/**/*.log')
  archiveSettings.addFiles('Binaries/**/*.dmp')
  archiveSettings.addFiles('Binaries/**/*.zip')
  archiveSettings.addFiles('Binaries/**/*.png')
  archiveSettings.addFiles('Binaries/**/*.xml')
  archiveSettings.excludeFiles('Binaries/Obj/**')
  archiveSettings.excludeFiles('Binaries/Bootstrap/**')
  archiveSettings.excludeFiles('Binaries/**/nuget*.zip')
  // Only archive if failed/aborted
  archiveSettings.setArchiveOnFailure()
  archiveSettings.setFailIfNothingArchived()
  Utilities.addArchival(myJob, archiveSettings)
60

61
  // Create the standard job.  This will setup parameter, SCM, timeout, etc ...
62
  def projectName = 'dotnet/roslyn'
63
  def defaultBranch = "*/${branchName}"
64
  Utilities.standardJobSetup(myJob, projectName, isPr, defaultBranch)
65 66

  // Need to setup the triggers for the job
J
Jared Parsons 已提交
67
  if (isPr) {
J
Jared Parsons 已提交
68 69 70 71 72 73 74
    def triggerCore = "open|all|${jobName}"
    if (triggerPhraseExtra) {
      triggerCore = "${triggerCore}|${triggerPhraseExtra}"
    }
    def triggerPhrase = "(?i).*test\\W+(${triggerCore})\\W+please.*";
    def contextName = jobName
    Utilities.addGithubPRTriggerForBranch(myJob, branchName, contextName, triggerPhrase, triggerPhraseOnly)
75
  } else {
76
    Utilities.addGithubPushTrigger(myJob)
77 78
    addEmailPublisher(myJob)
  }
79 80

  addBuildEventWebHook(myJob)
81 82
}

J
Jared Parsons 已提交
83 84 85 86 87 88 89 90 91
// True when this is a PR job, false for commit.  On feature branches we do PR jobs only. 
def commitPullList = [false, true]
if (branchName.startsWith("features/")) {
  commitPullList = [true]
} 

// Windows     
commitPullList.each { isPr -> 
  ['debug', 'release'].each { configuration ->
92
        ['unit32', 'unit64'].each { buildTarget ->
J
Jared Parsons 已提交
93
      def jobName = Utilities.getFullJobName(projectName, "windows_${configuration}_${buildTarget}", isPr)
94
            def myJob = job(jobName) {
J
Jared Parsons 已提交
95
        description("Windows ${configuration} tests on ${buildTarget}")
96 97
                  steps {
                    batchFile("""set TEMP=%WORKSPACE%\\Binaries\\Temp
98
mkdir %TEMP%
99
set TMP=%TEMP%
J
Jared Parsons 已提交
100
.\\cibuild.cmd ${(configuration == 'debug') ? '/debug' : '/release'} ${(buildTarget == 'unit32') ? '/test32' : '/test64'}""")
101 102
                  }
                }
J
Jared Parsons 已提交
103 104 105

      def triggerPhraseOnly = configuration == 'release'   
      def triggerPhraseExtra = ""
J
Jason Malinowski 已提交
106
      Utilities.setMachineAffinity(myJob, 'Windows_NT', 'latest-or-auto-dev15')
J
Jared Parsons 已提交
107 108
      Utilities.addXUnitDotNETResults(myJob, '**/xUnitResults/*.xml')
      addRoslynJob(myJob, jobName, branchName, isPr, triggerPhraseExtra, triggerPhraseOnly)
109 110
    }
  }
J
Jared Parsons 已提交
111
}
112

J
Jared Parsons 已提交
113 114 115 116 117
// Linux
commitPullList.each { isPr -> 
  def jobName = Utilities.getFullJobName(projectName, "linux_debug", isPr)
  def myJob = job(jobName) {
    description("Linux tests")
118 119 120 121
                  steps {
                    shell("./cibuild.sh --nocache --debug")
                  }
                }
122

J
Jared Parsons 已提交
123
  def triggerPhraseOnly = false
J
Jared Parsons 已提交
124
  def triggerPhraseExtra = "linux"
125
  Utilities.setMachineAffinity(myJob, 'Ubuntu14.04', 'latest-or-auto')
J
Jared Parsons 已提交
126 127 128 129 130 131 132 133 134
  Utilities.addXUnitDotNETResults(myJob, '**/xUnitResults/*.xml')
  addRoslynJob(myJob, jobName, branchName, isPr, triggerPhraseExtra, triggerPhraseOnly)
}

// Mac
commitPullList.each { isPr -> 
  def jobName = Utilities.getFullJobName(projectName, "mac_debug", isPr)
  def myJob = job(jobName) {
    description("Mac tests")
135 136 137 138 139
                  label('mac-roslyn')
                  steps {
                    shell("./cibuild.sh --nocache --debug")
                  }
            }
J
Jared Parsons 已提交
140 141

  def triggerPhraseOnly = true
J
Jared Parsons 已提交
142
  def triggerPhraseExtra = "mac"
143
  Utilities.addXUnitDotNETResults(myJob, '**/xUnitResults/*.xml')
J
Jared Parsons 已提交
144
  addRoslynJob(myJob, jobName, branchName, isPr, triggerPhraseExtra, triggerPhraseOnly)
145
  }
J
Jared Parsons 已提交
146 147 148 149 150 151

// Determinism
commitPullList.each { isPr -> 
  def jobName = Utilities.getFullJobName(projectName, "windows_determinism", isPr)
  def myJob = job(jobName) {
    description('Determinism tests')
J
Jared Parsons 已提交
152 153 154
    label('windows-roslyn')
    steps {
      batchFile("""set TEMP=%WORKSPACE%\\Binaries\\Temp
155 156 157 158
mkdir %TEMP%
set TMP=%TEMP%
.\\cibuild.cmd /testDeterminism""")
    }
159
  }
160

J
Jared Parsons 已提交
161
  def triggerPhraseOnly = true
162
  def triggerPhraseExtra = "determinism"
163
  Utilities.setMachineAffinity(myJob, 'Windows_NT', 'latest-or-auto-dev15')
J
Jared Parsons 已提交
164
  addRoslynJob(myJob, jobName, branchName, isPr, triggerPhraseExtra, triggerPhraseOnly)
165
}
166 167 168 169 170 171 172 173 174 175 176 177

// Perf Correctness
commitPullList.each { isPr ->
  def jobName = Utilities.getFullJobName(projectName, "perf_correctness", isPr)
  def myJob = job(jobName) {
    description('perf test correctness')
    label('windows-roslyn')
    steps {
      batchFile(""".\\cibuild.cmd /testPerfCorrectness""")
    }
  }

178
  def triggerPhraseOnly = false
179
  def triggerPhraseExtra = "perf-correctness"
180
  Utilities.setMachineAffinity(myJob, 'Windows_NT', 'latest-or-auto-dev15')
181 182
  addRoslynJob(myJob, jobName, branchName, isPr, triggerPhraseExtra, triggerPhraseOnly)
}
J
Jared Parsons 已提交
183 184 185 186 187 188 189 190 191 192 193 194 195 196

// Microbuild
commitPullList.each { isPr ->
  def jobName = Utilities.getFullJobName(projectName, "microbuild", isPr)
  def myJob = job(jobName) {
    description('MicroBuild test')
    label('windows-roslyn')
    steps {
      batchFile(""".\\src\\Tools\\MicroBuild\\cibuild.cmd""")
    }
  }

  def triggerPhraseOnly = false
  def triggerPhraseExtra = "microbuild"
197
  Utilities.setMachineAffinity(myJob, 'Windows_NT', 'latest-or-auto-dev15')
J
Jared Parsons 已提交
198 199
  addRoslynJob(myJob, jobName, branchName, isPr, triggerPhraseExtra, triggerPhraseOnly)
}
M
Matt Mitchell 已提交
200 201 202 203 204 205 206

JobReport.Report.generateJobReport(out)

// Make the call to generate the help job
Utilities.createHelperJob(this, projectName, branchName,
    "Welcome to the ${projectName} Repository",  // This is prepended to the help message
    "Have a nice day!")  // This is appended to the help message.  You might put known issues here.