【问题标题】:Catching the error status while running scripts in parallel on Jenkins在 Jenkins 上并行运行脚本时捕获错误状态
【发布时间】:2014-10-30 08:29:43
【问题描述】:

我正在 Jenkins 上并行运行两个 perl 脚本,如果前两个脚本成功,则应该执行另外一个脚本。如果我在脚本 1 中遇到错误,脚本 2 仍然运行,因此退出状态变为成功。

我想以这样一种方式运行它,如果任何一个并行脚本失败,作业应该以失败状态停止。

目前我的设置看起来像

perl_script_1 &

perl_script_2 &

wait

perl_script_3

如果脚本 1 或 2 在中间失败,作业应该以失败状态终止,而不执行作业 3。

注意:我在 Jenkins 中使用 tcsh shell。

【问题讨论】:

    标签: perl shell jenkins tcsh


    【解决方案1】:

    我有一个类似的设置,我并行运行多个 java 进程(测试)并等待它们完成。如果有任何失败,我的脚本的其余部分都会失败。

    每个测试进程都会在完成后将其结果写入要测试的文件。
    注意 - 下面的代码示例是用 bash 编写的,但在 tcsh 中应该类似。

    为此,我获取每次执行的进程 ID:

    test1 &
    test1_pid=$!
    # test1 will write pass or fail to file test1_result
    
    test2 &
    test2_pid=$!
    
    ...
    

    现在,我使用 kill -0 PID 命令等待进程完成
    例如 test1:

    # Check test1
    kill -0 $test1_pid
    
    # Check if process is done or not
    if [ $? -ne 0 ]
    then
        echo process test1 finished
        # check results
        grep fail test1_result
    
        if [ $? -eq 0 ]
        then
            echo test1 failed
            mark_whole_build_failed
        fi
    fi
    

    其他测试也是如此(您可以执行循环以定期测试所有正在运行的进程)。
    稍后根据 ma​​rk_whole_build_failed 调整其余的执行。

    我希望这会有所帮助。

    【讨论】:

    • 嗨..谢谢!有没有办法在不写入 test1_result 文件的情况下找到它?因为等待命令将负责检查作业的状态。
    • 我期待类似 if (perl_script1 && perl_script2) then do perl_script_3
    • 你也可以试试 :)。我正在向类似案例提出我的解决方案。我喜欢保持简单,即使脚本更长更详细。
    • 关于避免写入结果文件,不知道怎么才能得到发送到后台的进程结果。也许有办法,但我不知道。使用文件作为标志是保存结果的简单方法。我一直在使用它...
    猜你喜欢
    • 1970-01-01
    • 2018-01-18
    • 2011-04-18
    • 2016-04-24
    • 2013-01-31
    • 1970-01-01
    • 1970-01-01
    • 2016-07-20
    • 2017-08-25
    相关资源
    最近更新 更多