150 lines
4.2 KiB
Groovy
150 lines
4.2 KiB
Groovy
#!/usr/bin/groovy
|
|
// -*- mode: groovy -*-
|
|
// Jenkins pipeline
|
|
// See documents at https://jenkins.io/doc/book/pipeline/jenkinsfile/
|
|
|
|
// Command to run command inside a docker container
|
|
dockerRun = 'tests/ci_build/ci_build.sh'
|
|
|
|
def buildMatrix = [
|
|
[ "enabled": true, "os" : "linux", "withGpu": true, "withOmp": true, "pythonVersion": "2.7" ],
|
|
[ "enabled": false, "os" : "linux", "withGpu": false, "withOmp": true, "pythonVersion": "2.7" ],
|
|
[ "enabled": false, "os" : "osx", "withGpu": false, "withOmp": false, "pythonVersion": "2.7" ],
|
|
]
|
|
|
|
pipeline {
|
|
// Each stage specify its own agent
|
|
agent none
|
|
|
|
// Setup common job properties
|
|
options {
|
|
ansiColor('xterm')
|
|
timestamps()
|
|
timeout(time: 120, unit: 'MINUTES')
|
|
buildDiscarder(logRotator(numToKeepStr: '10'))
|
|
}
|
|
|
|
// Build stages
|
|
stages {
|
|
stage('Get sources') {
|
|
agent any
|
|
steps {
|
|
checkoutSrcs()
|
|
stash name: 'srcs', excludes: '.git/'
|
|
milestone label: 'Sources ready', ordinal: 1
|
|
}
|
|
}
|
|
stage('Build & Test') {
|
|
steps {
|
|
script {
|
|
parallel (buildMatrix.findAll{it['enabled']}.collectEntries{ c ->
|
|
def buildName = getBuildName(c)
|
|
buildFactory(buildName, c)
|
|
})
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// initialize source codes
|
|
def checkoutSrcs() {
|
|
retry(5) {
|
|
try {
|
|
timeout(time: 2, unit: 'MINUTES') {
|
|
checkout scm
|
|
sh 'git submodule update --init'
|
|
}
|
|
} catch (exc) {
|
|
deleteDir()
|
|
error "Failed to fetch source codes"
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Creates cmake and make builds
|
|
*/
|
|
def buildFactory(buildName, conf) {
|
|
def os = conf["os"]
|
|
def nodeReq = conf["withGpu"] ? "${os} && gpu" : "${os}"
|
|
def dockerTarget = conf["withGpu"] ? "gpu" : "cpu"
|
|
[ ("cmake_${buildName}") : { buildPlatformCmake("cmake_${buildName}", conf, nodeReq, dockerTarget) }
|
|
]
|
|
}
|
|
|
|
/**
|
|
* Build platform and test it via cmake.
|
|
*/
|
|
def buildPlatformCmake(buildName, conf, nodeReq, dockerTarget) {
|
|
def opts = cmakeOptions(conf)
|
|
// Destination dir for artifacts
|
|
def distDir = "dist/${buildName}"
|
|
// Build node - this is returned result
|
|
node(nodeReq) {
|
|
unstash name: 'srcs'
|
|
echo """
|
|
|===== XGBoost CMake build =====
|
|
| dockerTarget: ${dockerTarget}
|
|
| cmakeOpts : ${opts}
|
|
|=========================
|
|
""".stripMargin('|')
|
|
// Invoke command inside docker
|
|
sh """
|
|
${dockerRun} ${dockerTarget} tests/ci_build/build_via_cmake.sh ${opts}
|
|
${dockerRun} ${dockerTarget} tests/ci_build/test_${dockerTarget}.sh
|
|
${dockerRun} ${dockerTarget} bash -c "cd python-package; python setup.py bdist_wheel"
|
|
rm -rf "${distDir}"; mkdir -p "${distDir}/py"
|
|
cp xgboost "${distDir}"
|
|
cp -r lib "${distDir}"
|
|
cp -r python-package/dist "${distDir}/py"
|
|
"""
|
|
archiveArtifacts artifacts: "${distDir}/**/*.*", allowEmptyArchive: true
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Build platform via make
|
|
*/
|
|
def buildPlatformMake(buildName, conf, nodeReq, dockerTarget) {
|
|
def opts = makeOptions(conf)
|
|
// Destination dir for artifacts
|
|
def distDir = "dist/${buildName}"
|
|
// Build node
|
|
node(nodeReq) {
|
|
unstash name: 'srcs'
|
|
echo """
|
|
|===== XGBoost Make build =====
|
|
| dockerTarget: ${dockerTarget}
|
|
| makeOpts : ${opts}
|
|
|=========================
|
|
""".stripMargin('|')
|
|
// Invoke command inside docker
|
|
sh """
|
|
${dockerRun} ${dockerTarget} tests/ci_build/build_via_make.sh ${opts}
|
|
"""
|
|
}
|
|
}
|
|
|
|
def makeOptions(conf) {
|
|
return ([
|
|
conf["withOmp"] ? 'USE_OPENMP=1' : 'USE_OPENMP=0']
|
|
).join(" ")
|
|
}
|
|
|
|
|
|
def cmakeOptions(conf) {
|
|
return ([
|
|
conf["withGpu"] ? '-DUSE_CUDA=ON' : '-DUSE_CUDA=OFF',
|
|
conf["withOmp"] ? '-DOPEN_MP:BOOL=ON' : '']
|
|
).join(" ")
|
|
}
|
|
|
|
def getBuildName(conf) {
|
|
def gpuLabel = conf['withGpu'] ? "_gpu" : "_cpu"
|
|
def ompLabel = conf['withOmp'] ? "_omp" : ""
|
|
def pyLabel = "_py${conf['pythonVersion']}"
|
|
return "${conf['os']}${gpuLabel}${ompLabel}${pyLabel}"
|
|
}
|
|
|