将管道的某些部分作为单独的作业运行

时间:2016-07-04 10:05:55

标签: jenkins jenkins-workflow jenkins-pipeline

我们正在考虑将Jenkins Pipeline插件用于一个相当复杂的项目,该项目包含几个需要在合并之前使用不同工具(在不同机器上)构建的交付。尽管如此,使用单个Jenkinsfile进行完整构建似乎很容易,我喜欢自动发现管道附带的git分支。

但是,此时,我们为每个交付都有工作,并使用基于构建流程的" meta"工作来协调个人工作。关于这一点的好处是,如果只做了很小的改动,它还允许只启动一个单独的工作,只是为了看看这个交付是否仍在编译。

为了效仿这一点,我想到了一些想法:

  • 为投放使用不同的Jenkinsfile,在顶级load使用Jenkinsfile个;似乎Multibranch Pipeline作业不允许将Jenkinsfile配置为使用(https://issues.jenkins-ci.org/browse/JENKINS-35415),因此,为单个交付创建作业仍然是开放的。
  • 为"顶级"提供配置选项。为if中的所有交付工作Jenkinsfile,以便能够选择应该构建哪些交付。但是,这会在一个管道中混合不同的构建类型,并且至少会弄乱构建时间的估计。

那些可行的选择,还是有更好的选择?

2 个答案:

答案 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') {
  // ... 
}
}

不如我希望的那么完美,但至少它的工作。