在经典发布管道中使用变量

Azure DevOps Services |Azure DevOps Server |Azure DevOps Server 2022

在经典发布管道中使用变量是在整个管道中交换和传输数据的一种便捷方式。 每个变量都存储为字符串,其值可以在管道运行之间更改。

与仅在模板分析时可用的 运行时参数不同,经典发布管道中的变量可在整个部署过程中访问。

设置任务以在经典发布管道的每个阶段部署应用程序时,变量可帮助你:

  • 简化自定义:定义一次通用部署管道,并轻松地针对不同的阶段对其进行调整。 例如,使用变量来表示 Web 部署的连接字符串,并根据需要为每个阶段调整其值。 这些变量称为 自定义变量

  • 利用上下文信息:访问有关发布上下文的详细信息,例如阶段项目或运行部署的代理。 例如,脚本可能需要生成位置进行下载,或者需要代理的工作目录来创建临时文件。 这些变量称为 默认变量

注意

有关 YAML 管道的详细信息,请参阅用户定义的变量预定义变量

提示

可以在本文后面使用 AI 来帮助完成此任务,或参阅启用 Azure DevOps MCP Server 的 AI 帮助以开始使用。

默认变量

默认变量为正在运行的任务和脚本提供有关执行上下文的基本信息。 这些变量允许你访问有关运行 它们的系统发布阶段代理 的详细信息。

除了 System.Debug 之外,默认变量是只读的,系统会自动设置其值。

下表描述了一些最重要的变量。 若要查看完整列表,请参阅查看所有变量的当前值

系统变量

变量名称 说明
System.TeamFoundationServerUri Azure Pipelines 中服务连接的 URL。 在脚本或任务中使用此变量来调用 Azure Pipelines REST API。

示例:https://fabrikam.vsrm.visualstudio.com/
System.TeamFoundationCollectionUri Team Foundation 集合或 Azure Pipelines 的 URL。 在脚本或任务中使用此变量,在生成和版本控制等其他服务上调用 REST API。

示例:https://dev.azure.com/fabrikam/
System.CollectionId 此生成或发布所属的集合的 ID。

示例:6c6f3423-1c84-4625-995a-f7f143a1e43d
System.DefinitionId 当前发布所属的发布管道的 ID。

示例:1
System.TeamProject 此生成或发布所属的项目的名称。

示例:Fabrikam
System.TeamProjectId 此构建或发布所属项目的 ID。

示例:79f5c12e-3337-4151-be41-a268d2c73344
System.ArtifactsDirectory 管道在发布部署期间下载项目的目录。 如果管道需要将项目下载到智能体,它会在每次部署前清除该目录。 与 Agent.ReleaseDirectorySystem.DefaultWorkingDirectory 相同。

示例:C:\agent\_work\r1\a
System.DefaultWorkingDirectory 管道在发布部署期间下载项目的目录。 如果管道需要将项目下载到智能体,它会在每次部署前清除该目录。 与 Agent.ReleaseDirectorySystem.ArtifactsDirectory 相同。

示例:C:\agent\_work\r1\a
System.WorkFolder 此智能体的工作目录,管道会在此处为每个生成或发布创建子文件夹。 与 Agent.RootDirectoryAgent.WorkFolder 相同。

示例:C:\agent\_work
System.Debug 这是用户可以 设置的唯一系统变量。 将此变量设置为true在调试模式下运行发布,以帮助查找故障。

示例:true

发布变量

变量名称 说明
Release.AttemptNumber 此版本在此阶段的部署次数。

示例:1
Release.DefinitionEnvironmentId 相应发布管道中阶段的 ID。

示例:1
Release.DefinitionId 当前发布所属的发布管道的 ID。

示例:1
Release.DefinitionName 当前发布所属的发布管道的名称。

示例:fabrikam-cd
Release.Deployment.RequestedFor 触发(启动)当前正在进行的部署的标识的显示名称。

