使用jenkins构建流程插件,这是可能的:
ignore(FAILURE){
build( "system-check-flow" )
}
如何使用Declarative Pipeline语法执行此操作?
答案 0 :(得分:34)
要忽略声明性管道中的失败步骤,您基本上有两个选项:
script
步骤和try-catch
块(类似于之前的R_K命题,但采用声明式)stage('someStage') { steps { script { try { build job: 'system-check-flow' } catch (err) { echo err } } echo currentBuild.result } }
catchError
stage('someStage') { steps { catchError { build job: 'system-check-flow' } echo currentBuild.result } }
在这两种情况下,构建都不会在build job: 'system-check-flow'
中的异常中止。在这两种情况下,echo
步骤(以及任何其他步骤)都将被执行。
但这两个选项之间存在一个重要区别。在第一种情况下,如果try
部分引发异常,则不会更改整体构建状态(因此echo currentBuild.result
=> SUCCESS
)。在第二种情况下,整体构建将失败(因此echo currentBuild.result
=> FAILURE
)。
这一点很重要,因为在第一种情况下你总是可以通过整体构建失败(通过设置currentBuild.result = 'FAILURE'
),但无法 修复构建在第二个选项(currentBuild.result = 'SUCCESS'
赢得了工作)。
答案 1 :(得分:3)
在最新版本中,可以通过propogate=false
选项来构建步骤。
链接: https://jenkins.io/doc/pipeline/steps/pipeline-build-step/
示例:
build job:"jobName", propagate:false
答案 2 :(得分:2)
很长时间以来,我一直在寻找答案,但我发现了一个破解方法!我把try / catch块放在了整个阶段:
try {
stage('some-stage') {
//do something
}
} catch (Exception e) {
echo "Stage failed, but we continue"
}
try {
stage("some-other-stage") { // do something }
} catch (Exception e) {
echo "Stage failed, but we still continue"
}
这仍然不是理想的,但是它给出了必要的结果。
答案 3 :(得分:2)
尝试以下示例:
stage('StageName1')
{
steps
{
catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE')
{
SomeCodeThatCanBeErrored
}
}
}
stage('StageName2')
{
steps
{
ContinueOtherCode
}
}
答案 4 :(得分:1)
在新管道中,您可以使用try-catch来实现此目的。
node{
try{
build job: 'system-check-flow'
}
catch (err){
echo "system-check-flow failed"
}
try{
build job: 'job2'
}
catch (err){
echo "job2 failed"
}
}
这里将构建系统检查流程'工作。如果失败,它将捕获错误,忽略,然后继续构建' job2'
答案 5 :(得分:1)
除了简单地通过阶段之外,现在还可以使阶段失败,但继续执行管道并通过构建:
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是最新的,因为这是一个相当新的功能。
答案 6 :(得分:1)
有关完整的讨论,请参见this post。
答案 7 :(得分:0)
对于我的decalartive管道,我找到了另一个解决方案:
stage('Deploy test')
{
steps
{
bat returnStatus: true, script: 'sc stop Tomcat9'
// The return value of the step will be the status code!
// evaluate return status yourself, or ignore it
}
}
sh命令在Unix平台上执行脚本的功能相同。
该示例忽略返回状态,因为由于先前失败的管道运行,tomcat可能已经停止。
答案 8 :(得分:0)
您可以将步骤脚本放在“发布”步骤中,如果它是像步骤这样的拆解
代码如下:
post {
always {
script {
try{
echo 'put your alway need run scripts here....if it's a teardown like step'
}catch (err) {
echo 'here failed'
}
script{
emailext (
xxxx
)
}
}