如何将 exe 输出分配给 gitlab ci 脚本中的变量?
How do I assign exe output to a variable in gitlab ci scripts?
当运行连接我的gitlab时ci我需要检查specified svn目录是否存在
我正在使用脚本:
variables:
DIR_CHECK: "default"
stages:
- setup
- test
- otherDebugJob
.csharp:
only:
changes:
- "**/*.cs"
- "**/*.js"
setup:
script:
- $DIR_CHECK = $(svn ls https://server.fsl.local:port/svn/myco/personal/TestNotReal --depth empty)
- echo $DIR_CHECK
test:
script:
- echo "DIR_CHECK is blank"
- echo $DIR_CHECK
rules:
- if: $DIR_CHECK == ''
otherDebugJob:
script:
- echo "DIR_CHECK is not blank"
- echo $DIR_CHECK
rules:
- if: $DIR_CHECK != ''
svn 命令有效并回显正确的回复,但 $DIR_CHECK 没有设置为原始 default[=25 以外的任何内容=].它不存储从 svn 命令返回的字符串。
如何将 exe 返回的字符串存储在 gitlab 的变量中 ci?
测试运行:
Executing "step_script" stage of the job script 00:00 $ $DIR_CHECK =
$(svn ls https://server.fsl.local:port/svn/myco/personal/TestNotReal
--depth empty) svn: E170000: Illegal repository URL https://server.fsl.local:port/svn/myco/personal/TestNotReal' $ echo
$DIR_CHECK Cleaning up file based variables 00:01 Job succeeded
在作业之间传递变量
不幸的是,您不能按照您描述的方式使用 DIR_CHECK
变量。要执行的步骤列表在步骤实际运行之前生成,这意味着对于所有步骤 DIR_CHECK
将等于 default
。首先,有一些技巧可以在作业之间传递变量:
第一种方式
您可以将所需的命令添加到 .csharp
模板中的 before_script
部分:
.csharp:
before_script:
- export DIR_CHECK=$(svn ls https://server.fsl.local:port/svn/myco/personal/TestNotReal --depth empty)
并以此 .csharp
扩展其他步骤。
第二种方式
您可以在具有作业工件的作业之间传递变量:
setup:
stage: setup
script:
- DIR_CHECK=$(svn ls https://server.fsl.local:port/svn/myco/personal/TestNotReal --depth empty)
- echo "DIR_CHECK=$DIR_CHECK" > dotenv_file
artifacts:
reports:
dotenv:
- dotenv_file
第三种方式
您可以 trigger or use parent/child pipelines 将变量传递到管道中。
staging:
variables:
DIR_CHECK: "you are awesome, guys!"
stage: deploy
trigger: my/deployment
在触发的管道中,您的变量将在一开始就存在,并且所有规则都将正确应用。
解决方案
对于您的情况,如果您真的不想在管道中包含 otherDebugJob
步骤,您可以执行以下操作:
第一种方法
这是一种非常简单的方法,而且可行,但看起来不是最佳做法。所以,我们已经知道如何从 setup
步骤传递我们的 DIR_CHECK
变量,只需在 test
步骤 script
块中添加一些检查:
script:
- |
if [ -z "$DIR_CHECK" ]; then
exit 0
fi
- echo "DIR_CHECK is blank"
- echo $DIR_CHECK
对 otherDebugJob
执行几乎相同的操作,但使用 if [ -n "$DIR_CHECK" ]
检查 DIR_CHECK
是否不为空。
当您的管道不包含很多步骤但在 test
和 otherDebugJob
之后还有几个步骤时,此方法很有用。
第二种方法
您可以在 setup
步骤中失败,然后在 otherDebugJob
步骤中处理此失败:
setup:
script:
- DIR_CHECK=$(svn ls https://server.fsl.local:port/svn/myco/personal/TestNotReal --depth empty)
- |
if [ -z "$DIR_CHECK" ]; then
exit 1
fi
otherDebugJob:
script:
- echo "DIR_CHECK is not blank"
when: on_failure
如果您只想在此 setup
步骤之后进行一些调试,则此方法很有用。在所有 on_failure
个作业之后,管道将被标记为 Failed 并停止。
当运行连接我的gitlab时ci我需要检查specified svn目录是否存在
我正在使用脚本:
variables:
DIR_CHECK: "default"
stages:
- setup
- test
- otherDebugJob
.csharp:
only:
changes:
- "**/*.cs"
- "**/*.js"
setup:
script:
- $DIR_CHECK = $(svn ls https://server.fsl.local:port/svn/myco/personal/TestNotReal --depth empty)
- echo $DIR_CHECK
test:
script:
- echo "DIR_CHECK is blank"
- echo $DIR_CHECK
rules:
- if: $DIR_CHECK == ''
otherDebugJob:
script:
- echo "DIR_CHECK is not blank"
- echo $DIR_CHECK
rules:
- if: $DIR_CHECK != ''
svn 命令有效并回显正确的回复,但 $DIR_CHECK 没有设置为原始 default[=25 以外的任何内容=].它不存储从 svn 命令返回的字符串。
如何将 exe 返回的字符串存储在 gitlab 的变量中 ci?
测试运行:
Executing "step_script" stage of the job script 00:00 $ $DIR_CHECK = $(svn ls https://server.fsl.local:port/svn/myco/personal/TestNotReal --depth empty) svn: E170000: Illegal repository URL https://server.fsl.local:port/svn/myco/personal/TestNotReal' $ echo $DIR_CHECK Cleaning up file based variables 00:01 Job succeeded
在作业之间传递变量
不幸的是,您不能按照您描述的方式使用 DIR_CHECK
变量。要执行的步骤列表在步骤实际运行之前生成,这意味着对于所有步骤 DIR_CHECK
将等于 default
。首先,有一些技巧可以在作业之间传递变量:
第一种方式
您可以将所需的命令添加到 .csharp
模板中的 before_script
部分:
.csharp:
before_script:
- export DIR_CHECK=$(svn ls https://server.fsl.local:port/svn/myco/personal/TestNotReal --depth empty)
并以此 .csharp
扩展其他步骤。
第二种方式
您可以在具有作业工件的作业之间传递变量:
setup:
stage: setup
script:
- DIR_CHECK=$(svn ls https://server.fsl.local:port/svn/myco/personal/TestNotReal --depth empty)
- echo "DIR_CHECK=$DIR_CHECK" > dotenv_file
artifacts:
reports:
dotenv:
- dotenv_file
第三种方式 您可以 trigger or use parent/child pipelines 将变量传递到管道中。
staging:
variables:
DIR_CHECK: "you are awesome, guys!"
stage: deploy
trigger: my/deployment
在触发的管道中,您的变量将在一开始就存在,并且所有规则都将正确应用。
解决方案
对于您的情况,如果您真的不想在管道中包含 otherDebugJob
步骤,您可以执行以下操作:
第一种方法
这是一种非常简单的方法,而且可行,但看起来不是最佳做法。所以,我们已经知道如何从 setup
步骤传递我们的 DIR_CHECK
变量,只需在 test
步骤 script
块中添加一些检查:
script:
- |
if [ -z "$DIR_CHECK" ]; then
exit 0
fi
- echo "DIR_CHECK is blank"
- echo $DIR_CHECK
对 otherDebugJob
执行几乎相同的操作,但使用 if [ -n "$DIR_CHECK" ]
检查 DIR_CHECK
是否不为空。
当您的管道不包含很多步骤但在 test
和 otherDebugJob
之后还有几个步骤时,此方法很有用。
第二种方法
您可以在 setup
步骤中失败,然后在 otherDebugJob
步骤中处理此失败:
setup:
script:
- DIR_CHECK=$(svn ls https://server.fsl.local:port/svn/myco/personal/TestNotReal --depth empty)
- |
if [ -z "$DIR_CHECK" ]; then
exit 1
fi
otherDebugJob:
script:
- echo "DIR_CHECK is not blank"
when: on_failure
如果您只想在此 setup
步骤之后进行一些调试,则此方法很有用。在所有 on_failure
个作业之后,管道将被标记为 Failed 并停止。