如何将值传递给来自文件的gitlab管道变量
How to pass values to gitlab pipeline variable sourced from a file
例如我的文件是test.env
test.env has the content
export SAMPLE="true"
我希望在 运行 管道
之前将变量 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'
有没有什么方法可以预先获取变量,然后设置管道变量,以便可以根据这些管道变量执行
目前使用 Gitlab CI 无法提供用作环境变量的文件,至少不能像您所说的那样。但是还有其他一些选择。
首先是获取您在 test.env
文件中拥有的所有单个变量,并将它们存储为单独的秘密变量。您可以通过转到项目设置 -> CI/CD, -> 变量来设置这些。此处定义的环境变量将在该项目的每个管道作业中自动可用(尽管您可以 select Protect Variable
复选框,这只会使变量可用于受保护分支上的管道)。
下一个选项是复制整个 test.env
文件内容,返回项目的秘密变量(如上所述),但这次将变量类型更改为“文件”,然后粘贴文件内容作为价值。当您使用“文件”类型变量时,Gitlab 将在您的每个管道作业中创建一个临时文件(同样,除非您选中“保护变量”选项)。然后该文件的路径将存储为 env 变量,其中包含您 select 编辑的密钥。这将允许您执行 cat $my_file_variable
之类的操作,其计算结果为 cat /path/to/temporary/file
,然后 cat 内容。
最后一个最接近您的原始请求的选项是在所有其他需要 test.env
文件的作业之前添加一个作业,如下所示:
stage: env_setup # or whatever
script:
- : # this is the bash Null Command that does nothing and always succeeds
artifacts:
reports:
dotenv: test.env
对于这项工作,唯一的目的是将您的 test.env
文件变成环境变量。我们不需要用它做任何其他事情,所以我们对脚本部分使用 Null 命令(因为至少没有 script
部分的作业将失败)。 artifacts
部分是这里的重要内容。 Gitlab 支持一种名为 dotenv
的特殊报告类型,它接受一个参数:文件路径。该文件将像其他任何工件一样作为工件上传,但对于后续作业(或使用 dependencies
关键字和 this 作业名称的作业)而不是将工件拉下来一个文件,test.env
中的每一项都会变成一个环境变量,所以你可以像$SAMPLE
等那样使用它
我个人更喜欢前两个选项而不是第三个选项,在前两个选项中,第二个选项最简单,因为您只需将现在拥有的文件复制并粘贴到一个变量中即可。第三个选项不理想的原因是它仍然允许您在 git 存储库中拥有敏感变量(如密码),从安全角度来看这并不理想。前两个选项中的任何一个都可以解决这个问题。
例如我的文件是test.env
test.env has the content
export SAMPLE="true"
我希望在 运行 管道
之前将变量 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'
有没有什么方法可以预先获取变量,然后设置管道变量,以便可以根据这些管道变量执行
目前使用 Gitlab CI 无法提供用作环境变量的文件,至少不能像您所说的那样。但是还有其他一些选择。
首先是获取您在 test.env
文件中拥有的所有单个变量,并将它们存储为单独的秘密变量。您可以通过转到项目设置 -> CI/CD, -> 变量来设置这些。此处定义的环境变量将在该项目的每个管道作业中自动可用(尽管您可以 select Protect Variable
复选框,这只会使变量可用于受保护分支上的管道)。
下一个选项是复制整个 test.env
文件内容,返回项目的秘密变量(如上所述),但这次将变量类型更改为“文件”,然后粘贴文件内容作为价值。当您使用“文件”类型变量时,Gitlab 将在您的每个管道作业中创建一个临时文件(同样,除非您选中“保护变量”选项)。然后该文件的路径将存储为 env 变量,其中包含您 select 编辑的密钥。这将允许您执行 cat $my_file_variable
之类的操作,其计算结果为 cat /path/to/temporary/file
,然后 cat 内容。
最后一个最接近您的原始请求的选项是在所有其他需要 test.env
文件的作业之前添加一个作业,如下所示:
stage: env_setup # or whatever
script:
- : # this is the bash Null Command that does nothing and always succeeds
artifacts:
reports:
dotenv: test.env
对于这项工作,唯一的目的是将您的 test.env
文件变成环境变量。我们不需要用它做任何其他事情,所以我们对脚本部分使用 Null 命令(因为至少没有 script
部分的作业将失败)。 artifacts
部分是这里的重要内容。 Gitlab 支持一种名为 dotenv
的特殊报告类型,它接受一个参数:文件路径。该文件将像其他任何工件一样作为工件上传,但对于后续作业(或使用 dependencies
关键字和 this 作业名称的作业)而不是将工件拉下来一个文件,test.env
中的每一项都会变成一个环境变量,所以你可以像$SAMPLE
等那样使用它
我个人更喜欢前两个选项而不是第三个选项,在前两个选项中,第二个选项最简单,因为您只需将现在拥有的文件复制并粘贴到一个变量中即可。第三个选项不理想的原因是它仍然允许您在 git 存储库中拥有敏感变量(如密码),从安全角度来看这并不理想。前两个选项中的任何一个都可以解决这个问题。