【发布时间】:2019-01-21 16:48:09
【问题描述】:
我正在使用最新版本的 Jenkins 和管道插件,并且我有一个 jenkins 声明性管道作业,配置如下:
pipeline {
agent {
label 'default'
}
stages {
stage('Prepare') {
steps {
dir('foo') {
git ...
}
}
}
stage('Temp1') {
steps {
sh script: 'dotnet run ...'
echo 'Temp1'
}
}
stage('Temp2') {
steps {
echo 'Temp2'
}
}
}
}
如果我在 Temp1 阶段的 sh 脚本期间中止构建,我的预期是 Temp1 阶段的其余部分和 Temp2 阶段都不会运行。但是,当我中止它时,它会停止 sh 脚本,然后运行 Temp1 阶段的其余部分并继续运行 Temp2 阶段!
这是日志:
Running in Durability level: MAX_SURVIVABILITY
[Pipeline] node
Running on ...
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Prepare)
[Pipeline] dir
Running in ...
[Pipeline] {
[Pipeline] git
Fetching changes from the remote Git repository
...
[Pipeline] }
[Pipeline] // dir
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Temp1)
[Pipeline] sh
+ dotnet run ...
Aborted by ...
Sending interrupt signal to process
[Pipeline] echo
Temp1
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Temp2)
[Pipeline] echo
Temp2
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: ABORTED
如何让构建真正中止?
【问题讨论】:
-
这确实很有趣。如果
dotnet run ..接收到中断信号,它会给出返回码 > 0 吗?这种行为是否也发生在管道的其他阶段,还是仅在您中断dotnet run ..阶段时发生? -
@fishi 如果我在本地执行
dotnet run并按Ctrl+C,那么$?是130,所以我认为这不是问题。但是我在 sh 脚本中添加了一个echo $?并且它正在打印 0,所以也许问题毕竟是退出代码。 -
这种行为是仅在
dotnet run ..中止时发生,还是在管道的其他阶段中止时也会发生?如果它只发生在dotnet run ..期间,那么我敢打赌退出代码是不正确的。 -
运行时间足以让我中止它们的唯一阶段是
dotnet run,所以我会去找别的东西来测试。 -
您可以将
sh script: 'sleep 100'添加到管道并使用它进行测试。
标签: jenkins .net-core jenkins-pipeline