示例:Mateo Escobedo
Release.Deployment.RequestedForEmail 触发(启动)当前正在进行的部署的标识的电子邮件地址。

示例:[email protected]
Release.Deployment.RequestedForId 触发(启动)当前正在进行的部署的标识的 ID。

示例:2f435d07-769f-4e46-849d-10d1ab9ba6ab
Release.DeploymentID 部署的 ID。 每个作业唯一。

示例:254
Release.DeployPhaseID 运行部署的阶段的 ID。

示例:127
Release.EnvironmentId 当前正在进行部署的发布中的阶段实例的 ID。

示例:276
Release.EnvironmentName 当前正在进行部署的阶段的名称。

示例:Dev
Release.EnvironmentUri 当前正在进行部署的发布中的阶段实例的 URI。

示例:vstfs://ReleaseManagement/Environment/276
Release.Environments.{stage-name}.status 阶段的部署状态。

示例:InProgress
Release.PrimaryArtifactSourceAlias 主要工件源的别名。

示例:fabrikam\_web
Release.Reason 部署的原因。 支持的值是:
ContinuousIntegration - 生成完成后,发布在持续部署中启动。
Manual - 该发布是手动启动的。
None - 未指定部署原因。
Schedule - 发布流程按计划启动。
Release.ReleaseDescription 发布时提供的文本说明。

示例:Critical security patch
Release.ReleaseId 当前发布记录的标识符。

示例:118
Release.ReleaseName 当前版本的名称。

示例:Release-47
Release.ReleaseUri 当前发布的 URI。

示例:vstfs://ReleaseManagement/Release/118
Release.ReleaseWebURL 此版本的 URL。

示例:https://dev.azure.com/fabrikam/f3325c6c/_release?releaseId=392&_a=release-summary
Release.RequestedFor 触发发布的标识的显示名称。

示例:Mateo Escobedo
Release.RequestedForEmail 触发发布的标识的电子邮件地址。

示例:[email protected]
Release.RequestedForId 触发发布的标识的 ID。

示例:2f435d07-769f-4e46-849d-10d1ab9ba6ab
Release.SkipArtifactsDownload 指定是否跳过将项目下载到智能体的布尔值。

示例:FALSE
Release.TriggeringArtifact.Alias 触发发布的项目的别名。 当计划或手动触发发布时,此值为空。

示例:fabrikam\_app

发布阶段变量

变量名称 说明
Release.Environments.{阶段名称}.状态 指定阶段内此发布的部署状态。

示例:NotStarted

代理变量

变量名称 说明
Agent.Name 代理池中注册的代理名称。 此名称可能不同于计算机名称。

示例:fabrikam-agent
Agent.MachineName 配置代理的计算机的名称。

示例:fabrikam-agent
Agent.Version 代理软件的版本。

示例:2.109.1
Agent.JobName 运行作业的名称,例如“发布”或“生成”。

示例:Release
Agent.HomeDirectory 安装代理的文件夹。 此文件夹包含代理的代码和资源。

示例:C:\agent
Agent.ReleaseDirectory 发布部署将项目下载到的目录。 如果部署需要将构件下载到代理,则会在每次部署之前清除此目录。 它与 System.ArtifactsDirectorySystem.DefaultWorkingDirectory 是相同的。

示例:C:\agent\_work\r1\a
Agent.RootDirectory 此代理的工作目录,用于为每次构建或发布创建子文件夹。 它与 Agent.WorkFolderSystem.WorkFolder 是相同的。

示例:C:\agent\_work
Agent.WorkFolder 此代理的工作目录,其中会为每次构建或发布创建子文件夹。 它与 Agent.RootDirectorySystem.WorkFolder 是相同的。

示例:C:\agent\_work
Agent.DeploymentGroupId 代理注册的部署组的 ID。 此 ID 仅在部署组作业中可用。

示例:1

发布项目变量

