当 Jenkins 作业中止时在 Python 中运行清理功能

问题描述 投票:0回答:1

我用 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,但这也没有给我带来我希望的结果。

非常感谢!

python jenkins signals abort code-cleanup
1个回答
0
投票

正确的方法是使用内置功能 - 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'
    }
  }
}

根据您的目标,您可以选择要使用的任何后置条件。

© www.soinside.com 2019 - 2024. All rights reserved.