在GoCD中使用环境变量

访问任务中的环境变量

在运行时,GoCD中的每个任务都会提供一组环境变量作为环境的一部分。 根据任务中使用的进程种类,环境变量的访问方式不同。 以下呈现的是一些常见的使用场景,假设作业已使用名为ENV_VAR_1的环境变量进行配置,值为VALUE_1

1.在Unix/Linux的自定义命令中使用环境变量

环境变量的一个非常常见的用例是将它们用作自定义命令的参数(在GoCD中的“exec task”)。假设你想将环境变量ENV_VAR_1传递给ls命令,你可能会试图尝试这样的事情:

Figure 1: Wrong usage of environment variable
图1:自定义命令任务中环境变量的错误使用(不起作用)

运行时,它将以如下消息结束:

Figure 2: Result of wrong usage of environment variable
图2:自定义命令任务中错误使用环境变量的结果

正如你所看到的,环境变量$ ENV_VAR_1被直接传递给命令ls并且没有插入。这里发生的事情是,GoCD直接执行命令并传递参数,而不涉及中间的bash或sh之类的shell。 当从命令行执行诸如ls $ENV_VAR_1这样的命令时,shell进程会插入环境变量并将其替换为其值,以使ls命令看不到它。

所以,我们需要在这里做同样的事情。 调用此方法的正确方法,以便环境变量的插值工作如下所示:

Figure 3: Correct usage of environment variable
图3:在自定义命令任务中正确使用环境变量

运行时,它将以如下消息结束:

Figure 4: Result of correct usage of environment variable
图4:在自定义命令任务中正确使用环境变量的结果

即使在本例中该命令失败,环境变量的值也被插值了。 你可以用其他命令替换ls,但是这个概念保持不变。

2.在Windows上的自定义命令中使用环境变量

这比在shell脚本中使用它更容易,因为在Windows GoCD代理上,命令通过将它们包装在cmd/c中来执行。 所以,环境变量会自动插入。 所以,通过这样的配置:

Figure 5: Usage of environment variable on Windows
图5:在Windows上使用环境变量

运行时,它将以如下消息结束:

Figure 6: Result of usage of environment variable on Windows
图8:在Windows上使用环境变量的结果

同样,它在批处理文件(例如“env_var.cmd”)中使用时的工作方式如下所示:

echo Environment variable ENV_VAR_1 is: %ENV_VAR_1%

请注意,与Unix/Linux不同,在Windows上访问环境变量的方式是使用%,而不是$。

3.在shell脚本中使用环境变量 - 在Unix/Linux上

在shell脚本中使用环境变量并不特别。您可以直接使用它,就像任何环境变量一样。例如,带有这个内容的shell脚本在正常执行时会工作:

#!/bin/sh

echo "Value of environment variable ENV_VAR_1 is: $ENV_VAR_1"

这可以在直接执行时使用,例如:

Figure 9: Usage of environment variable in a shell-script
图9:在shell脚本中使用环境变量

运行时,它将以如下消息结束:

Figure 10: Result of usage of environment variable in a shell-script
图10:在shell脚本中使用环境变量的结果

4.在ruby脚本中使用环境变量

同样,在ruby脚本中使用环境变量并不特别。这里已经提到了这一点,只是为了说明用不同语言编写的脚本必须使用不同的机制来访问环境变量。 像这样的ruby脚本按预期工作:

#!/usr/bin/env ruby

puts "Environment variable ENV_VAR_1 has the value: #{ENV['ENV_VAR_1']}"

标准GoCD环境变量

上面的示例提到了在作业级别设置的自定义环境变量。 但是,在每次作业运行期间都有一些标准环境变量,由GoCD设置。 他们是:

Environment Variable Description Example contents
GO_SERVER_URL GoCD服务器的基本URL(包括根域名) https://127.0.0.1:8154/go
GO_ENVIRONMENT_NAME 当前环境的名称。 这仅在指定环境时设置。 否则,该变量未设置。 Development
GO_PIPELINE_NAME 当前正在运行的管道的名称 main
GO_PIPELINE_COUNTER 当前管道运行了多少次。 2345
GO_PIPELINE_LABEL 当前管道的标签。 默认情况下,这被设置为流水线计数(这可以设置为自定义流水线标签) 1.1.2345
GO_STAGE_NAME 正在运行的当前阶段的名称 dev
GO_STAGE_COUNTER 现阶段已经运行了多少次 1
GO_JOB_NAME 当前正在运行的作业的名称 linux-firefox
GO_TRIGGER_USER 触发构建的用户的用户名。 这将具有三种可能值之一
  • 匿名 - 如果没有安全性
  • 用户的用户名,谁触发构建
  • 更改,如果SCM更改自动 如果管道在预定时间触发,则触发构建
  • 计时器
