我有几个项目的管道非常相似,例如:
pipeline {
agent any
environment {
JAVA_HOME = '...'
}
options {
timeout(time: 1, unit: 'HOURS')
}
parameters {
extendedChoice(
name: 'modules',
description: 'Modules to build',
type: 'PT_MULTI_SELECT',
value: 'app,common,data,ui',
defaultValue: 'app'
)
}
stages {
stage('Build') {
steps {
script {
def modules = params.modules.split(',')
withGradle {
if ('app' in modules) {
sh './gradlew app:assemble'
}
// other modules...
}
}
archiveArtifacts(artifacts: '**/build/outputs/**/*.jar', allowEmptyArchive: true)
}
}
}
}
我想避免将样板复制到新项目中,因此创建共享库听起来是个好方法。
但是,每个项目都有不同的模块。我希望这些可以在项目级别进行配置,例如:
// my-shared-library/vars/bootstrap.groovy
def call(body) {
pipeline {
agent any
environment {
JAVA_HOME = '...'
}
options {
timeout(time: 1, unit: 'HOURS')
}
stages {
stage('Build') {
steps {
script {
// get parameters from project
body()
def modules = params.modules.split(',')
withGradle {
for (module in modules) {
sh "./gradlew $module:assemble"
}
}
}
archiveArtifacts(artifacts: '**/build/outputs/**/*.jar', allowEmptyArchive: true)
}
}
}
}
}
理想情况下,我可以在我的一个项目中使用上面的共享库:
library 'my-shared-library@master'
bootstrap {
parameters {
extendedChoice(
name: 'modules',
description: 'Modules to build',
type: 'PT_MULTI_SELECT',
value: 'app,common,data,ui',
defaultValue: 'app'
)
}
}
运行此管道时,modules参数为null。我还尝试像这样在parameters
块之外定义bootstrap
:
library 'my-shared-library@master'
properties([
parameters([
extendedChoice(
name: 'Modules',
description: 'Modules to build',
type: 'PT_MULTI_SELECT',
value: 'app,common,data,ui',
defaultValue: 'app'
)
])
])
bootstrap()
此管道引发以下错误:
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
WorkflowScript: 13: unexpected token: extendedChoice @ line 13, column 13.
extendedChoice(
^
像这样可能吗?我正在努力查找有关该用例的文档,尤其是有关声明性管道的文档,尽管我发现了一些非常接近的示例: