diff --git a/.mvn/jvm.config b/.mvn/jvm.config new file mode 100644 index 0000000000000000000000000000000000000000..e93a5b43ee1cd1968d2d971e1486071f4fa1fe0f --- /dev/null +++ b/.mvn/jvm.config @@ -0,0 +1 @@ +-Xmx800m diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7bd3f7a8f7b30738a6187c17454f431a84f6e45f..7a2d5e0c53ec6c9a1dcaaedf21fada835c68ea8c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,3 +1,3 @@ # Contributing to Jenkins -For information on contributing to Jenkins, check out the https://wiki.jenkins-ci.org/display/JENKINS/contributing and https://wiki.jenkins-ci.org/display/JENKINS/Extend+Jenkins wiki pages over at the official https://wiki.jenkins-ci.org . They will help you get started with contributing to Jenkins. +For information on contributing to Jenkins, check out the https://wiki.jenkins-ci.org/display/JENKINS/Beginners+Guide+to+Contributing and https://wiki.jenkins-ci.org/display/JENKINS/Extend+Jenkins wiki pages over at the official https://wiki.jenkins-ci.org . They will help you get started with contributing to Jenkins. diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 0000000000000000000000000000000000000000..cc03884ab9354f1dac934257d8fcf566ded8fee6 --- /dev/null +++ b/Jenkinsfile @@ -0,0 +1,190 @@ +/* + * 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 : 'jenkins-2.0' + +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() + } + } +} diff --git a/README.md b/README.md index 4ecfdb2c3738bd3ca3f83b442ecbb8b315e1e29c..501778372da7f1ab5613f35365efdb50a89d5279 100644 --- a/README.md +++ b/README.md @@ -1,19 +1,32 @@ [![][ButlerImage]][website] # About -In a nutshell, Jenkins CI is the leading open-source continuous integration server. Built with Java, it provides over 1000 plugins to support building and testing virtually any project. +In a nutshell, Jenkins is the leading open-source automation server. +Built with Java, it provides over 1000 plugins to support automating virtually anything, +so that humans can actually spend their time doing things machines cannot. + +# What to Use Jenkins for and When to Use It + +Use Jenkins to automate your development workflow so you can focus on work that matters most. Jenkins is commonly used for: + +- Building projects +- Running tests to detect bugs and other issues as soon as they are introduced +- Static code analysis +- Deployment + +Execute repetitive tasks, save time, and optimize your development process with Jenkins. # Downloads Non-source downloads such as WAR files and several Linux packages can be found on our [Mirrors]. # Source -Our latest and greatest source of Jenkins CI can be found on [GitHub]. Fork us! +Our latest and greatest source of Jenkins can be found on [GitHub]. Fork us! # Contributing to Jenkins Follow [contributing](CONTRIBUTING.md) file. # News and Website -All information about Jenkins CI can be found on our [website]. Follow us on Twitter [@jenkinsci]. +All information about Jenkins can be found on our [website]. Follow us on Twitter [@jenkinsci]. # License Jenkins is **licensed** under the **[MIT License]**. The terms of the license are as follows: @@ -40,12 +53,12 @@ Jenkins is **licensed** under the **[MIT License]**. The terms of the license ar OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -[ButlerImage]: http://jenkins-ci.org/sites/default/files/jenkins_logo.png +[ButlerImage]: https://jenkins.io/sites/default/files/jenkins_logo.png [MIT License]: https://github.com/jenkinsci/jenkins/raw/master/LICENSE.txt [Mirrors]: http://mirrors.jenkins-ci.org [GitHub]: https://github.com/jenkinsci/jenkins -[website]: http://jenkins-ci.org -[@jenkinsci]: http://twitter.com/jenkinsci +[website]: https://jenkins.io/ +[@jenkinsci]: https://twitter.com/jenkinsci [Contributing]: https://wiki.jenkins-ci.org/display/JENKINS/contributing [Extend Jenkins]: https://wiki.jenkins-ci.org/display/JENKINS/Extend+Jenkins [wiki]: https://wiki.jenkins-ci.org diff --git a/changelog.html b/changelog.html index 6cd989313a62506745d9b20f2028aac35be4d1f2..dc712b3cc3ccc9cdc8c6580c723f1cce2fdf98c1 100644 --- a/changelog.html +++ b/changelog.html @@ -20,19 +20,20 @@ Some tips: Changelog - + - +
Legend: - major RFEmajor enhancement RFEenhancement - major bugmajor bug fix bugbug fix + major RFEmajor enhancement RFEenhancement + major bugmajor bug fix bugbug fix xxxxx
+