对于在发布中引用的每个项目,请使用以下项目变量。 请注意,并非所有变量都适用于每种项目类型。 下表列出了默认项目变量,并提供了基于项目类型的值的示例。 如果示例为空,则表示该变量不适用于该项目类型。

{alias} 占位符替换为为项目源别名指定的值,或替换为为发布管道生成的默认值。

变量名称 说明
Release.Artifacts.{alias}.DefinitionId 生成管道或存储库的标识符。示例:

Azure Pipelines:1
GitHub:fabrikam/asp
Release.Artifacts.{alias}.DefinitionName 生成管道或存储库的名称。示例:

Azure Pipelines:fabrikam-ci
TFVC:$/fabrikam
Git: fabrikam
GitHub:fabrikam/asp (main)
Release.Artifacts.{alias}.BuildNumber 构建号或提交标识符。示例:

Azure Pipelines:20170112.1
Jenkins:20170112.1
TFVC:Changeset 3
Git: 38629c964
GitHub:38629c964
Release.Artifacts.{alias}.BuildId 构建标识符。示例:

Azure Pipelines:130
Jenkins:130
GitHub:38629c964d21fe405ef830b7d0220966b82c9e11
Release.Artifacts.{alias}.BuildURI 生成的 URL。示例:

Azure Pipelines:vstfs://build-release/Build/130
GitHub:https://github.com/fabrikam/asp
Release.Artifacts.{alias}.SourceBranch 从中生成源的分支的完整路径和名称。示例:

Azure Pipelines:refs/heads/main
Release.Artifacts.{alias}.SourceBranchName 从中生成源的分支的唯一名称。示例:

Azure Pipelines:main
Release.Artifacts.{alias}.SourceVersion 生成的提交。示例:

Azure Pipelines:bc0044458ba1d9298cdc649cb5dcf013180706f7
Release.Artifacts.{alias}.Repository.Provider 从中生成源的存储库的类型。示例:

Azure Pipelines:Git
Release.Artifacts.{alias}.RequestedForID 触发构建的账户的标识符。示例:

Azure Pipelines:2f435d07-769f-4e46-849d-10d1ab9ba6ab
Release.Artifacts.{alias}.RequestedFor 请求构建的账户名称。示例:

Azure Pipelines: Mateo Escobedo
Release.Artifacts.{alias}.类型 项目源的类型,例如“生成”。 示例:

Azure Pipelines:Build
Jenkins:Jenkins
Azure DevOps Services: TFVC
Git: Git
GitHub:GitHub
Release.Artifacts.{alias}.PullRequest.TargetBranch 作为拉取请求目标的分支的完整路径和名称。 仅当发布由拉取请求流触发时,才会初始化此变量。示例:

Azure Pipelines:refs/heads/main
Release.Artifacts.{alias}.PullRequest.TargetBranchName 作为拉取请求目标的分支的唯一名称。 仅当发布由拉取请求流触发时,才会初始化此变量。示例:

Azure Pipelines: main

主工件变量

在经典发布管道中,如果使用多个项目,则可以将一个项目指定为主要项目。 然后,Azure Pipelines 为指定的主项目填充以下变量。

变量名称 与以下项相同
Build.DefinitionId Release.Artifacts.{主要工件别名}.DefinitionId
Build.DefinitionName Release.Artifacts.{主工件别名}.定义名称
Build.BuildNumber Release.Artifacts.{主工件别名}.BuildNumber
Build.BuildId Release.Artifacts.{Primary artifact alias}.BuildId
Build.BuildURI Release.Artifacts.{主要工件别名}.BuildURI
Build.SourceBranch Release.Artifacts.{Primary artifact alias}.SourceBranch
Build.SourceBranchName Release.Artifacts.{主项目别名}.源分支名称
Build.SourceVersion Release.Artifacts.{Primary artifact alias}.SourceVersion
Build.Repository.Provider Release.Artifacts.{Primary artifact alias}.Repository.Provider
Build.RequestedForID Release.Artifacts.{Primary artifact alias}.RequestedForID
Build.RequestedFor Release.Artifacts.{Primary artifact alias}.RequestedFor
Build.Type Release.Artifacts.{主项目别名}.类型
Build.PullRequest.TargetBranch Release.Artifacts.{Primary artifact alias}.PullRequest.TargetBranch
Build.PullRequest.TargetBranchName Release.Artifacts.{Primary artifact alias}.PullRequest.TargetBranchName

