首页 > 解决方案 > Gitlab 作业因 while 循环而失败

问题描述

如果我向其中添加此 while 循环,我有一个 gitlab 工作会一直失败:

- while [ ! $PID ] ;do sleep 60;PID=$(ps -ef | grep Runner |grep java | awk '{print $3}'| tail -n1);echo "waiting for $PID";  done

我确定这是问题所在,因为没有这条特定的线路,我设法成功地运行了工作。

这是 gitlab_ci.yaml:

stages:
  - deploy
  - test
deploy:
  stage: deploy
  when: always
  script:
    -irrelevant code that always works
test:
  stage: test
  when: always
  needs: [deploy]
  script:
    - while [ ! $PID ] ;do sleep 60;PID=$(ps -ef | grep Runner |grep java);echo "waiting for $PID to Finish before testing";  done
    - command that starts the testing and also always works
    - PID=0
    - while [ ! $PID ] ;do sleep 60;PID=$(ps -ef | grep Runner |grep java);echo "waiting for $PID";  done
    - echo "Finish"
  artifacts:
    when: always
    paths:
      - src/

该作业可以成功运行第一个 while 循环。第二个循环的问题是,当它完成整个 gitlab 作业失败并且它不运行 echo "finish" 命令时。

我正在使用 while 命令而不是等待,因为 wait 命令仅在进程是您启动的过程而不是像这种情况下的其他人时才有效。此外,我没有使用睡眠作为我跟踪从运行到运行的变化的过程时间。

标签: shellgitlabgitlab-ci

解决方案


当 pid 为空时,[ ! -f $PID ]然后$PID扩展为空,在这种情况下如下:

[ ! -f ]

被执行。来自man test

   -n STRING
          the length of STRING is nonzero

   STRING equivalent to -n STRING

因为-f字符串的长度是非零的,!是否定的,[命令返回失败。

因为扩展结果的文件$PID不存在,所以第二个循环是无限循环。

记得用 shellcheck.net 检查你的脚本。了解在 shell 中引用以及何时使用它并始终使用它。引用变量扩展 - "$PID"

而且,无论如何,如果您想等待 PID,请不要检查具有 PID 名称的文件名是否存在。相反,等待脚本管道的退出状态为零:

- while ! ps -ef | grep Runner | grep -q java; do
     sleep 60;
     echo "somthing";
  done

如果可用,请pgrep改用。用换行符分割长行 - 请参阅 gitlab-ci 文档。


推荐阅读