gitlab runner 在最后抛出“清理基于文件的变量 00:01 错误:作业失败:退出代码 1”

问题描述 投票:0回答:8

尽管我的所有步骤都成功通过,Gitlab CI 显示了这一点 - “清理基于文件的变量 00:01 错误:作业失败:退出代码 1"

最后工作失败了。另外有趣的是,这只发生在我的主分支上。在其他分支上运行成功。有没有人遇到过这个问题并找到解决方案?

    - >
     for dir in $(git log -m -1 --name-only -r --pretty="format:" "$CI_COMMIT_SHA"); do 
     if [[ -f "$dir" ]]; then 
     SERVICE=$(echo "$dir")
     # helm install the service
     fi
     done
    - echo "deployed" 

bash continuous-integration gitlab-ci gitlab-ci-runner
8个回答
11
投票

概述

这让我发疯,我仍然不确定合适的答案是什么。我自己刚刚遇到了这个问题,并在这个问题上花费了几个小时。我认为 GitLab 在命令替换方面搞砸了(昨天显示了新版本),尽管我对这个问题或其时间安排可能是错误的。它似乎也只发生在某些命令替换中,而不是其他命令替换中,我最初怀疑它可能与输出到

/dev/null
有关,但不会深入研究。启动命令替换后总是失败。


我的代码

我的代码与您的代码类似(下面的简化版本),尝试以多种方式操作它,但每次使用命令替换都会产生相同的失败消息:

Cleaning up file based variables          00:01
ERROR: Job failed: exit code 1

我所做的尝试包括以下内容:

- folders=$(find .[^.]* * -type d -maxdepth 0 -exec echo {} \; 2>/dev/null)
- >
  while read folder; do
      echo "$folder"
  done <<< "$folders"

还有...

- >
  while read folder; do
      echo "$folder"
  done <<< $(find .[^.]* * -type d -maxdepth 0 -exec echo {} \; 2>/dev/null)

这两个版本在我的本地计算机上都成功了,但在 GitLab 上失败了(上面可能有拼写错误 - 请不要仔细检查,它是我实际程序的简化版本)。


我是如何修复它的

我没有使用命令替换

$(...)
,而是选择了进程替换
<(...)
,而且它似乎工作没有问题。

- >
  while read folder; do
      echo "$folder"
  done < <(find .[^.]* * -type d -maxdepth 0 -exec echo {} \; 2>/dev/null)

如果可能的话,我会尝试在您的代码中替换相同的内容:

- >
  while read dir; do
      # the rest goes here
  done < <(git log -m -1 --name-only -r --pretty="format:" "$CI_COMMIT_SHA")

问题也可能是 if 语句中的行(回显),您可以将其替换为以下内容:

read SERVICE < <(echo "$dir")

再次,不确定这是否会为您解决问题,因为我仍然不确定原因是什么,但它解决了我的问题。祝你好运。


3
投票

当我将脚本从 .gitlab-ci.yml 文件删除到另一个 scipt.sh 文件并在 gitlab yaml 中调用 script.sh 文件时,该错误似乎消失了。


2
投票

我们在

GitLab v13.3.6-ee
中遇到了同样的问题,我们用于打开新合并请求的脚本的以下行:

COUNTBRANCHES=`echo ${LISTMR} | grep -o "\"source_branch\":\"${CI_COMMIT_REF_NAME}\"" | wc -l`;

正如 @ctwheels 所说,将该行更改为:

read COUNTBRANCHES < <(echo ${LISTMR} | grep -o "\"source_branch\":\"${CI_COMMIT_REF_NAME}\"" | wc -l);

解决了我们的问题。


2
投票

我在尝试使用受保护的 CI/CD 变量时遇到此错误。


2
投票

在我的例子中,我只有一个条件命令,如果最后一个条件为假,那么gitlab认为脚本出错了(即使事实并非如此,因为它使用最后一行作为返回值)

这就是我的脚本的样子,如果项目使用yarn而不是npm,则会出错

  [ -f yarn.lock ] && yarn install --frozen-lockfile --cache .npm && yarn prod
  [ ! -f yarn.lock ] && npm ci --prefer-offline --cache .npm && npm run prod --cache .npm

所以解决方案只是确保最后一行返回 true

  [ -f yarn.lock ] && yarn install --frozen-lockfile --cache .npm && yarn prod
  [ ! -f yarn.lock ] && npm ci --prefer-offline --cache .npm && npm run prod --cache .npm
  true

1
投票

在我的例子中,我的脚本以一个指向 URL 的

curl
命令结束,该命令将返回 403 Forbidden 并且可能会挂起

curl -s "$ENV_URL/hello" | grep "hello world"

...如果这对任何人有帮助:-)


1
投票

这对我来说是一个非常具体的用例(.NetCore),但它最终会帮助某人。

在我的例子中,日志中没有写入错误,测试成功执行,但作业失败,问题中显示存在消息。

我在我的源项目中引用了 xunit(不仅在我的测试项目中),我不知道为什么这会导致 ci 作业失败(但在本地工作时仅显示警告:无法找到 testhost.dll。请发布您的测试项目并重试)。

从我的源项目(不是测试项目)中删除 xunit 解决了该问题。


0
投票

对我来说,这与脚本无关,而是与代码本身有关。

我尝试运行任何单元测试,然后它帮助我找到错误。

© www.soinside.com 2019 - 2024. All rights reserved.