Skip to content
Permalink
Browse files

Merge branch '2.0' of github.com:jenkinsci/jenkins

  • Loading branch information...
daniel-beck committed Apr 7, 2016
2 parents b2445b4 + 1891dee commit 1fe9cf7b7ada45230f2bc5b8e2f1bdb93175ff9f
Showing 708 changed files with 13,957 additions and 4,315 deletions.
@@ -0,0 +1,191 @@
#!groovy
/*
* This Jenkinsfile is intended to run on https://ci.jenkins-ci.org and may fail anywhere else.
* It makes assumptions about plugins being installed, labels mapping to nodes that can build what is needed, etc.
*
* 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

// Only keep the 10 most recent builds.
properties([[$class: 'jenkins.model.BuildDiscarderProperty', strategy: [$class: 'LogRotator',
numToKeepStr: '50',
artifactNumToKeepStr: '20']]])

String packagingBranch = (binding.hasVariable('packagingBranch')) ? packagingBranch : 'master'

timestampedNode('java') {

// First stage is actually checking out the source. Since we're using Multibranch
// currently, we can use "checkout scm".
stage "Checkout source"

checkout scm

// Now run the actual build.
stage "Build and test"

// We're wrapping this in a timeout - if it takes more than 180 minutes, kill it.
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 -XX:MaxPermSize=1024m",
"MAVEN_OPTS=-Xmx1536m -Xms512m -XX:MaxPermSize=1024m"]) {
// Actually run Maven!
// The -Dmaven.repo.local=${pwd()}/.repository means that Maven will create a
// .repository directory at the root of the build (which it gets from the
// pwd() Workflow call) and use that for the local Maven repository.
sh "mvn -Pdebug -U clean install ${runTests ? '-Dmaven.test.failure.ignore=true -Dconcurrency=1' : '-DskipTests'} -V -B -Dmaven.repo.local=${pwd()}/.repository"
}
}

// Once we've built, archive the artifacts and the test results.
stage "Archive artifacts and test results"

step([$class: 'ArtifactArchiver', artifacts: '**/target/*.jar, **/target/*.war, **/target/*.hpi', fingerprint: true])
if (runTests) {
step([$class: 'JUnitResultArchiver', healthScaleFactor: 20.0, testResults: '**/target/surefire-reports/*.xml'])
}
}

def debFileName
def rpmFileName
def suseFileName

// Run the packaging build on a node with the "docker" label.
timestampedNode('docker') {
// First stage here is getting prepped for packaging.
stage "packaging - docker prep"

// Docker environment to build packagings
dir('packaging-docker') {
git branch: packagingBranch, url: 'https://github.com/jenkinsci/packaging.git'
sh 'docker build -t jenkins-packaging-builder:0.1 docker'
}

stage "packaging - actually packaging"
// Working packaging code, separate branch with fixes
dir('packaging') {
deleteDir()

docker.image("jenkins-packaging-builder:0.1").inside("-u root") {
git branch: packagingBranch, url: 'https://github.com/jenkinsci/packaging.git'

try {
// Saw issues with unstashing inside a container, and not sure copy artifact plugin would work here.
// So, simple wget.
sh "wget -q ${currentBuild.absoluteUrl}/artifact/war/target/jenkins.war"
sh "make clean deb rpm suse BRAND=./branding/jenkins.mk BUILDENV=./env/test.mk CREDENTIAL=./credentials/test.mk WAR=jenkins.war"
} catch (Exception e) {
error "Packaging failed: ${e}"
} finally {
// Needed to make sure the output of the build can be deleted by later runs.
// Hackish, yes, but rpm builds as a numeric UID only user fail, so...
sh "chmod -R a+w target || true"
sh "chmod a+w jenkins.war || true"
}
dir("target/debian") {
def debFilesFound = findFiles(glob: "*.deb")
if (debFilesFound.size() > 0) {
debFileName = debFilesFound[0]?.name
}
}

dir("target/rpm") {
def rpmFilesFound = findFiles(glob: "*.rpm")
if (rpmFilesFound.size() > 0) {
rpmFileName = rpmFilesFound[0]?.name
}
}

dir("target/suse") {
def suseFilesFound = findFiles(glob: "*.rpm")
if (suseFilesFound.size() > 0) {
suseFileName = suseFilesFound[0]?.name
}
}

step([$class: 'ArtifactArchiver', artifacts: 'target/**/*', fingerprint: true])

