我正在尝试在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循环?
答案 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
之外。