内部命令生成非零退出代码时,gilab-ci中的for循环退出

时间:2020-01-23 16:34:10

标签: bash gitlab gitlab-ci

我正在尝试在gitlab-ci中启动mypy代码分析。我使用以下代码进行操作:

mypy:
  only:
  - master
  script:
  - for config_path in $(find * -regex '.*__init__.py' -mindepth 2); do mypy $config_path; exit_code=$?; done
  allow_failure: true

不幸的是,在 find 命令找到的列表中的第一个元素上执行mypy之后,CI停止了。命令 mypy 返回RC = 2。

由于出现警告,我将退出代码的提取放入变量中:如果任何脚本命令返回的退出代码都不为零,则作业将失败,并且其他命令将不再执行。通过将退出代码存储在此处提到的变量中,可以避免这种行为:https://github.com/ph463/Gygax

尽管主体内部存在非零退出代码,我如何实现启动整个for循环?

3 个答案:

答案 0 :(得分:1)

尝试

do mypy $config_path || true; done

|| true将强制返回码为0,无论mypy $config_path有什么返回码。

答案 1 :(得分:0)

我不确定gitlab-ci是否支持<(),但是在bash中会是

while read -r -d '' config_path; do mypy "$config_path"; exit_code=$?; done < <(find . -mindepth 2 -name '*__init__.py' -print0)

该错误可能是由于-regex标志后面的-mindepth 2,但是对于此,-name或-iname可能更好

答案 2 :(得分:0)

我只是将脚本放入文本文件中,将其添加到git中,然后从.gitlab-ci.yml中调用它。像这样:

//run_mypy.sh
for config_path in $(find * -regex '.*__init__.py' -mindepth 2); do mypy $config_path; exit_code=$?; done

//.gitlab-ci.yml
mypy:
  only:
   - master
  script:
   - run_mypy.sh
  allow_failure: true

我已经尝试了很多次,并且努力使复杂的脚本直接从.gitlab-ci.yml文件运行。在我的情况下,这是Windows批处理文件和Powershell脚本,但是它们都遇到相同的问题:您拥有一个支持某种格式并使用某些特殊字符的yaml文件,并且在其中试图表达一种完全不同的格式

从一个单独的脚本控制退出代码,然后尝试弄清楚GitLab如何处理退出代码也容易得多。再说一次,这可能是Powershell脚本的主要问题,但是我仍然建议大家将复杂的脚本存储在.gitlab-ci.yml之外。