我想在Jenkins声明性管道语法中定义多个阶段,它们可以在任何一个失败后继续。我找不到任何现存的真正重复的问题,因为它们都假定或允许脚本语法。
pipeline {
agent any
stages {
stage('stage 1') {
steps {
echo "I need to run every time"
}
}
stage('stage 2') {
steps {
echo "I need to run every time, even if stage 1 fails"
}
}
stage('stage 3') {
steps {
echo "Bonus points if the solution is robust enough to allow me to continue *or* be halted based on previous stage status"
}
}
}
}
为了澄清,我不寻求如何在脚本语法中实现这一点。我试图理解这种流控制是否在声明性语法中得到支持和形式化。为此,我将尝试准确定义我要寻找的内容:
我认为这取决于工作之间的相互依赖程度。根据你的例子,我假设
因此,相应的管道可能是:
pipeline {
stages {
stage('Independent tasks') {
parallel {
stage('stage 1') {
steps {
sh 'exit 1' // failure
}
}
stage('stage 2') {
steps {
echo 'Happens even so stage 1 fails'
sh 'exit 0' // success
}
}
}
post { // 'stage 3'
failure {
echo "... at least one failed"
}
success {
echo "Success!"
}
}
}
stage ('stage 4') {
steps {
echo 'Happens only if all previous succeed'
}
}
}
}
阶段1和阶段2将始终运行,阶段3对它们的综合成功/失败做出反应。
附加想法:此概念仅在管道的“末尾”有效。如果您在中间的某个地方需要它并且构建必须继续,您可以将其移动到自己的作业中并使用构建作业
插件。
pipeline {
stages {
stage('Start own job for stage 1, 2, 3') {
steps {
build job: 'stageOneTwoThree', propagate: false, wait: true
}
}
stage ('stage 4') {
steps {
echo 'Happens always, because "propagate: false"'
}
}
}
我可能错过了一些东西,但是声明性、固执己见的管道的想法是提供大多数简单用例的覆盖。当你需要固执己见没有涵盖的东西时,你必须求助于脚本管道,这只是指“声明性管道”的“要求”:现在不会发生。
至于您的其他“需求”,它们没有什么意义,因为整个想法是将低级的丑陋包装到共享库中,为用户提供如下结构:
mylib.failable_stages({
stages {
stage('stage 1') {
steps {
echo "I need to run every time"
}
}
stage('stage 2') {
steps {
echo "I need to run every time, even if stage 1 fails"
}
}
stage('stage 3') {
steps {
echo "Bonus points if the solution is robust enough to allow me to continue *or* be halted based on previous stage status"
}
}
}
})
当然,您必须找到或实现这样的<code>mylib</code>类,而<code>failable_stages</code>将得到一个闭包,并将其封装在各种管道/样板代码块中。
希望这是有帮助的。
现在这是可能的:
pipeline {
agent any
stages {
stage('1') {
steps {
sh 'exit 0'
}
}
stage('2') {
steps {
catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
sh "exit 1"
}
}
}
stage('3') {
steps {
sh 'exit 0'
}
}
}
}
在上面的示例中,所有阶段都将执行,管道将成功,但阶段2将显示为失败:
正如您可能已经猜到的那样,您可以自由选择buildResult
和stageResult
,以防您希望它不稳定或其他任何东西。您甚至可以使生成失败并继续执行管道。
只要确保你的 Jenkins 是最新的,因为这是一个相当新的功能。
编辑:这是这个答案最初写的问题。这也是其他几个问题的正确答案,这就是为什么我也在那里发布了这个答案。这是多个类似问题的正确解决方案。我已经根据他们的具体问题调整了我的其他答案,以明确这一点。我只是复制了答案来节省自己的时间。这并不意味着这不是一个好的正确答案。
我有一系列执行快速检查的阶段。我想完成所有这些,即使有失败。例如: 第二阶段失败,因此默认情况下第三阶段不执行。 通常这将是的工作,但我想在阶段视图中显示它们。在下面的模型中: 构建4显示了通常发生的情况。作业失败,因此不运行
问题内容: 如何报告声明式管道失败的阶段?在fail块中,我想获取failureStage.name并将其报告(最终报告为松弛)。 问题答案: PipelineVisitor是一种很好的方法。但是,如果您只想查看错误,那么利用可能会更好。 以下内容提供了每个失败步骤的映射列表,并且还遍历了下游作业。我发现它非常有用。 您将要使用共享库来避免安全沙箱警告/批准
我的Jenkins流水线并行运行多个任务。似乎如果一个阶段失败,所有后续阶段将运行其<code>failure</code>post块(无论它们是否实际失败)。我不知道这是故意的还是我做错了什么。 注意:这个管道运行在一个Windows节点上,因此< code>bat('exit /b 1') 在上面的管道中,只有“失败阶段”失败,但在输出中我看到了这一点,这表明对这两个步骤都执行了< code>
问题内容: 如何在Jenkins声明式管道中循环参数化并行阶段?(或脚本管道,如果声明式不能) 这是我简单的伪示例。如何循环(“部署serverN”)阶段? 数组可能具有1..n变量。 我不想重复代码。詹金斯管道中一定有办法吗?还是我应该使用矩阵。我已经尝试了一些,但是没有成功。 我也尝试过这种方法,但是由于前一阶段不依赖于下一阶段,因此它并不是完美的。 在Blue Ocean中应该看起来像这样(
在Jenkins脚本管道中,您可以像这样设置PATH env变量: 注意这里解释的路径MAVENhttps://jenkins.io/doc/pipeline/steps/workflow-basic-steps/#code-withenv代码集环境变量: 要设置的环境变量列表,每个变量的形式为VARIABLE=value或VARIABLE=以取消设置其他定义的变量。您还可以使用语法PATH wh
问题内容: 我正在尝试将现有的Jenkins管道转换为新的声明性管道,我想知道如何正确处理邮件通知? 我目前正在使用此代码: 它运作良好,但我看不到如何使用新的声明性语法。我认为可以通过使用post()和其他通知来完成某些操作,但我不知道具体如何做。我已经试过了: 但是问题在于它不会发送任何“返回正常”邮件。 我如何在Jenkins声明性管道中使用Mailer插件来发送“返回正常”邮件? 是否应该