【问题标题】:Aborted jenkins pipeline job continues running later stages中止的詹金斯管道作业继续运行后期
【发布时间】: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


【解决方案1】:

这最终成为一个 dotnet 问题,当被 SIGTERM 杀死时,它返回 0 作为退出代码。 https://github.com/dotnet/coreclr/issues/21243 几天前解决了,但还没有发布。

作为一种解决方法,您可以执行以下操作:

public static int Main(string[] args)
{
    Environment.ExitCode = 1;

    // Do stuff

    return 0;
}

如果Main成功完成,则返回退出码0。如果收到SIGTERM,则返回Environment.ExitCode中的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-04
    • 1970-01-01
    • 1970-01-01
    • 2017-08-31
    • 1970-01-01
    • 2021-05-29
    • 1970-01-01
    相关资源
    最近更新 更多