使用默认变量

可以通过两种方式使用默认变量作为发布管道或脚本中任务的参数。

直接使用默认变量作为任务的输入。 例如,若要将 Release.Artifacts.{Artifact alias}.DefinitionName 作为参数传递给别名为 ASPNET4.CI 的工件的 PowerShell 任务,请使用 $(Release.Artifacts.ASPNET4.CI.DefinitionName)

显示如何使用默认变量作为参数的屏幕截图。

若要在脚本中使用默认变量,请将 . 默认变量名称替换为 _。 例如,若要在 PowerShell 脚本中输出别名为 ASPNET4.CI 的构件的 Release.Artifacts.{Artifact alias}.DefinitionName 值,请使用 $env:RELEASE_ARTIFACTS_ASPNET4_CI_DEFINITIONNAME。 原始别名 ASPNET4.CI 替换为 ASPNET4_CI

显示如何在内联 PowerShell 脚本中使用默认变量的屏幕截图。

自定义变量

可以在不同的范围内定义自定义变量。

  • 变量组:使用变量组在项目中的所有定义之间共享值。 如果要在整个项目中的定义、阶段和任务中使用相同的值,并从单个位置管理它们,此方法非常有用。 在管道>中定义和管理变量组。

  • 发布管道变量:使用发布管道变量跨发布管道中的所有阶段共享值。 这种方法非常适合需要在各个阶段和任务中保持一致值的场景,而且可以在单一位置进行更新。 在发布管道的变量选项卡中定义和管理这些变量。 在“管道变量”页中,添加变量时,将范围下拉列表设置为发布

  • 阶段变量:使用阶段变量在发布管道的特定阶段共享值。 此方法适用于在不同阶段之间不同但在单个阶段内所有任务中保持一致的值。 在发布管道的变量选项卡中定义和管理这些变量。 在“管道变量”页中,添加变量时,将范围下拉列表设置为适当的环境。

通过在项目、发布管道和阶段级别使用自定义变量,可以:

  • 避免重复值,从而更容易通过一次更改更新所有引用。

  • 通过防止用户查看或修改敏感值来保护它们。 若要将变量标记为安全(机密),请选择 变量旁边的图标。

    重要

    隐藏变量(机密)的值安全地存储在服务器上,用户无法在保存后查看它们。 在部署期间,Azure Pipelines 会在任务引用这些值时解密这些值,并通过安全的 HTTPS 通道将其传递给代理。

注意

创建自定义变量可以覆盖标准变量。 例如,如果在 Windows 代理上定义自定义 Path 变量,它将覆盖 $env:Path 变量,并可能阻止 PowerShell 正常运行。

使用自定义变量

若要在任务中使用自定义变量,可将变量名称括在括号中,然后在前面加上 $ 字符。 例如,如果你有一个名为 adminUserName 的变量,则将其当前值作为任务 $(adminUserName)插入。

注意

链接到同一范围内的管道的不同组的变量(例如作业或阶段)可能会冲突并导致不可预知的结果。 若要避免此问题,请确保所有变量组中的变量都具有唯一的名称。

在脚本中定义和修改变量

若要定义或修改脚本中的变量,请使用 task.setvariable 日志记录命令。 更新的变量值的范围限定为正在执行的作业,并且不会跨作业或阶段持续存在。 请注意,变量名称将转换为大写,并将“.”和" "替换为“_”。

