当前位置: 首页 > 知识库问答 >
问题:

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

丌官嘉良
2023-03-14

在GitLab CI中,是否有方法将环境变量从一个阶段导出到下一个阶段?我正在寻找类似于作业工件特性的东西,只针对环境变量而不是文件。

假设我正在<code>configure</code>阶段中配置构建,并希望将结果存储为(机密的、受保护的)环境变量,以供下一阶段使用。我可以保护文件中的配置,并将其存储为作业工件,但我担心文件中的秘密比每个人都可以下载的要多。

共有3个答案

慕凌龙
2023-03-14

不,这个功能还没有出现,但是这个主题已经有一个问题了。

我的建议是你将变量保存在一个文件中并缓存起来,因为这些变量是不可下载的,并且在工作结束时会被删除。如果你想100%确定,你可以手动删除它。请参见< code>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 
贺栋
2023-03-14

虽然不是你想要的,因为它使用了<code>工件:reports:dotenv</code>工件,但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

我认为使用< code>needs关键字比使用< code>dependencies关键字(hd-deman的顶级答案中使用的)更好,因为:

当一个作业使用< code>needs时,默认情况下,它不再从前面的阶段下载所有工件,因为有需求的作业可以在前面的阶段完成之前开始。对于< code >需求,您只能从< code >需求:配置中列出的作业中下载工件。

此外,您可以通过将构建工件:expire_in时间设置为非常小来最大程度地降低风险。

叶华皓
2023-03-14

从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

注意:对于GitLab

Feature.enable(:ci_dependency_variables)
 类似资料:
  • 因此,我有一个JavaFX2.0应用程序,主窗口在启动时显示。我想做的是让用户按下一个按钮,然后在主窗口旁边弹出另一个窗口。 所以,我想在主舞台左侧“固定”一个未装饰的舞台。 我知道如何制作窗口,以及如何使其不被装饰,新窗口工作正常,我只想使其在移动窗口时相对于主窗口(或舞台,无论您喜欢称之为哪个)保持相同的位置。

  • 问题内容: 我正在尝试使用单个,几个文件和几个文件为多个环境创建配置。我需要它为每个环境使用具有python依赖关系的其他文件。 假设我们在两个环境中创建服务:和。为此,我创建了以下文件结构: 目的是在容器的过程中实例化文件的专有名称。根据文档,我尝试了这种天真的方法,这种方法似乎不起作用: 将名称定义为环境变量: envs / dev.env: envs / prod.env: 在 Docker

  • 问题内容: 我在环境指令的管道顶部定义了环境变量: 但是我需要在阶段中动态设置或覆盖一些内容。但是,如果我在一个阶段中使用environment {}指令,则其他阶段将无法访问var。最初,我认为我可以在top环境指令中使用默认值定义它们,并在管道中覆盖它们,但这是我观察到的行为: 在环境块中定义var 尝试覆盖script {}块,例如: 该环境不会被覆盖 如何更改环境? 问题答案: 您可以按照

  • 我这里有两个集合: } 和 “设备”集合中的访客日志是指第二个集合,即访客日志。 我需要找到每个目的访问次数最多的单位。 我在mongo shell中尝试过: 我得到以下结果: 这意味着,例如,编号为05in12in2的单位的访问量最大,其目的是“业务” 我现在想获得05in12in2的“商务”访问次数。我认为它在第一个小组阶段的“计数”变量中。 我如何访问它?我在倒数第二个阶段尝试了,即在限制阶

  • 我想将GitLab CI与.gitlab-ci.yml文件一起使用以使用单独的脚本运行不同的阶段。第一阶段生成一个工具,该工具必须在稍后阶段用于执行测试。我已将生成的工具声明为工件。 现在我如何在后期工作中执行该工具?正确的路径是什么,它周围会有哪些文件? 例如,第一阶段构建工件/bin/TestTool/TestTool。exe,该目录包含其他必需的文件(DLL和其他文件)。我的gitlab c

  • 我试着从一个片段到主要片段。编译器不喜欢我的代码,但我不确定是什么问题。转换片段的最佳实践是什么? //这是我要导航到的主片段的xml 2019-07-12 17:49:45.091 959 4-9594/com.example.cribb E/AndroidRuntime:致命异常:主进程:com.example.cribb,PID:9594 Android.content.res.resour

  • 我正在JavaFX 2.0中制作一个应用程序。从我的主窗口开始一个带有一些设置的新窗口。调整完设置后,我想按一个像“保存更改”这样的按钮。 我想用这个按钮保存更改并关闭窗口。我所说的关闭意味着杀死它,而不是把它放在背景中或设置可见性。我读过关于方法阶段的书。关闭() http://docs.oracle.com/javafx/2.0/api/javafx/stage/Stage.html 正如您所