Gitlab CI/CD 在“清理项目目录和基于文件的变量”时失败,并显示“错误:作业失败:退出代码 1”

Posted

技术标签:

【中文标题】Gitlab CI/CD 在“清理项目目录和基于文件的变量”时失败,并显示“错误:作业失败:退出代码 1”【英文标题】:Gitlab CI/CD fails while "Cleaning up project directory and file based variables" with "ERROR: Job failed: exit code 1" 【发布时间】:2021-11-23 10:14:01 【问题描述】:

我运行了近六个月的 gitlab 管道现在意外失败。

之前的每一行都成功运行,然后发生这种情况:

Setting up curl (7.52.1-5+deb9u16) ...
$ curl -s https://deb.nodesource.com/setup_12.x | bash
Cleaning up project directory and file based variables 
ERROR: Job failed: exit code 1

我终其一生都无法弄清楚发生了什么变化。我认为这可能与 this issue 有关,但我没有遇到任何网络问题、超时等。

我的 .gitlab-ci.yml 的轻度混淆版本。 显然我正在使用 .gitlab-ci.yml 来配置我的管道,并且我也在使用共享的 GitLab 运行器。


image: python:3.6-stretch

variables:
    ACCESS_KEY_ID: **********
    SECRET_ACCESS_KEY: **********

before_script:
  - apt-get update
  - apt-get install -y curl
  - curl -s https://deb.nodesource.com/setup_12.x | bash
  - apt-get install -y nodejs
  - apt-get install -y npm
  - npm install -g serverless
  - pip install  --upgrade awscli
  - python --version
  - nodejs --version

stages:
  - deploy

deploy:
  stage: deploy

  only:
  - master   # We will run the CD only when something is going to change in master branch.

  script:
    - npm install   # Archive the code repository.
    - pip install -r requirements.txt

    - cd services/service1/
    - sls deploy -v --stage production
    - cd ../../

    - cd services/service2/
    - sls deploy -v --stage production
    - cd ../../

    - cd services/service3/
    - sls deploy -v --stage production
    - cd ../../


  environment:
    name: master

【问题讨论】:

如果您使用的是在使用 gitlab.com 时提供的共享 GitLab Runners(相对于您自己的自托管 GitLab 实例),那么您应该联系支持/raise an Issue。此错误似乎与您的管道定义无关。 【参考方案1】:

倒数第二行 (Cleaning up project directory and file based variables ) 始终存在于 CI/CD 作业中,无论通过还是失败。

可能发生的是最后一个命令,curl -s https://deb.nodesource.com/setup_12.x | bash 失败。不幸的是,由于您正在下载删除文件并将其通过管道传输到 bash,因此您的管道很可能开始随机失败,因为 该脚本不能保证每次都相同

为了测试它,我创建了一个干净的 ubuntu 虚拟机,然后运行 ​​curl 命令,得到以下错误:

解决这个长期问题的最佳方法是创建一个容器,其中包含 CI 所需的所有依赖项,并将其存储在 GitLab 项目的容器注册表中,然后每次都提取该容器。这不仅可以节省您的 CI/CD 时间,因为您不必每次都运行安装,而且还可以防止您的依赖项在您下面发生变化并导致错误的确切问题。还值得注意的是,您应该非常小心地将外部下载的脚本传递给 bash,因为该脚本可能会更改为包含任何内容,而您的 CI 会在不知不觉中运行它。

【讨论】:

以上是关于Gitlab CI/CD 在“清理项目目录和基于文件的变量”时失败,并显示“错误:作业失败:退出代码 1”的主要内容,如果未能解决你的问题,请参考以下文章

gitlab 的 CI/CD 配置管理

GitLab CI/CD 的使用

GitLab CI/CD

gitlab 添加 CI CD

Jenkins vs GitLab CI:CI/CD工具之战

GitLab ci/cd部署环境构建