changes
GO_DEPENDENCY_LABEL_${pipeline name} 上游管道的标签(使用依赖管道时) 1.0.3456
GO_DEPENDENCY_LOCATOR_${pipeline name} 上游管道的定位符(使用依赖管道时),可用于创建RESTful API调用的URL upstream/1.0.3456/dev/1
GO_REVISION 正在运行的当前源代码管理修订版(仅使用一种材料时) 123
GO_REVISION_${material name or dest} 如果您在管道中使用多种材料,则每种材料的修订版都可用。 该环境变量是使用材质的“materialName”属性命名的。 如果未定义“materialName”,则使用“dest”目录。 非字母数字字符替换为下划线(“_”)。 123
GO_TO_REVISION 如果管道是由一系列源代码控制版本(比如121到123)触发的,那么这个环境变量具有最新版本的值(仅使用一种材料时)。 这和GO _REVISION一样。 123
GO_TO_REVISION_${material name or dest} 如果您在管道中使用多种材料,则可以使用每种材料的“至”修订版。 该环境变量是使用材质的“materialName”属性命名的。 如果未定义“materialName”,则使用“dest”目录。 非字母数字字符替换为下划线(“_”)。 123
GO_FROM_REVISION 如果管道是由一系列源控制版本(例如121到123)触发的,则此环境变量具有最旧版本的值(仅使用一种材料时) 121
GO_FROM_REVISION_${material name or dest} 如果您在管道中使用多种材料,则每种材料的“从”版本都可用。 该环境变量是使用材质的“materialName”属性命名的。 如果未定义“materialName”,则使用“dest”目录。 非字母数字字符替换为下划线(“_”)。 121

在构建中使用当前修订版

在构建中使用当前版本控制修订版本号通常很有用。 例如,您可能希望在二进制文件的名称中使用svn版本号用于跟踪目的。 GoCD将这些信息作为环境变量提供给构建脚本。

示例用法

一种材料

对于这个例子,我们假设我们正在为我们的源代码管理系统使用一个Subversion存储库,并且我们有一个工作可以调用ant目标“dist”。

  • 将以下目标添加到您的antbuild.xml
<project name="test-build">
  <property environment="env" />
  <target name="dist">
    <echo message="Building pipeline ${env.GO_PIPELINE_NAME}"
          file="deploy-${env.GO_REVISION}.txt" />
  </target>
</project>
  • 现在,当GoCD在版本123上运行'my-app'管道时,将创建文件deploy-123.txt,其中包含以下内容:
deploy-123.txt

Building pipeline my-app

多种材料

在这个例子中,我们假定我们使用的是一个Subversion存储库,其中包含代码和Mercurial存储库包含配置脚本。

  • 确保管道材料看起来像这样
<pipeline name="multiple-materials">
  <materials>
    <svn url="..." dest="code" />
    <hg url="..." dest="configuration/latest" />
  </materials>
  ...
</pipeline>
  • 将以下目标添加到您的antbuild.xml
<project name="my-app">
  <property environment="env" />
  <target name="dist">
    <echo message="Building pipeline ${env.GO_PIPELINE_NAME}"
          file="deploy-${env.GO_REVISION_CODE}.txt" />
    <echo message="Configuration version: ${env.GO_REVISION_CONFIGURATION_LATEST}"
          file="deploy-${env.GO_REVISION_CODE}.txt"
          append="true" />
  </target>
</project>
  • 现在,当GoCD运行修订版本为'123'的代码和修订版本为'59cab75ccf231b9e338c96cff0f4adad5cb7d335'的'my-app'管道时,将会使用以下内容创建deploy-123.txt文件:
deploy-123.txt

Building pipeline my-app
Configuration version: 59cab75ccf231b9e338c96cff0f4adad5cb7d335

将环境变量传递给作业

您可以为环境,管道,阶段和作业指定变量。 如果多次指定变量,则使用最具体的范围。 例如,如果您为某个环境指定了变量FOO ='foo',并且对于某个作业指定了FOO ='bar',则该作业运行时该变量将具有值'bar'。

在环境中设置变量

您可以通过编辑环境配置将变量添加到环境中。 点击环境的名称来编辑配置。

通过向环境定义添加<环境变量>部分,可以在Config XML的环境中指定变量。

<environment name="UAT">
    <environmentvariables>
        <variable name="FOO">
            <value>bar</value>
        </variable>
        <variable name="MULTIPLE_LINES">
            <value>Variable values can have
            multiple lines (assuming that your operating system supports this correctly).
            </value>
        </variable>
        <variable name="COMPLEX">
            <value><![CDATA[<complex
            values>]]>
            </value>
        </variable>
    </environmentvariables>
    <agents />
    <pipelines />
</environment>

您可以通过编辑作业配置为作业添加变量。

通过在作业定义中添加一个<环境变量>部分,可以在Config XML的作业中指定变量。

<job name="my-job">
    <environmentvariables>
       <variable name="FOO">
            <value>bar</value>
        </variable>
        <variable name="MULTIPLE_LINES">
            <value>Variable values can have
            multiple lines (assuming that your operating system supports this correctly).
            </value>
        </variable>
        <variable name="COMPLEX">
            <value><![CDATA[<complex
            values>]]>
            </value>
        </variable>
    </environmentvariables>
    ...
</job>

results matching ""

    No results matching ""