【问题标题】:Trigger failure in Jenkins, when anything in a python script fail当 python 脚本中的任何内容失败时,Jenkins 中的触发器失败
【发布时间】:2017-06-02 12:22:30
【问题描述】:

我有一个 python 脚本在 Jenkins 的构建阶段运行,在执行 shell 区域中。

问题是如果脚本失败,我仍然认为构建成功。我确实检查并且python使用了类似于shell命令的返回码(你用$调用的那个?),虽然我不知道在哪里调用在python脚本中触发“任何”失败返回码

import sys

..... code here

....functions

sys.exit(-1)

我需要返回 sys.exit(-1),但是你把它放在 python 代码的什么地方呢?到目前为止,我只能使用 try 块来处理它,并且在异常部分我放置了 sys.exit(-1),但这会添加很多代码,因为我在脚本中有很多函数。

是否有我可以使用的全局位置来触发故障,因此 Jenkins 作业失败?

【问题讨论】:

  • 我记得有一个类似的问题。可能如果你的函数中的某些东西失败了,它永远不会到达sys.exit() 部分。对于初学者,您可以使用 main() function 之类的东西,其中所有逻辑都包装在一起。然后添加if __name__ == "__main__": 部分并执行sys.exit(main()) 之类的操作,然后这将传播错误。我想这就是我当时解决它的方法
  • 如果其中一个 shell 块执行非零,则构建将失败,因此问题在于您的 python 脚本没有传播错误。您可以通过运行 python 脚本并直接回显 $? 来检查这一点
  • 使用sys.exit(-1)有什么理由吗?可以使用sys.exit(1)吗。
  • 不再重复;我不是在问如何触发失败;我在问如何在我的脚本中实现 sys.exit;这是完全不同的。

标签: python jenkins


【解决方案1】:

【讨论】:

    【解决方案2】:
    def main():
        try:
            do_the_work()
            sys.exit(0) # success
        except:
            # insert code to log and debug the problem
            sys.exit(-1)
    

    换句话说:如果do_the_work 返回,sys.exit(0)。如果do_the_work 引发任何它自己不处理的异常,sys.exit(-1)。在do_the_work 内,除非成功,否则不要返回。对任何不可恢复的错误状态引发异常,例如

    class DoSomethingError( exception)
    ...
    
    ok = do_something()
    if not ok:
        print ("do_something error return")
        raise DoSomethingError
    

    记录和调试:在堆栈溢出中搜索有关如何从捕获的异常中获取和记录错误回溯的 Python 答案。

    【讨论】:

    • 我确实补偿了-1;可能他们的投票是基于我在询问如何触发 Jenkins 失败的误解;当我在寻找一种使用 sys.exit 的方法时,詹金斯知道 python 脚本确实失败了。谢谢回复。这行得通,虽然我刚刚得知我仍然可以检查 $?在构建步骤的shell命令中,用于python脚本的输出,甚至不需要更改我的源代码。
    猜你喜欢
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多