如何将 exe 输出分配给 gitlab ci 脚本中的变量?

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作业完成后,管道将被标记为“失败”并停止。