我用 Python 编写了一个脚本,该脚本运行一段时间并在定期终止后立即执行清理,如下所示:
import time
def cleanUp():
#delete some temporary files and so on
print("Clean up done")
if __name__=="__main__":
startTime = time.time()
while time.time() - startTime < 60:
# Performing some commands
print("Still running")
cleanUp()
我将此代码作为 Jenkins 作业运行。为了无论如何清理,即当我中止 Jenkins 作业时,我使用了 signal.signal。对 Jenkins 发送的用于终止作业的信号进行研究 (https://gist.github.com/datagrok/dfe9604cb907523f4a2f) 结果 詹金斯在停止进程时发送“TERM”信号。因此我添加了以下+一个控制机制来查看它是否有效,因为 Jenkins 在停止作业后不会显示日志的其余部分(将立即显示“ABORTED”,请参阅链接):
import time
import signal
def cleanUp():
#delete some temporary files and so on
print("Clean up done")
# Write some text to a file, to see if this part was actually run
with open(r"C:\temp\abx.txt", 'w') as file:
file.write("Process has been finished prematurely")
signal.signal(signal.SIGTERM, cleanUp)
if __name__=="__main__":
startTime = time.time()
while time.time() - startTime < 60:
# Performing some commands
print("Still running")
cleanUp()
遗憾的是,我在运行 Jenkins 作业的 PC 的 C: emp 中找不到“控制”文件。
我的问题:使用
signal.signal(signal.SIGTERM, cleanUp)
是否是正确的方法(或者我应该使用其他东西?)还是我在使用signal.signal时犯了错误?
我还尝试使用
atexit
注册 cleanUp,但这也没有给我带来我希望的结果。
非常感谢!
正确的方法是使用内置功能 - Jenkinsfile 语法有一个专门用于您的用例的块:
来自管道语法:
部分定义了在管道或阶段运行完成时运行的一个或多个附加步骤(取决于管道中后期部分的位置)。post
可以支持以下任何后置条件块:post
、always
、changed
、fixed
、regression
、aborted
、failure
、success
、unstable
、和unsuccessful
。这些条件块允许根据管道或阶段的完成状态执行每个条件内的步骤。条件块按如下所示的顺序执行。cleanup
// Jenkinsfile
pipeline {
// ...
stages {
stage('Some build logic') {
steps {
// build steps
}
}
}
post {
aborted {
sh 'python3 cleanup.py'
}
}
}
根据您的目标,您可以选择要使用的任何后置条件。