Jenkinsfile: conditionally build additional targets

This commit is contained in:
Martin Weinelt 2020-04-25 22:52:31 +02:00
parent 64725858b4
commit 815c457abb
No known key found for this signature in database
GPG Key ID: BD4AA0528F63F17E

View File

@ -1,8 +1,53 @@
boolean targetNeedsBuild(targetName) {
// matches an exact path name
rebuildWhenFileModified = [
"modules",
"Makefile",
"targets/${targetName}",
"${targetName.split('-')[0]}.inc",
"contrib/ci/Jenkinsfile"
]
// matches a path by its prefix
rebuildWhenPathModified = [
"patches/",
"scripts/",
]
if (targetName == "x86-64") {
rebuildWhenPathModified.addAll([
"package/",
"tests/"
])
}
result = false
for (changeLogSet in currentBuild.changeSets) {
for (entry in changeLogSet.getItems()) {
for (file in entry.getAffectedFiles()) {
if (file.getPath() in rebuildWhenFileModified) {
println("file ${file.getPath()} modified, rebuild ${targetName}")
result = true
}
for (path in rebuildWhenPathModified) {
if (file.getPath().startsWith(path)) {
println("path ${path} with file ${file.getPath()} modified, rebuild ${targetName}")
result = true
}
}
}
}
}
return result
}
pipeline {
agent none
environment {
GLUON_BRANCH = "ci"
GLUON_DEPRECATED = "full"
GLUON_RELEASE = "fixed"
GLUON_SITEDIR = "contrib/ci/minimal-site"
GLUON_TARGET = "x86-64"
BROKEN = "1"
BUILD_LOG = "1"
}
stages {
@ -32,15 +77,47 @@ pipeline {
}
}
stage('build') {
agent { label 'gluon-docker-v2' }
agent { label "gluon-docker-v2" }
steps {
sh label: 'Identify runner', script: 'echo $SLAVE_NAME'
sh 'make update'
sh 'test -d /dl_cache && ln -s /dl_cache openwrt/dl || true'
timeout(time: 2, unit: "HOURS") {
sh 'make -j$(nproc) V=s'
script {
def jobs = [:]
for (target in findFiles(glob: "targets/*")) {
def targetName = target.name
if (targetName == "generic" ||
targetName.endsWith(".inc") ||
targetName.endsWith(".mk")) {
continue
}
if (!targetNeedsBuild(targetName)) {
continue
}
jobs[targetName] = {
node (label: "gluon-docker-v2") {
stage(targetName) {
checkout scm
sh label: 'Identify runner', script: 'echo $SLAVE_NAME'
targetNeedsBuild(targetName)
sh 'make update'
sh label: ' Symlink download cache', script: 'test -d /dl_cache && ln -s /dl_cache openwrt/dl || true'
timeout(time: 2, unit: "HOURS") {
sh label: "Build ${targetName}", script: "make -j\$(nproc) GLUON_TARGET=${targetName} V=s"
}
sh 'make manifest'
sh 'cat output/images/sysupgrade/*.manifest'
script {
if (targetName == "x86-64") {
stash includes: '**/output/images/factory/*-x86-64.img.gz', name: 'gluon-x86-64-factory'
}
}
}
}
}
}
if (jobs.isEmpty()) {
println("No targets required a rebuild")
}
parallel jobs
}
stash includes: '**/output/images/factory/*-x86-64.img.gz', name: 'gluon-x86-64-factory'
}
}
stage('test') {