我正在尝试调试 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 以及我的其他任何内容想要包含,但我意识到其中一些命令将失败,因为某些命令未找到。
搜索上述解决方案让我很接近。
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)
这有点干净(语法),但我正在努力使其更简单。
已经提到的答案很好,但我一直在寻找更简单的东西,所以我编写了以下 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)
归档时间: |
|
查看次数: |
9621 次 |
最近记录: |