我们正在考虑将Jenkins Pipeline插件用于一个相当复杂的项目,该项目包含几个需要在合并之前使用不同工具(在不同机器上)构建的交付。尽管如此,使用单个Jenkinsfile
进行完整构建似乎很容易,我喜欢自动发现管道附带的git分支。
但是,此时,我们为每个交付都有工作,并使用基于构建流程的" meta"工作来协调个人工作。关于这一点的好处是,如果只做了很小的改动,它还允许只启动一个单独的工作,只是为了看看这个交付是否仍在编译。
为了效仿这一点,我想到了一些想法:
Jenkinsfile
,在顶级load
使用Jenkinsfile
个;似乎Multibranch Pipeline作业不允许将Jenkinsfile
配置为使用(https://issues.jenkins-ci.org/browse/JENKINS-35415),因此,为单个交付创建作业仍然是开放的。if
中的所有交付工作Jenkinsfile
,以便能够选择应该构建哪些交付。但是,这会在一个管道中混合不同的构建类型,并且至少会弄乱构建时间的估计。那些可行的选择,还是有更好的选择?
答案 0 :(得分:6)
您可以做的是编写一个流水线脚本,该脚本具有" if" -guards围绕单个阶段,如下所示:
stage "s1"
if (theStage in ["s1","all"]) {
sleep 2
}
stage "s2"
if (theStage in ["s2", "all"]) {
sleep 2
}
stage "s3"
if (theStage in ["s3", "all"]) {
sleep 2
}
然后你可以制作一个" main"使用此脚本并通过设置参数" theStage"一次运行所有阶段的作业到了#34;所有"。这项工作将在所有阶段一次运行时收集统计数据,并为您提供有用的估计时间。
此外,您可以进行"部分运行"使用此脚本并使用您要运行的阶段进行参数化的作业。但估计不会很有用。
请注意,我将舞台本身放到主脚本中,只将执行代码放入条件中,正如Martin Ba所建议的那样。这可确保作业的可视化更可靠
答案 1 :(得分:0)
作为前一个答案的扩展,我会提出类似的建议:
def stageIf(String name, Closure body) {
if (params.firstStage <= name && params.lastStage >= name) {
stage(name, body)
} else {
stage(name) {
echo "Stage skipped: $name"
}
}
}
node('linux') {
properties([
parameters([
choiceParam(
name: 'firstStage',
choices: '1.Build\n' +
'2.Docker\n' +
'3.Deploy',
description: 'First stage to start',
defaultValue: '1.Build',
),
choiceParam(
name: 'lastStage',
choices: '3.Deploy\n' +
'2.Docker\n' +
'1.Build',
description: 'Last stage to start',
defaultValue: '3.Deploy',
),
])
])
stageIf('1.Build') {
// ...
}
stageIf('3.Deploy') {
// ...
}
}
不如我希望的那么完美,但至少它的工作。