如何将值传递给来自文件的 gitlab 管道变量

Sou*_*awe 4 gitlab gitlab-ci gitlab-ci-runner cicd

例如我的文件是 test.env

test.env has the content

export SAMPLE="true"
Run Code Online (Sandbox Code Playgroud)

我希望在运行管道之前将变量 SAMPLE 设置为管道变量

我正在尝试下面提到的解决方案,但它并没有真正帮助

before_script:
  - git clone test.env
  - source test.env

stages:
  - publish

test:
  stage: publish
  trigger:
    project: test_pipeline
    branch: master
    strategy: depend
  only:
   variables:      
      - $SAMPLE == 'True'
Run Code Online (Sandbox Code Playgroud)

有没有办法预先获取变量,然后设置管道变量,以便可以根据这些管道变量执行

Ada*_*all 9

目前,Gitlab CI 无法提供用作环境变量的文件,至少不能按照您所说的方式。不过,还有其他一些选择。

\n

首先是获取test.env文件中的所有单独变量并将它们存储为单独的秘密变量。您可以通过转到项目的设置 -> CI/CD -> 变量来设置这些。此处定义的环境变量将自动在该项目的每个管道作业中可用(尽管您可以选中该Protect Variable复选框,这只会使该变量可用于受保护分支上的管道)。

\n

下一个选项是复制整个test.env文件内容,返回到您的项目\xe2\x80\x99s Secret Variables(如上所述),但这次将变量类型更改为“File”,并将文件内容粘贴为值。当您使用“文件”类型变量时,Gitlab 将在每个管道作业中创建一个临时文件(同样,除非您选中“保护变量”选项)。然后该文件的路径将使用您选择的键存储为环境变量。这将允许您执行诸如 之类的操作cat $my_file_variable,它将评估为cat /path/to/temporary/file,然后 cat 内容。

\n

test.env最接近您原始请求的最后一个选项是在需要如下文件的所有其他作业之前添加一个作业:

\n
stage: env_setup # or whatever\n  script:\n    - : # this is the bash Null Command that does nothing and always succeeds\n  artifacts:\n    reports:\n      dotenv: test.env\n
Run Code Online (Sandbox Code Playgroud)\n

对于这项工作,唯一的目的是将您的test.env文件变成环境变量。我们不需要用它做任何其他事情,因此我们对脚本部分使用 Null 命令(因为至少没有该script部分的作业将会失败)。该artifacts部分是这里的重要内容。Gitlab 支持一种名为“Report”的特殊报告类型dotenv,它采用单个参数:文件的路径。该文件将像任何其他文件一样作为工件上传,但对于后续作业(或使用带有dependencies作业名称的关键字的作业),而不是将工件作为文件下拉,其中的每个项目都将转换为环境变量,因此你可以像这样使用它test.env$SAMPLE你可以像这样

\n

就我个人而言,我更喜欢前两个选项而不是第三个,在前两个选项中,第二个是最简单的,因为您只需将现在的文件复制并粘贴到变量中即可。第三个选项不理想的原因是它仍然允许您在 git 存储库中拥有敏感变量(例如密码),从安全角度来看这并不理想。前两个选项中的任何一个都可以消除该问题。

\n