例如,Agent.WorkFolder 将变为 AGENT_WORKFOLDER

  • 在 Windows 上,以 %AGENT_WORKFOLDER%$env:AGENT_WORKFOLDER 的方式访问此变量。
  • 在 Linux 和 macOS 上,使用 $AGENT_WORKFOLDER

提示

可以在以下计算机上运行脚本:

批处理脚本

设置 saucesecret.Sauce 变量

@echo ##vso[task.setvariable variable=sauce]crushed tomatoes
@echo ##vso[task.setvariable variable=secret.Sauce;issecret=true]crushed tomatoes with garlic

读取变量

参数

"$(sauce)" "$(secret.Sauce)"

脚本

@echo off
set sauceArgument=%~1
set secretSauceArgument=%~2
@echo No problem reading %sauceArgument% or %SAUCE%
@echo But I cannot read %SECRET_SAUCE%
@echo But I can read %secretSauceArgument% (but the log is redacted so I do not spoil the secret)

读取变量时的控制台输出:

No problem reading crushed tomatoes or crushed tomatoes
But I cannot read 
But I can read ******** (but the log is redacted so I do not spoil the secret)

查看所有变量的当前值

  1. 选择 管道>发布,然后选择你的发布管道。

  2. 打开发布的摘要视图,然后选择感兴趣的阶段。 在步骤列表中,选择“初始化作业”。

    显示初始化作业步骤的屏幕截图。

  3. 此步骤将打开日志。 向下滚动以查看代理用于此作业的值。

    显示代理使用的变量的屏幕截图。

以调试模式运行发布版本

在调试模式下运行发布有助于诊断和解决问题,方法是在发布执行期间显示额外信息。 可以打开整个版本的调试模式,也可以仅针对特定发布阶段中的任务启用调试模式。

  • 若要为整个版本启用调试模式,请将名为值System.Debugtrue变量添加到发布管道的“变量”选项卡中。

  • 若要打开特定阶段的调试模式,请从阶段的快捷菜单中打开“配置阶段”对话框,并将名为“System.Debug变量”的变量true添加到“变量”选项卡。

  • 或者,创建一个变量组,其中包含名为 System.Debug 且值为 true 的变量,并将此变量组链接到发布管道。

提示

如果遇到与 Azure 资源管理器服务连接相关的错误,请参阅 “如何:排查 Azure 资源管理器服务连接 问题”以获取更多详细信息。

使用 AI 设计、验证和排查发布变量问题

以下示例提示Copilot 对话助手帮助你了解变量范围和优先级、设计可维护的变量策略、验证当前使用情况,以及在需要时排查变量解决问题。 将这些提示复制并粘贴到Copilot 对话助手中,并将占位符替换为阶段、任务和变量名称。

Task 示例提示
解释变量优先级 Explain how variable precedence works in this Classic release pipeline across variable groups, release scope, and stage scope, using my variable names as examples.
设计变量策略 Propose a naming and scoping convention for Classic release variables in this pipeline so values are clear, reusable, and less likely to conflict.
诊断范围重叠 In my Classic release pipeline, explain scope overlap for variable <VariableName> and tell me which value wins between release scope and stage scope.
验证脚本变量映射 Convert these Classic release variable references to the correct script environment variable names and explain why each one works.
审计变量组冲突 Identify potential naming conflicts across linked variable groups and stage variables in this Classic release pipeline, and recommend safer names.
排查变量未找到问题 Help me troubleshoot this Classic release pipeline error: variable not found for <VariableName>. Check macro syntax, scope, and task context.
排查“varialbe not found”拼写错误场景 I see a "varialbe not found" error in a deployment script. Help me determine whether this is a misspelled variable name, wrong scope, or incorrect environment variable mapping.

Copilot 由 AI 提供支持,因此可能会带来意外和错误。 有关详细信息,请参阅 Copilot 常规使用常见问题解答