在GoCD中使用环境变量

    您的查询搜索没有结果。

    在GoCD中使用环境变量

    在任务中访问环境变量

    每个在GoCD中的任务在运行时都会被提供一组环境变量,作为上下文的一部分。根据任务中使用的进程类型不同,环境变量的访问方式也有所不同。下面是一些常见的使用场景,假设一个作业已经配置了一个名为ENV_VAR_1的环境变量,其值为VALUE_1.

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

    环境变量的一个常见用例是将其作为参数用于自定义命令(GoCD中的“exec任务”)。假设您希望将环境变量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还会设置一些标准环境变量。它们是:

    环境变量 描述 示例内容
    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 触发构建的用户的用户名。这将有三个可能的值之一
    • 匿名 - 如果没有安全设置
    • 触发构建的用户的用户名
    • 变更,如果SCM变更自动触发构建
    • 定时器,如果管道在指定时间触发
    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>