| def rawUrlPrefix = "https://raw.githubusercontent.com/apache" |
| def repoUrl = rawUrlPrefix + "/sling-aggregator/master/default.xml" |
| def repoBase = "https://github.com/apache/" |
| // Repositories are read from the repo definition file. Customizations must be |
| // placed in a .sling-module.xml file in the git repository root. See |
| // https://cwiki.apache.org/confluence/display/SLING/Sling+module+descriptor |
| // for a description of the format |
| // This is a Jenkins DSL script, I don't think you can run it standalone. |
| // See that wiki page for how to setup a local Jenkins test instance. |
| def modules = [] |
| |
| def manifest = new XmlParser().parse(repoUrl) |
| manifest.project.each { project -> |
| jobName = project.@name.toString().replace(".git","") |
| def slingMod = [] |
| def createJob = true |
| try { |
| slingMod = new XmlParser().parse(rawUrlPrefix + "/" + jobName + "/master/.sling-module.xml") |
| println "${jobName}: found custom .sling-module.xml" |
| } catch ( FileNotFoundException e) { |
| println "${jobName}: no .sling-module.xml found, using defaults" |
| } |
| |
| def module = [ location: jobName ] |
| |
| def connection = new URL(rawUrlPrefix + "/" + jobName + "/master/Jenkinsfile").openConnection() |
| module.pipeline = connection.responseCode == 200 |
| if ( module.pipeline ) { |
| println "${jobName}: Jenkinsfile found, skipping as they are now managed by a Github org folder." |
| createJob = false |
| } |
| |
| if ( slingMod?.jenkins?.jdks ) { |
| def jdks = [] |
| slingMod.jenkins.jdks.jdk.each { jdks.add it.text() } |
| module.jdks = jdks |
| |
| println "${jobName}: overriding JDKs list to be ${jdks}" |
| } |
| |
| if ( slingMod?.jenkins?.enabled ) { |
| createJob = Boolean.valueOf(slingMod.jenkins.enabled.text()) |
| println "${jobName}: overriding job creation with value ${createJob}" |
| } |
| |
| if ( slingMod?.jenkins?.enableXvfb ) { |
| module.enableXvfb = Boolean.valueOf(slingMod.jenkins.enableXvfb.text()) |
| println "${jobName}: overriding xvfb support with value ${module.enableXvfb}" |
| } |
| |
| if ( slingMod?.jenkins?.mavenGoal ) { |
| module.mavenGoal = slingMod.jenkins.mavenGoal.text() |
| println "${jobName}: overriding default maven goal with value ${module.mavenGoal}" |
| } |
| |
| if ( slingMod?.jenkins?.additionalMavenParams ) { |
| module.extraGoalsParams = slingMod.jenkins.additionalMavenParams.text() |
| println "${jobName}: overriding additional maven parameters with value ${module.extraGoalsParams}" |
| } |
| |
| if ( slingMod?.jenkins?.rebuildFrequency ) { |
| module.rebuildFrequency = slingMod.jenkins.rebuildFrequency.text() |
| println "${jobName}: overriding default rebuild frequency with value ${module.rebuildFrequency}" |
| } |
| |
| if ( slingMod?.jenkins?.archivePatterns ) { |
| module.archivePatterns = [] |
| slingMod.jenkins.archivePatterns.archivePattern.each { module.archivePatterns.add it.text() } |
| println "${jobName}: overriding archive patterns to be ${module.archivePatterns}" |
| } |
| |
| if ( slingMod?.jenkins?.downstreamProjects ) { |
| module.downstreamProjects = [] |
| slingMod.jenkins.downstreamProjects.downstreamProject.each { module.downstreamProjects.add it.text() } |
| println "${jobName}: overriding downstream projects to be ${module.downstreamProjects}" |
| } |
| |
| if ( createJob ) { |
| modules += module |
| } |
| } |
| |
| // should be sorted from the oldest to the latest version |
| // so that artifacts built using the oldest version are |
| // deployed for maximum compatibility |
| def defaultJdks = ["1.8"] |
| def defaultMvn = "Maven (latest)" |
| def defaultSlave = "ubuntu" |
| |
| def jdkMapping = [ |
| "1.7": "JDK 1.7 (latest)", |
| "1.8": "JDK 1.8 (latest)", |
| "9" : "JDK 1.9 (latest)", |
| "10" : "JDK 10 (latest)", |
| "11" : "JDK 11 (latest)" |
| |
| ] |
| |
| modules.each { module -> |
| |
| def jdks = module.jdks ?: defaultJdks |
| def deploy = true |
| |
| def downstreamProjects = module.downstream?: [] |
| def downstreamEntries = modules.findAll { downstreamProjects.contains(it.location) } |
| def downstreamJobs = [] |
| |
| downstreamEntries.each { downstreamEntry -> |
| def downstreamJdks = downstreamEntry.jdks?: defaultJdks |
| def downstreamLocation = downstreamEntry.location |
| downstreamJdks.each { downstreamJdk -> |
| downstreamJobs.add(jobName(downstreamLocation,downstreamJdk)) |
| } |
| } |
| |
| jdks.each { jdkKey -> |
| mavenJob(jobName(module.location, jdkKey)) { |
| |
| description(''' |
| <p>This build was automatically generated and any manual edits will be lost.</p> |
| <p>See <a href="https://cwiki.apache.org/confluence/display/SLING/Sling+Jenkins+Setup">Sling Jenkins Setup</a> |
| for more details</p>''') |
| |
| logRotator { |
| numToKeep(15) |
| } |
| |
| scm { |
| git { |
| remote { |
| github('apache/' + module.location) |
| } |
| branches('master') |
| } |
| } |
| |
| blockOnUpstreamProjects() |
| |
| triggers { |
| snapshotDependencies(true) |
| scm('H/15 * * * *') |
| def rebuildFrequency = module.rebuildFrequency ? module.rebuildFrequency : '@weekly' |
| cron(rebuildFrequency) |
| } |
| |
| // timeout if the job takes 4 times longer than the average |
| // duration of the last 3 jobs. Defaults to 30 minutes if |
| // no previous job executions are found |
| wrappers { |
| timeout { |
| elastic(400, 3, 30) |
| } |
| |
| if ( module.enableXvfb ) { |
| xvfb('Xvfb') |
| } |
| |
| // INFRA-17090 |
| preBuildCleanup() |
| } |
| |
| blockOnUpstreamProjects() |
| |
| jdk(jdkMapping.get(jdkKey)) |
| |
| mavenInstallation(defaultMvn) |
| |
| // we have no use for archived artifacts since they are deployed on |
| // repository.apache.org so speed up the build a bit (and probably |
| // save on disk space) |
| archivingDisabled(true) |
| |
| label(defaultSlave) |
| |
| // ensure that only one job deploys artifacts |
| // besides being less efficient, it's not sure which |
| // job is triggered first and we may end up with a |
| // mix of Java 7 and Java 8 artifacts for projects which |
| // use these 2 versions |
| def extraGoalsParams = module.extraGoalsParams ?: "" |
| def goal = module.mavenGoal ? module.mavenGoal : ( deploy ? "deploy" : "verify" ) |
| goals( "-U clean ${goal} ${extraGoalsParams}") |
| |
| publishers { |
| if ( deploy && downstreamJobs ) { |
| downstream(downstreamJobs) |
| } |
| |
| if (module.archivePatterns) { |
| archiveArtifacts() { |
| module.archivePatterns.each { archiveEntry -> |
| pattern(archiveEntry) |
| } |
| } |
| } |
| |
| // TODO - can we remove the glob and rely on the defaults? |
| archiveJunit('**/target/surefire-reports/*.xml,**/target/failsafe-reports/*.xml') { |
| allowEmptyResults() |
| } |
| // send emails for each broken build, notify individuals as well |
| mailer('commits@sling.apache.org', false, true) |
| } |
| |
| deploy = false |
| } |
| } |
| } |
| |
| String jobName(String location, String jdk) { |
| return location + '-' + jdk; |
| } |