gitlab:能否根据日志内容触发失败的 CI 作业的重新运行

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

我们使用 GitLab 作为 terraform 锁定文件。我们经常会遇到获取锁等错误。这显然是他们的能力问题。如果我们重新运行该作业,它几乎总是会通过。

所以我想设置一些查看日志的东西,如果它看到特定的错误文本,则重新运行作业。看看他们的文档等,我不认为这是一种可能性。但我无法想象其他人还没有实现一些东西来做到这一点。

gitlab gitlab-ci cicd
1个回答
0
投票

虽然 GitLab 不提供日志消息检测作为重试功能,但可以使用可用的功能(包括

retry:exit_codes:
)构建此解决方案 - 或者甚至完全在脚本中进行重试处理。

简短的版本是这样的:您使用脚本逻辑来捕获特定的错误消息,当找到时,您可以使用特定的状态代码退出(您将在

retry:exit_codes:
中指定),或者直接在中重试脚本或命令作业脚本逻辑。

显然有很多方法可以处理这个问题,bash(或类似的 shell)中的一种特定实现可能如下所示:

  1. 选择特定的退出代码并将其添加到作业 YAML 中的
    retry:exit_codes:
    列表中
  2. 确保您的脚本没有设置
    set -e
    (或使用
    set +e
  3. 将命令的输出保存到文件中
  4. 检查非零(不成功)退出代码(如果成功,则正常继续,如果需要,可以重新设置
    set -e
  5. 如果退出代码非零,请在输出文件中搜索(解析或 grep 等)特定的错误消息
  6. 如果发现错误消息,请使用步骤 1 中声明的退出代码退出作业。否则,使用正常退出代码退出
myjob:
  variables:
    # sometimes required for correct exit code detection with some executors
    # uncomment if your script always exits with exit code 1
    # FF_USE_NEW_BASH_EVAL_STRATEGY: "1"
  retry:
    max: 4
    exit_codes:
      - 42
  script:
    - ./myscript.sh

这是未经测试的代码,但应该解释基本思想:

#!/usr/bin/env bash

# myscript.sh

set +e
set -o pipefail

err_msg="Error locking state"
special_code=42

terraform apply 2>&1 | tee -a output.txt

exit_code=$?

if [[ $exit_code -ne 0 ]]; then
    if grep -q "$err_msg" < output.txt; then
        exit $special_code
    else
        exit $exit_code
    fi
fi

set -e
# ...

或者,只需完全在 bash 中处理重试逻辑,例如,如 Unix stackexchange 问题中所述:在出现特定错误消息时重新运行命令

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