Ste*_*fan 8 svn bash gitlab gitlab-ci
运行 gitlab ci 时,我需要检查指定的 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 != ''
Run Code Online (Sandbox Code Playgroud)
svn 命令可以工作并回显正确的回复,但$DIR_CHECK不会设置为除原始默认值之外的任何内容。它不存储 svn 命令返回的字符串。
如何将从 exe 返回的字符串存储在 gitlab ci 的变量中?
测试运行:
执行作业脚本的“step_script”阶段 00:00 $ $DIR_CHECK = $(svn ls https://server.fsl.local:port/svn/myco/personal/TestNotReal -- 深度为空) svn: E170000: 非法存储库URL https://server.fsl.local:port/svn/myco/personal/TestNotReal' $ echo $DIR_CHECK 清理基于文件的变量 00:01 作业成功
Iva*_*lev 12
DIR_CHECK不幸的是,您不能按照您描述的方式使用变量。要执行的步骤列表在步骤实际运行之前生成,这意味着所有步骤都DIR_CHECK将等于default。首先,有一些关于如何在作业之间传递变量的提示:
第一种方式
您可以将所需的命令添加到模板before_script中的部分.csharp:
.csharp:
before_script:
- export DIR_CHECK=$(svn ls https://server.fsl.local:port/svn/myco/personal/TestNotReal --depth empty)
Run Code Online (Sandbox Code Playgroud)
并以此扩展其他步骤.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
Run Code Online (Sandbox Code Playgroud)
staging:
variables:
DIR_CHECK: "you are awesome, guys!"
stage: deploy
trigger: my/deployment
Run Code Online (Sandbox Code Playgroud)
在触发的管道中,您的变量将在一开始就存在,并且所有规则都将正确应用。
在您的情况下,如果您确实不想otherDebugJob在管道中包含步骤,您可以执行以下操作:
第一种方法
这是非常简单的方法,并且会起作用,但看起来不是最佳实践。因此,我们已经知道如何DIR_CHECK从步骤传递变量,只需在步骤块setup中添加一些检查即可:testscript
script:
- |
if [ -z "$DIR_CHECK" ]; then
exit 0
fi
- echo "DIR_CHECK is blank"
- echo $DIR_CHECK
Run Code Online (Sandbox Code Playgroud)
对 执行几乎相同的操作,otherDebugJob但检查 是否DIR_CHECK不为空if [ -n "$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
Run Code Online (Sandbox Code Playgroud)
如果您只想在此setup步骤之后进行一些调试,则此方法非常有用。所有on_failure作业完成后,管道将被标记为“失败”并停止。