Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何将exe输出分配给gitlab ci脚本中的变量?_Bash_Svn_Gitlab_Gitlab Ci_Script - Fatal编程技术网

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

Bash 如何将exe输出分配给gitlab ci脚本中的变量?,bash,svn,gitlab,gitlab-ci,script,Bash,Svn,Gitlab,Gitlab Ci,Script,运行gitlab ci时,我需要检查指定的svn目录是否存在 我在使用脚本: variables: DIR_CHECK: "default" stages: - setup - test - otherDebugJob .csharp: only: changes: - "**/*.cs" - "**/*.js" setup: script: - $DIR_CHE

运行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的变量中

试运行:

执行作业脚本00:00$$DIR\u检查的“步骤脚本”阶段= $(svn ls) --深度为空)svn:E170000:非法存储库URL$echo $DIR_CHECK清除基于文件的变量00:01作业成功

在作业之间传递变量 不幸的是,您不能按照您描述的方式使用
DIR\u CHECK
变量。在步骤实际运行之前生成要执行的步骤列表,这意味着对于所有步骤而言,
DIR\u CHECK
将等于
default
。首先,关于如何在作业之间传递变量,有几个技巧:

第一条路

您可以将所需的命令添加到
.csharp
模板中的
before\u 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
三分之路 您可以使用或将变量传递到管道中

staging:
  variables:
    DIR_CHECK: "you are awesome, guys!"
  stage: deploy
  trigger: my/deployment
在触发的管道中,变量将在最开始的时刻存在,并且所有规则都将正确应用

解决方案 在您的情况下,如果确实不想在管道中包含
otherDebugJob
步骤,可以执行以下操作:

第一种方法

这是一种非常简单的方法,而且会起作用,但看起来并不是一种最佳实践。因此,我们已经知道如何通过
setup
步骤中的
DIR\u检查变量,只需在
test
步骤
script
块中添加一些检查:

script:
- |
  if [ -z "$DIR_CHECK" ]; then
    exit 0
  fi
- echo "DIR_CHECK is blank"
- echo $DIR_CHECK
otherDebugJob
执行几乎相同的操作,但检查
DIR\u check
是否为空,如果[-n“$DIR\u check”]

当管道不包含很多步骤时,这种方法很有用,但在
test
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
如果您只想在此
设置
步骤之后进行一些调试,那么这种方法非常有用。在所有
on_failure
作业之后,管道将被标记为Failed并停止。

在作业之间传递变量 不幸的是,您不能按照您描述的方式使用
DIR\u CHECK
变量。在步骤实际运行之前生成要执行的步骤列表,这意味着对于所有步骤而言,
DIR\u CHECK
将等于
default
。首先,关于如何在作业之间传递变量,有几个技巧:

第一条路

您可以将所需的命令添加到
.csharp
模板中的
before\u 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
三分之路 您可以使用或将变量传递到管道中

staging:
  variables:
    DIR_CHECK: "you are awesome, guys!"
  stage: deploy
  trigger: my/deployment
在触发的管道中,变量将在最开始的时刻存在,并且所有规则都将正确应用

解决方案 在您的情况下,如果确实不想在管道中包含
otherDebugJob
步骤,可以执行以下操作:

第一种方法

这是一种非常简单的方法,而且会起作用,但看起来并不是一种最佳实践。因此,我们已经知道如何通过
setup
步骤中的
DIR\u检查变量,只需在
test
步骤
script
块中添加一些检查:

script:
- |
  if [ -z "$DIR_CHECK" ]; then
    exit 0
  fi
- echo "DIR_CHECK is blank"
- echo $DIR_CHECK
otherDebugJob
执行几乎相同的操作,但检查
DIR\u check
是否为空,如果[-n“$DIR\u check”]

当管道不包含很多步骤时,这种方法很有用,但在
test
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

如果您只想在此
设置
步骤之后进行一些调试,那么这种方法非常有用。在所有的
作业失败后,管道将被标记为失败并停止。

尝试
DIR\u CHECK=$(您的命令)
(no
$
,并且
=
周围没有空格)。@AdamMarshall,感谢您的建议,但结果是一样的:-(哦,我最初误读了您的管道定义。在创建(或修改)单个作业中的变量,它只存在于该作业中。如果在
设置
作业的脚本中添加
echo$DIR_CHECK
,它应该显示svn命令的输出。然后,当
测试
作业运行时,它使用全局变量,因为它不存在于
测试
作业中。我不确定这是否正确已工作-我已附加上面的测试运行。如果是这种情况,我如何在一个块中设置变量并引用另一个?请尝试
DIR\u CHECK=$(您的命令)
(无
$
,并且
=
周围没有空格)。@AdamMarshall,感谢您的建议,但结果是一样的:-(哦,我最初误读了您的管道定义。在创建(或修改)时)单个作业中的变量,它仅存在于该作业中。如果在
设置
作业的脚本中添加
echo$DIR_CHECK
,它应该显示svn命令的输出。然后,当
测试
作业运行时,它使用全局变量,因为它不会使用其他变量