// Fail the build if we didn't find at least one of the packages, meaning they weren't built but
// somehow make didn't error out.
if (debFileName == null || rpmFileName == null || suseFileName == null) {
error "At least one of Debian, RPM or SuSE packages are missing, so failing the build."
}
}

}

}

stage "Package testing"

if (runTests) {
if (!env.BRANCH_NAME.startsWith("PR")) {
// NOTE: As of now, a lot of package tests will fail. See https://issues.jenkins-ci.org/issues/?filter=15257 for
// possible open JIRAs.

// Basic parameters
String artifactName = (binding.hasVariable('artifactName')) ? artifactName : 'jenkins'
String jenkinsPort = (binding.hasVariable('jenkinsPort')) ? jenkinsPort : '8080'

// Set up
String debfile = "artifact://${env.JOB_NAME}/${env.BUILD_NUMBER}#target/debian/${debFileName}"
String rpmfile = "artifact://${env.JOB_NAME}/${env.BUILD_NUMBER}#target/rpm/${rpmFileName}"
String susefile = "artifact://${env.JOB_NAME}/${env.BUILD_NUMBER}#target/suse/${suseFileName}"

timestampedNode("docker") {
stage "Load Lib"
dir('workflowlib') {
deleteDir()
git branch: packagingBranch, url: 'https://github.com/jenkinsci/packaging.git'
flow = load 'workflow/installertest.groovy'
}
}
// Run the real tests within docker node label
flow.fetchAndRunJenkinsInstallerTest("docker", rpmfile, susefile, debfile,
packagingBranch, artifactName, jenkinsPort)
} else {
echo "Not running package testing against pull requests"
}
} else {
echo "Skipping package tests"
}


// 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: "mvn3.3.3", type: 'hudson.tasks.Maven$MavenInstallation'
String jdktool = tool name: "jdk8_51", 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()
}
}

// Runs the given body within a Timestamper wrapper on the given label.
def timestampedNode(String label, Closure body) {
node(label) {
wrap([$class: 'TimestamperBuildWrapper']) {
body.call()
}
}
}
@@ -56,10 +56,7 @@
<!-- Record your changes in the trunk here. -->
<div id="trunk" style="display:none"><!--=TRUNK-BEGIN=-->
<ul class=image>
<li class="major RFE">
Plugin dependencies are now strictly enforced during Jenkins startup, to avoid cryptic errors later.
You may use <code>-Dhudson.PluginWrapper.dependenciesVersionCheck.enabled=false</code> to revert to the old behavior.
(<a href="https://issues.jenkins-ci.org/browse/JENKINS-21486">issue 21486</a>)
<li class=>
</ul>
</div><!--=TRUNK-END=-->
<h3><a name=v1.656>What's new in 1.656</a> (2016/04/03)</h3>
@@ -5,7 +5,7 @@
<parent>
<groupId>org.jenkins-ci.main</groupId>
<artifactId>pom</artifactId>
<version>1.657-SNAPSHOT</version>
<version>2.0-rc-2-SNAPSHOT</version>
</parent>

<artifactId>cli</artifactId>
@@ -29,7 +29,7 @@ THE SOFTWARE.
<parent>
<groupId>org.jenkins-ci.main</groupId>
<artifactId>pom</artifactId>
<version>1.657-SNAPSHOT</version>
<version>2.0-rc-2-SNAPSHOT</version>
</parent>

<artifactId>jenkins-core</artifactId>
@@ -41,7 +41,7 @@ THE SOFTWARE.
<staplerFork>true</staplerFork>
<stapler.version>1.239</stapler.version>
<spring.version>2.5.6.SEC03</spring.version>
<groovy.version>1.8.9</groovy.version>
<groovy.version>2.4.6</groovy.version>
</properties>

<dependencies>
@@ -243,8 +243,8 @@ THE SOFTWARE.
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.4</version>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
@@ -411,13 +411,13 @@ THE SOFTWARE.
<dependency><!-- groovy shell uses this but uses an optional dependency -->
<groupId>jline</groupId>
<artifactId>jline</artifactId>
<version>1.0</version>
<version>2.12</version>
<scope>compile</scope>
</dependency>
<dependency><!-- groovy shell uses this but it doesn't declare this dependency -->
<groupId>org.fusesource.jansi</groupId>
<artifactId>jansi</artifactId>
<version>1.9</version>
<version>1.11</version>
</dependency>
<dependency>
<!--
Oops, something went wrong.

0 comments on commit 1fe9cf7

Please sign in to comment.
You can’t perform that action at this time.