在GoCD中使用环境变量
在任务中访问环境变量
每个在GoCD中的任务在运行时都会被提供一组环境变量,作为上下文的一部分。根据任务中使用的进程类型不同,环境变量的访问方式也有所不同。下面是一些常见的使用场景,假设一个作业已经配置了一个名为ENV_VAR_1
的环境变量,其值为VALUE_1
.
1. 在Unix/Linux上的自定义命令中使用环境变量
环境变量的一个常见用例是将其作为参数用于自定义命令(GoCD中的“exec任务”)。假设您希望将环境变量ENV_VAR_1
传递给ls
命令,您可能会尝试这样做:

运行时,它将以类似这样的消息结束:

如您所见,环境变量$ENV_VAR_1
被直接传递给命令ls
并未被解析。这里发生的情况是,GoCD直接执行命令并传递参数,而没有涉及bash或sh等shell。当从命令行执行像ls $ENV_VAR_1
这样的命令时,shell进程会解析环境变量并将其替换为其值,从而使ls
命令看不到它。
因此,我们需要在这里做同样的事情。要正确调用以使环境变量解析正常工作,方法如下:

运行时,它将以类似这样的消息结束:

尽管在此示例中命令失败了,但环境变量的值已被解析。您可以将ls
替换为其他命令,但概念保持不变。
2. 在Windows上的自定义命令中使用环境变量
这比在shell脚本中使用更容易,因为在Windows GoCD代理上,命令通过将其包装在cmd /c
中执行。因此,环境变量自动解析。例如,使用以下配置:

运行时,它将以类似这样的消息结束:

同样,在批处理文件中(如“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"
使用此配置直接执行时,它会正常工作:

运行时,它将以类似这样的消息结束:

4. 在ruby脚本中使用环境变量
再次强调,在ruby脚本中使用环境变量并不特殊。这里提到了这一点,只是为了说明用不同语言编写的脚本需要使用不同的机制来访问环境变量。像这样的ruby脚本可以按预期工作:
#!/usr/bin/env ruby
puts "Environment variable ENV_VAR_1 has the value: #{ENV['ENV_VAR_1']}"
标准GoCD环境变量
上述示例提到的是在作业级别设置的自定义环境变量。但是,在每次作业运行期间,GoCD还会设置一些标准环境变量。它们是:
环境变量 | 描述 | 示例内容 |
---|---|---|
GO_SERVER_URL | GoCD服务器的基本URL(包括上下文根) | http://127.0.0.1:8153/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 | 触发构建的用户的用户名。这将有三个可能的值之一
|
changes |
GO_DEPENDENCY_LABEL_${管道名称或材料名称} | 上游管道的标签(当使用依赖管道时)。非字母数字字符被替换为下划线(“_”)。例如,上游管道“pipeline-foo”变为:GO_DEPENDENCY_LABEL_PIPELINE_FOO。如果是材料名称,则例如材料“foo”变为:GO_DEPENDENCY_LABEL_FOO | 1.0.3456 |
GO_DEPENDENCY_LOCATOR_${管道名称} | 上游管道的定位器(当使用依赖管道时),可以用于创建RESTful API调用的URL | upstream/1.0.3456/dev/1 |
GO_REVISION | 当前正在运行的源代码控制修订版(仅使用一个材料,并且不设置材料名称或检出目标时) | 123 |
GO_REVISION_${材料名称或目标} | 如果命名了材料,或者在管道中使用多个材料,则每个材料的修订版都可用。环境变量以材料的“materialName”属性命名。如果未定义“materialName”,则使用“dest”目录。非字母数字字符被替换为下划线("_")。 | 123 |
GO_TO_REVISION | 如果管道是通过一系列源代码控制修订版触发的(例如从121到123),那么此环境变量具有最新修订版的值(仅使用一个材料,并且不设置材料名称或检出目标时)。这始终与GO_REVISION相同。 | 123 |
GO_TO_REVISION_${材料名称或目标} | 如果命名了材料,或者在管道中使用多个材料,则每个材料的“to”修订版都可用。环境变量以材料的“materialName”属性命名。如果未定义“materialName”,则使用“dest”目录。非字母数字字符被替换为下划线("_")。 | 123 |
GO_FROM_REVISION | 如果管道是通过一系列源代码控制修订版触发的(例如从121到123),那么此环境变量具有最旧修订版的值(仅使用一个材料,并且不设置材料名称或检出目标时) | 121 |
GO_FROM_REVISION_${材料名称或目标} | 如果命名了材料,或者在管道中使用多个材料,则每个材料的“from”修订版都可用。环境变量以材料的“materialName”属性命名。如果未定义“materialName”,则使用“dest”目录。非字母数字字符被替换为下划线("_")。 | 121 |
GO_MATERIAL_HAS_CHANGED | 布尔值,表示自上次运行以来材料修订版是否已更改(仅使用一个材料,并且不设置材料名称或检出目标时) | true |
GO_MATERIAL_${材料名称或目标}_HAS_CHANGED | 如果命名了材料,或者在管道中使用多个材料,则会为每个材料提供一个标志,表示自上次运行以来相应材料的修订版是否已更改。环境变量以材料的“materialName”属性命名。如果未定义“materialName”,则使用“dest”目录。非字母数字字符被替换为下划线("_")。 | false |
在构建中使用当前修订版
通常在构建中使用当前版本控制系统修订号非常有用。例如,您可能希望在二进制文件名中使用svn版本号以便于追踪。GoCD将许多此类信息作为环境变量提供给您的构建脚本。
示例用法
单一材料
在这个例子中,我们将假设我们正在使用单一的Subversion源码控制系统仓库,并且我们已经设置了一个调用ant目标“dist”的作业。
- 在你的ant配置中添加以下目标
build.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>
- 在你的ant配置中添加以下目标
build.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中通过添加一个<environmentvariables>节点到环境定义中来指定环境变量。
<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中通过在作业定义中添加一个<environmentvariables>节点来指定作业变量。
<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>