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

Posted

技术标签:

【中文标题】如何将 exe 输出分配给 gitlab ci 脚本中的变量?【英文标题】:How do I assign exe output to a variable in gitlab ci scripts? 【发布时间】:2021-06-15 23:16:08 【问题描述】:

在运行我的 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 != ''
    

svn 命令有效并回显正确的回复,但$DIR_CHECK 没有设置为原始默认。它不存储从 svn 命令返回的字符串。

如何将 exe 返回的字符串存储在 gitlab ci 的变量中?

试运行:

执行作业脚本的“step_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 清理基于文件的变量 00:01 作业成功

【问题讨论】:

试试DIR_CHECK=$(your-command)(没有$= 周围没有空格)。 @AdamMarshall,感谢您的建议,但结果是一样的 :-( 哦,我最初误读了您的管道定义。在单个作业中创建(或修改)变量时,它仅存在于该作业中。如果您在您的setup 作业脚本中添加您的echo $DIR_CHECK,它应该会显示svn 命令的输出。然后,当test 作业运行时,它使用全局变量,因为它在test 作业中不存在。 我不确定这是否有效 - 我已经附上了上面的测试运行。如果是这种情况,我如何在一个块中设置一个变量并在另一个块中引用它? 【参考方案1】:

在作业之间传递变量

很遗憾,您不能按照您描述的方式使用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 或使用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 执行几乎相同的操作,但检查DIR_CHECK 是否与if [ -n "$DIR_CHECK" ] 不为空。

当您的管道不包含很多步骤,但在 testotherDebugJob 之后再执行几个步骤时,此方法很有用。

第二种方法

您可以使您的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 作业之后,管道将被标记为失败并停止。

【讨论】:

以上是关于如何将 exe 输出分配给 gitlab ci 脚本中的变量?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 GitLab CI 的管道中将变量的值从一个作业传递到下一个作业?

如何将值传递给 Gitlab CI 作业

如何将 gitlab ci/cd 变量传递给 kubernetes(AKS) deployment.yaml

如何能够将变量传递给 gitlab ci 管道中的规则?

如何将 gitlab CI 作业设置为 true?

我需要通过 gitlab-ci 中的 ssh 将 env 变量传递给 docker