提交 563f1e2c 编写于 作者: J Jared Parsons

Moving to new groovy script

上级 e23da388
// Groovy Script: http://www.groovy-lang.org/syntax.html
// Jenkins DSL: https://github.com/jenkinsci/job-dsl-plugin/wiki
static void addLogRotator(def myJob) {
myJob.with {
logRotator {
daysToKeep(21)
numToKeep(-1)
artifactDaysToKeep(5)
artifactNumToKeep(25)
}
}
}
import jobs.generation.Utilities;
static void addConcurrentBuild(def myJob, String category) {
myJob.with {
concurrentBuild(true)
if (category != null) {
throttleConcurrentBuilds {
throttleDisabled(false)
maxTotal(0)
maxPerNode(1)
categories([category])
}
}
}
}
// 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)
static void addScm(def myJob, String branchName, String refspecName = '') {
// Email the results of aborted / failed jobs to our infrastructure alias
static void addEmailPublisher(def myJob) {
myJob.with {
scm {
git {
remote {
github('dotnet/roslyn', 'https', 'github.com')
name('')
refspec(refspecName)
}
branch(branchName)
wipeOutWorkspace(true)
shallowClone(true)
publishers {
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)
}
}
}
}
static void addWrappers(def myJob) {
// 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 {
wrappers {
timeout {
absolute(120)
abortBuild()
notifications {
endpoint('https://jaredpar.azurewebsites.net/api/BuildEvent?code=tts2pvyelahoiliwu7lo6flxr8ps9kaip4hyr4m0ofa3o3l3di77tzcdpk22kf9gex5m6cbrcnmi') {
event('all')
}
timestamps()
}
}
}
}
static void addArtifactArchiving(def myJob, String patternString, String excludeString) {
myJob.with {
publishers {
archiveArtifacts {
allowEmpty(true)
defaultExcludes(false)
exclude(excludeString)
fingerprint(false)
onlyIfSuccessful(false)
pattern(patternString)
}
}
}
// Generates the standard trigger phrases. This is the regex which ends up matching lines like:
// test win32 please
static String generateTriggerPhrase(String jobName, String opsysName, String triggerKeyword = 'this') {
return "(?i).*test\\W+(${jobName.replace('_', '/').substring(7)}|${opsysName}|${triggerKeyword}|${opsysName}\\W+${triggerKeyword}|${triggerKeyword}\\W+${opsysName})\\W+please.*";
}
static void addEmailPublisher(def myJob) {
myJob.with {
publishers {
extendedEmail('$DEFAULT_RECIPIENTS, cc:mlinfraswat@microsoft.com', '$DEFAULT_SUBJECT', '$DEFAULT_CONTENT') {
trigger('Aborted', '$PROJECT_DEFAULT_SUBJECT', '$PROJECT_DEFAULT_CONTENT', null, true, true, true, true)
trigger('Failure', '$PROJECT_DEFAULT_SUBJECT', '$PROJECT_DEFAULT_CONTENT', null, true, true, true, true)
}
static void addRoslynJob(def myJob, String jobName, String branchName, Boolean isPr, String triggerPhraseExtra, Boolean triggerPhraseOnly = false) {
def includePattern = "Binaries/**/*.pdb,Binaries/**/*.xml,Binaries/**/*.log,Binaries/**/*.dmp,Binaries/**/*.zip,Binaries/**/*.png,Binaries/**/*.xml"
def excludePattern = "Binaries/Obj/**,Binaries/Bootstrap/**,Binaries/**/nuget*.zip"
Utilities.addArchival(myJob, includePattern, excludePattern)
// Create the standard job. This will setup parameter, SCM, timeout, etc ...
def projectName = 'dotnet/roslyn'
def defaultBranch = "*/${branchName}"
Utilities.standardJobSetup(myJob, projectName, isPr, defaultBranch)
// Need to setup the triggers for the job
if (isPr) {
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)
} else {
Utilities.addGithubPushTrigger(myJob)
addEmailPublisher(myJob)
}
addBuildEventWebHook(myJob)
}
static void addUnitPublisher(def myJob) {
myJob.with {
configure { node ->
node / 'publishers' << {
'xunit'('plugin': 'xunit@1.97') {
'types' {
'XUnitDotNetTestType' {
'pattern'('**/xUnitResults/*.xml')
'skipNoTestFiles'(false)
'failIfNotNew'(true)
'deleteOutputFiles'(true)
'stopProcessingIfError'(true)
}
}
'thresholds' {
'org.jenkinsci.plugins.xunit.threshold.FailedThreshold' {
'unstableThreshold'('')
'unstableNewThreshold'('')
'failureThreshold'('0')
'failureNewThreshold'('')
}
'org.jenkinsci.plugins.xunit.threshold.SkippedThreshold' {
'unstableThreshold'('')
'unstableNewThreshold'('')
'failureThreshold'('')
'failureNewThreshold'('')
}
}
'thresholdMode'('1')
'extraConfiguration' {
testTimeMargin('3000')
}
// 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 ->
['unit32', 'unit64'].each { buildTarget ->
def jobName = Utilities.getFullJobName(projectName, "windows_${configuration}_${buildTarget}", isPr)
def myJob = job(jobName) {
description("Windows ${configuration} tests on ${buildTarget}")
steps {
batchFile("""set TEMP=%WORKSPACE%\\Binaries\\Temp
mkdir %TEMP%
set TMP=%TEMP%
.\\cibuild.cmd ${(configuration == 'debug') ? '/debug' : '/release'} ${(buildTarget == 'unit32') ? '/test32' : '/test64'}""")
}
}
}
}
}
static void addPushTrigger(def myJob) {
myJob.with {
triggers {
githubPush()
def triggerPhraseOnly = configuration == 'release'
def triggerPhraseExtra = ""
Utilities.setMachineAffinity(myJob, 'Windows_NT', 'latest-or-auto')
Utilities.addXUnitDotNETResults(myJob, '**/xUnitResults/*.xml')
addRoslynJob(myJob, jobName, branchName, isPr, triggerPhraseExtra, triggerPhraseOnly)
}
}
}
static void addPullRequestTrigger(def myJob, String contextName, String opsysName, String triggerKeyword = 'this', Boolean triggerOnly = false) {
myJob.with {
triggers {
pullRequest {
admin('Microsoft')
useGitHubHooks(true)
triggerPhrase("(?i).*test\\W+(${contextName.replace('_', '/').substring(7)}|${opsysName}|${triggerKeyword}|${opsysName}\\W+${triggerKeyword}|${triggerKeyword}\\W+${opsysName})\\W+please.*")
onlyTriggerPhrase(triggerOnly)
autoCloseFailedPullRequests(false)
orgWhitelist('Microsoft')
allowMembersOfWhitelistedOrgsAsAdmin(true)
permitAll(true)
extensions {
commitStatus {
context(contextName.replace('_', '/').substring(7))
}
}
}
// Linux
commitPullList.each { isPr ->
def jobName = Utilities.getFullJobName(projectName, "linux_debug", isPr)
def myJob = job(jobName) {
description("Linux tests")
steps {
shell("./cibuild.sh --nocache --debug")
}
}
}
static void addStandardJob(def myJob, String jobName, String branchName, String buildTarget, String opsys) {
addLogRotator(myJob)
addWrappers(myJob)
def includePattern = "Binaries/**/*.pdb,Binaries/**/*.xml,Binaries/**/*.log,Binaries/**/*.dmp,Binaries/**/*.zip"
def excludePattern = "Binaries/Obj/**,Binaries/Bootstrap/**"
addArtifactArchiving(myJob, includePattern, excludePattern)
if (branchName == 'prtest') {
switch (buildTarget) {
case 'unit32':
addPullRequestTrigger(myJob, jobName, opsys, "(unit|unit32|unit\\W+32)")
break;
case 'unit64':
addPullRequestTrigger(myJob, jobName, opsys, '(unit|unit64|unit\\W+64)')
break;
}
addScm(myJob, '${sha1}', '+refs/pull/*:refs/remotes/origin/pr/*')
} else {
addPushTrigger(myJob)
addScm(myJob, "*/${branchName}")
addEmailPublisher(myJob)
}
def triggerPhraseOnly = false
def triggerPhraseExtra = ""
Utilities.setMachineAffinity(myJob, 'Ubuntu14.04', 'latest-or-auto')
Utilities.addXUnitDotNETResults(myJob, '**/xUnitResults/*.xml')
addRoslynJob(myJob, jobName, branchName, isPr, triggerPhraseExtra, triggerPhraseOnly)
}
['master', 'future', 'stabilization', 'prtest'].each { branchName ->
// folder("${branchName.substring(0, 6)}")
['win', 'linux', 'mac'].each { opsys ->
// folder("${branchName.substring(0, 6)}/${opsys.substring(0, 3)}")
['dbg', 'rel'].each { configuration ->
if ((configuration == 'dbg') || ((branchName != 'prtest') && (opsys == 'win'))) {
// folder("${branchName.substring(0, 6)}/${opsys.substring(0, 3)}/${configuration}")
['unit32', 'unit64'].each { buildTarget ->
if ((opsys == 'win') || (buildTarget == 'unit32')) {
def jobName = "roslyn_${branchName.substring(0, 6)}_${opsys.substring(0, 3)}_${configuration}_${buildTarget}"
def myJob = job(jobName) {
description('')
}
switch (opsys) {
case 'win':
myJob.with {
label('windows-roslyn')
steps {
batchFile("""set TEMP=%WORKSPACE%\\Binaries\\Temp
mkdir %TEMP%
set TMP=%TEMP%
.\\cibuild.cmd ${(configuration == 'dbg') ? '/debug' : '/release'} ${(buildTarget == 'unit32') ? '/test32' : '/test64'}""")
}
}
// Generic throttling for Windows, no category
addConcurrentBuild(myJob, null)
break;
case 'linux':
myJob.with {
label('ubuntu-fast')
steps {
shell("./cibuild.sh --nocache --debug")
}
}
addConcurrentBuild(myJob, 'roslyn/lin/unit')
break;
case 'mac':
myJob.with {
label('mac-roslyn')
steps {
shell("./cibuild.sh --nocache --debug")
}
}
addConcurrentBuild(myJob, 'roslyn/mac/unit')
break;
}
addUnitPublisher(myJob)
addStandardJob(myJob, jobName, branchName, buildTarget, opsys)
}
}
}
// Mac
commitPullList.each { isPr ->
def jobName = Utilities.getFullJobName(projectName, "mac_debug", isPr)
def myJob = job(jobName) {
description("Mac tests")
label('mac-roslyn')
steps {
shell("./cibuild.sh --nocache --debug")
}
}
if (branchName != 'prtest') {
def determinismJobName = "roslyn_${branchName.substring(0, 6)}_determinism"
def determinismJob = job(determinismJobName) {
description('')
}
def triggerPhraseOnly = true
def triggerPhraseExtra = ""
Utilities.addXUnitDotNETResults(myJob, '**/xUnitResults/*.xml')
addRoslynJob(myJob, jobName, branchName, isPr, triggerPhraseExtra, triggerPhraseOnly)
}
determinismJob.with {
label('windows-roslyn')
steps {
batchFile("""set TEMP=%WORKSPACE%\\Binaries\\Temp
// Determinism
commitPullList.each { isPr ->
def jobName = Utilities.getFullJobName(projectName, "windows_determinism", isPr)
def myJob = job(jobName) {
description('Determinism tests')
label('windows-roslyn')
steps {
batchFile("""set TEMP=%WORKSPACE%\\Binaries\\Temp
mkdir %TEMP%
set TMP=%TEMP%
.\\cibuild.cmd /testDeterminism""")
}
}
addConcurrentBuild(determinismJob, null)
addStandardJob(determinismJob, determinismJobName, branchName, "unit32", "win")
}
def triggerPhraseOnly = true
def triggerPhraseExtra = ""
Utilities.setMachineAffinity(myJob, 'Windows_NT', 'latest-or-auto')
addRoslynJob(myJob, jobName, branchName, isPr, triggerPhraseExtra, triggerPhraseOnly)
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册