GitLab变量未在运行时翻译



我有一个GitLab Runner,连接到一个真正的设备(作为服务器或类似的)。我用GitLab和我的Runner来自动化这个设备,基本上是远程控制它。现在我想给设备输入一个变量。在这种情况下,IP地址,我想通过GitLab变量来实现。

问题是,在运行时,变量没有替换为实际的IP地址,它以GitLab变量格式降落到设备。这会导致服务器发送错误,因为它无法理解给定的值。

是否有任何方法我可以通过GitLab变量使用,允许我给这个设备这个参数,确保变量在发送之前被实际参数取代?

谢谢

我是这样在gitlab-ci文件中定义参数的:

variables:
IPADDRESS_1: 170.x.x.10
...

另一个文件是服务器(实际设备)的yml配置文件。

注意:这不是GitLab -ci文件,而是一个服务器特定的yml配置文件,它是从GitLab复制到服务器本身的。

...
export_version: '0.2'
name: Example configuration yml
host: ${IPADDRESS_1}
...

这是来自服务器的错误消息(注意变量没有被翻译):

"errors": {
"invalid_ip": [
{
"id": null,
"name": "Example configuration yml",
"host": "${IPADDRESS_1}",
...

关于问题本身- " GitLab变量未在运行时翻译";-为什么呢?Gitlab运行器只是在你选择的shell中执行命令,一个合适的shell不会修改你的文件,除非你显式地告诉它。

使用bash将变量替换为文件中的值的最简单方法是使用envsubst命令。按人计算:

envsubst -替换shell格式字符串中的环境变量

在正常运行模式下,标准输入被复制到标准输出,对$VARIABLE或${VARIABLE}形式的环境变量的引用被替换为相应的值。如果给出了SHELL-FORMAT,则只替换那些在SHELL-FORMAT中引用的环境变量;否则,在标准输入中出现的所有环境变量引用都是替换.

所以在您的情况下,假设您已将IPADDRESS_1设置为gitlab中的170.x.x.10,并有一个名为test.yaml的文件,其中包含以下内容:

"errors": {
"invalid_ip": [
{
"id": null,
"name": "Example configuration yml",
"host": "${IPADDRESS_1}",

执行命令
envsubst < test.yaml > substituted.yaml

将创建或覆盖,如果您已经有这个文件名的文件,substituted.yaml,内容如下:

"errors": {
"invalid_ip": [
{
"id": null,
"name": "Example configuration yml",
"host": "170.x.x.10",

请注意,您不能使用shell重定向(即使用envsubst < test.yaml > test.yaml)读写同一个文件,因为这样做只会擦除test的内容。Yaml,参见https://unix.stackexchange.com/questions/36261/can-i-read-and-write-to-the-same-file-in-linux-without-overwriting-it

要在本地测试,您可以在运行上一个命令之前使用export IPADDRESS_1=170.x.x.10

如果你有一些复杂的,并希望生成yaml(或任何其他文本文件),基于一些变量,我建议你使用某种模板引擎,即Jinja。

最新更新