Jenkins的safeRestart不等待作业完成的原因

76次阅读
没有评论

问题描述

在使用Jenkins时遇到了一个关于/safeRestart命令行行为的疑问。他有一个简单的流水线作业,只有一个阶段。他正在测试/safeRestart命令是否会等待流水线执行完毕,但似乎并不是这样。

流水线作业的日志如下:

[Pipeline] { (Stage 1)
[Pipeline] sh
+ echo stage2 echo
stage2 echo
+ sleep 500s
Resuming build at Thu Sep 26 18:14:18 UTC 2019 after Jenkins restart
Waiting to resume part of test-folder » test-pipeline-no-parallels #6: Finished waiting
Ready to run at Thu Sep 26 18:14:55 UTC 2019

他想知道是否误解了/safeRestart的预期行为,或者这是否是预期的行为。

解决方案

了解流水线作业的特性

Jenkins的流水线作业被设计为可以序列化到磁盘,以提高持久性。因此,它们被认为可以安全地暂停。相比传统的“自由风格”作业,流水线作业的中断和恢复更加可行。

使用@NonCPS修饰器或非可恢复属性

如果你希望在重启后不恢复流水线作业,可以考虑以下两种方法:
1. 使用@NonCPS修饰器:你可以将流水线中的阶段代码包装在带有@NonCPS修饰器的函数中。这将阻止流水线作业被序列化和恢复。
2. 使用非可恢复属性:通过设置作业的属性,使其在重启后不被恢复。然而,这可能会导致作业在重启后不会继续执行。

关于重启Jenkins的注意事项

需要注意的是,重启Jenkins并不是一个经常发生的事情,因此保护流水线作业不受重启影响可能并不总是值得付出努力的事情。

请记住,在进行任何更改之前,请备份您的作业和设置,以防万一出现问题。

示例代码

以下是一个使用@NonCPS修饰器的示例,以防止流水线作业在重启后恢复:

import groovy.transform.NonCPS

@NonCPS
def myStage() {
    // 在这里定义你的阶段代码
    sh "echo stage2 echo"
    sh "sleep 500s"
}

node {
    stage('Stage 1') {
        myStage()
    }
}

请注意,上述示例代码中的myStage函数带有@NonCPS修饰器,这将阻止流水线作业在重启后恢复。

总结

Jenkins的流水线作业被设计为可以安全地暂停和恢复。你可以使用@NonCPS修饰器或设置非可恢复属性来控制流水线作业在重启后的行为。需要注意的是,在重启Jenkins之前,请确保您了解您的作业的状态以及可能的影响。

正文完