CI-pipeline 忽略在给定步骤中失败的任何命令

Pat*_*atS 6 gitlab-ci

我正在尝试调试 CI 管道,并希望创建一个自定义logger阶段来转储有关管道运行环境的大量信息。

我尝试添加这个:

stages:
    - logger

logger-commands:
    stage: logger
    allow_failure: true
    script:
        - echo 'Examining environment'
        - echo PWD=$(pwd) Using image ${CI_JOB_IMAGE}
        - git --version
        - echo --------------------------------------------------------------------------------
        - env
        - echo --------------------------------------------------------------------------------
        - npm --version
        - node --version
        - echo java -version
        - mvn --version
        - kanico --version
        - echo -------------------------------------------------------------------------------- 
Run Code Online (Sandbox Code Playgroud)

问题是 Java 命令因java未安装而失败。错误说:

/bin/sh: eval: line 217: java: not found
Run Code Online (Sandbox Code Playgroud)

我知道我可以删除该行java -version,但我试图想出一个可以在所有 CI 管道中使用的固定记录器,因此它将包括:Java、Maven、Node、npm、python 以及我的其他任何内容想要包含,但我意识到其中一些命令将失败,因为某些命令未找到。

搜索上述解决方案让我很接近。

  • GitLab CI:即使脚本失败如何继续工作- 这确实有帮助。通过添加,allow_failure: true我发现即使记录器作业失败,其余阶段也会运行(这是可取的)。答案还建议了一种包装命令的语法,其中:
./script_that_fails.sh > /dev/null 2>&1 || FAILED=true

if [ $FAILED ]
    then ./do_something.sh
fi
Run Code Online (Sandbox Code Playgroud)

这很有帮助,但我的问题是这样的。

gitlab 的 CI 管道语法(或 bash 语法)中是否内置了任何内容,即使一个命令失败,也允许给定步骤中的所有命令运行?

        - npm --version || echo nmp failed
        - node --version  || echo node failed
        - echo java -version || echo java failed
Run Code Online (Sandbox Code Playgroud)

这有点干净(语法),但我正在努力使其更简单。

Pat*_*atS 8

已经提到的答案很好,但我一直在寻找更简单的东西,所以我编写了以下 bash 脚本。该脚本始终返回零退出代码,因此 CI 管道始终认为该命令已成功。

如果命令失败,则会打印该命令以及非零退出代码。

# File: runit

#!/bin/sh
"$@"
EXITCODE=$?
if [ $EXITCODE -ne 0 ]
then
    echo "CMD: $@"
    echo "Ignored exit code ($EXITCODE)"
fi
exit 0
Run Code Online (Sandbox Code Playgroud)

测试如下:

./runit ls "/bad dir"
echo "ExitCode = $?"
Run Code Online (Sandbox Code Playgroud)

给出这个输出:

ls: cannot access /bad dir: No such file or directory
CMD: ls /bad dir
Ignored exit code (2)
ExitCode=0
Run Code Online (Sandbox Code Playgroud)

请注意,即使命令失败,也会ExitCode=0显示 ci-pipeline 将看到的内容。

要在管道中使用它,我必须有可用的 shell 脚本。我将研究如何包含它,但它必须包含在 CI 运行程序工作中。例如,

stages:
  - logger-safe

logger-safe-commands:
  stage: logger-safe
  allow_failure: true
  script:
    - ./runit npm --version
    - ./runit java -version
    - ./runit mvn --version
Run Code Online (Sandbox Code Playgroud)

我不喜欢这个解决方案,因为它需要存储库中的额外文件,但这符合我正在寻找的精神。到目前为止,最简单的 内置解决方案是:

    - some_command || echo command failed $?
Run Code Online (Sandbox Code Playgroud)