在 GitLab CI 中将环境变量从一个阶段导出到下一个阶段

Bas*_*hur 18 environment-variables gitlab gitlab-ci

有没有办法export在 GitLab CI 中将环境变量从一个阶段转移到下一个阶段?我正在寻找类似于作业工件功能的东西,仅适用于环境变量而不是文件。

假设我正在一个configure阶段配置构建,并希望将结果存储为(秘密的、受保护的)环境变量以供下一个阶段使用。我可以保护文件中的配置并将它们存储为作业工件,但我担心文件中提供的秘密可以供所有人下载。

fol*_*ell 20

尽管这并不完全是您想要的,因为它使用了artifacts:reports:dotenv工件,但 GitLab 建议在其指南中执行以下操作:“将环境变量传递给另一个作业”

build:
  stage: build
  script:
    - echo "BUILD_VERSION=hello" >> build.env
  artifacts:
    reports:
      dotenv: build.env

deploy:
  stage: deploy
  script:
    - echo "$BUILD_VERSION"  # Output is: 'hello'
  needs:
    - job: build
      artifacts: true
Run Code Online (Sandbox Code Playgroud)

相信使用关键字比关键字(如hd-deman 的最佳答案中使用的)needs更好,因为:dependencies

当作业使用 时needs,默认情况下它不再下载先前阶段的所有工件,因为有需求的作业可以在早期阶段完成之前启动。您只能needs从配置中列出的作业下载工件needs:

build此外,您可以通过将的artifacts:expire_in时间设置得非常小来最小化风险。


hd.*_*man 16

从 Gitlab 13 开始,您可以像这样继承环境变量

build:
  stage: build
  script:
    - echo "BUILD_VERSION=hello" >> build.env
  artifacts:
    reports:
      dotenv: build.env

deploy:
  stage: deploy
  script:
    - echo $BUILD_VERSION # => hello
  dependencies:
    - build
Run Code Online (Sandbox Code Playgroud)

注意:对于 GitLab < 13.1,您应该首先在Gitlab Rails 控制台中启用它:

Feature.enable(:ci_dependency_variables)
Run Code Online (Sandbox Code Playgroud)

  • GitLab 13.1 删除了功能标志(参见 [此合并请求](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/34495)) (4认同)

sec*_*tor 6

不,此功能尚不存在,但此主题已存在问题

我的建议是,您将变量保存在文件中并缓存它们,因为这些将不可下载,并且会在工作完成后被删除。如果您想 100% 确定您可以手动删除它。看clean_up舞台。

例如

cache:
 paths:
  - save_file

stages: 
 - job_name_1
 - job_name_2
 - clean_up

job_name_1:
 script:
  - (your_task) >> save_file

job_name_2:
 script:
  - cat save_file | do_something_with_content

clean_up:
 script:
  - rm save_file
 when: always 
Run Code Online (Sandbox Code Playgroud)