jenkins/Jenkinsfile

121 lines
5.2 KiB
Plaintext
Raw Normal View History

#!/usr/bin/env groovy
/*
* This Jenkinsfile is intended to run on https://ci.jenkins.io and may fail anywhere else.
* It makes assumptions about plugins being installed, labels mapping to nodes that can build what is needed, etc.
2016-01-28 01:41:10 +08:00
*
* The required labels are "java" and "docker" - "java" would be any node that can run Java builds. It doesn't need
* to have Java installed, but some setups may have nodes that shouldn't have heavier builds running on them, so we
* make this explicit. "docker" would be any node with docker installed.
*/
// TEST FLAG - to make it easier to turn on/off unit tests for speeding up access to later stuff.
def runTests = true
2017-01-04 04:15:12 +08:00
def failFast = false
properties([buildDiscarder(logRotator(numToKeepStr: '50', artifactNumToKeepStr: '20')), durabilityHint('PERFORMANCE_OPTIMIZED')])
// see https://github.com/jenkins-infra/documentation/blob/master/ci.adoc for information on what node types are available
def buildTypes = ['Linux', 'Windows']
2017-01-04 04:15:12 +08:00
def builds = [:]
for(i = 0; i < buildTypes.size(); i++) {
def buildType = buildTypes[i]
builds[buildType] = {
node(buildType.toLowerCase()) {
timestamps {
// First stage is actually checking out the source. Since we're using Multibranch
// currently, we can use "checkout scm".
stage('Checkout') {
checkout scm
}
2017-01-04 04:15:12 +08:00
// Now run the actual build.
stage("${buildType} Build / Test") {
timeout(time: 180, unit: 'MINUTES') {
// See below for what this method does - we're passing an arbitrary environment
// variable to it so that JAVA_OPTS and MAVEN_OPTS are set correctly.
withMavenEnv(["JAVA_OPTS=-Xmx1536m -Xms512m",
"MAVEN_OPTS=-Xmx1536m -Xms512m"]) {
2017-01-04 04:15:12 +08:00
// Actually run Maven!
// -Dmaven.repo.local=… tells Maven to create a subdir in the temporary directory for the local Maven repository
def mvnCmd = "mvn -Pdebug -U javadoc:javadoc clean install ${runTests ? '-Dmaven.test.failure.ignore' : '-DskipTests'} -V -B -Dmaven.repo.local=${pwd tmp: true}/m2repo -s settings-azure.xml -e"
2017-01-04 04:15:12 +08:00
if(isUnix()) {
sh mvnCmd
sh 'test `git status --short | tee /dev/stderr | wc --bytes` -eq 0'
// Stash for ATH run
stash name: "metadata", includes: "essentials.yml"
2017-01-04 04:15:12 +08:00
} else {
bat mvnCmd
2017-01-04 04:15:12 +08:00
}
}
}
}
// Once we've built, archive the artifacts and the test results.
2017-11-17 11:49:13 +08:00
stage("${buildType} Publishing") {
2017-01-04 04:15:12 +08:00
def files = findFiles(glob: '**/target/*.jar, **/target/*.war, **/target/*.hpi')
renameFiles(files, buildType.toLowerCase())
2017-01-04 04:15:12 +08:00
archiveArtifacts artifacts: '**/target/*.jar, **/target/*.war, **/target/*.hpi',
fingerprint: true
if (runTests) {
junit healthScaleFactor: 20.0, testResults: '*/target/surefire-reports/*.xml'
2017-01-04 04:15:12 +08:00
}
}
}
}
}
}
2017-01-04 04:15:12 +08:00
builds.failFast = failFast
parallel builds
if (buildTypes.contains("linux")) {
node("linux") {
unstash "metadata"
unarchive mapping: ['war/target/linux-jenkins.war': 'jenkins.war']
def fileUrl = "file://" + pwd() + "/jenkins.war"
def metadataPath = pwd() + "/essentials.yml"
dir("ath") {
runATH(jenkins: fileUrl, metadataFile: metadataPath)
}
}
}
// This method sets up the Maven and JDK tools, puts them in the environment along
// with whatever other arbitrary environment variables we passed in, and runs the
// body we passed in within that environment.
void withMavenEnv(List envVars = [], def body) {
// The names here are currently hardcoded for my test environment. This needs
// to be made more flexible.
// Using the "tool" Workflow call automatically installs those tools on the
// node.
String mvntool = tool name: "mvn", type: 'hudson.tasks.Maven$MavenInstallation'
String jdktool = tool name: "jdk8", type: 'hudson.model.JDK'
// Set JAVA_HOME, MAVEN_HOME and special PATH variables for the tools we're
// using.
List mvnEnv = ["PATH+MVN=${mvntool}/bin", "PATH+JDK=${jdktool}/bin", "JAVA_HOME=${jdktool}", "MAVEN_HOME=${mvntool}"]
// Add any additional environment variables.
mvnEnv.addAll(envVars)
// Invoke the body closure we're passed within the environment we've created.
withEnv(mvnEnv) {
body.call()
}
}
2017-01-04 04:15:12 +08:00
void renameFiles(def files, String prefix) {
for(i = 0; i < files.length; i++) {
def newPath = files[i].path.replace(files[i].name, "${prefix}-${files[i].name}")
def rename = "${files[i].path} ${newPath}"
if(isUnix()) {
sh "mv ${rename}"
} else {
bat "move ${rename}"
}
}
}