$(Build.DefinitionName)_$(Build.DefinitionVersion)_$(Build.BuildId)_$(Build.BuildNumber)_$(My.Variable)
前四个变量是预定义的。 My.Variable
可以在 “变量”选项卡上定义。
生成管道使用 Git 标记标记源。
某些生成变量可能会生成不是有效标签的值。 例如,和 $(Build.DefinitionName)
等$(Build.RequestedFor)
变量可以包含空格。 如果值包含空格,则不会创建标记。
生成管道标记源后,带有 Git ref refs/tags/{tag}
的项目会自动添加到已完成的生成中。 这为团队提供了额外的可跟踪性和更方便用户的方式,用于从生成导航到生成的代码。 标记被视为生成项目,因为它是由生成生成的。 手动或通过保留策略删除生成时,也会删除 标记。
(Azure Pipelines、TFS 2018 及更新版本的) 报告生成状态
可以选择向团队提供远程源存储库中生成状态的视图。
如果源位于项目中Azure Repos Git 存储库中,则此选项会在“代码”页上显示一个锁屏提醒,以指示生成是通过还是失败。 生成状态显示在以下选项卡中:
文件:指示所选分支的最新版本的状态。
提交:指示每个提交的生成状态 (这需要为生成) 启用持续集成 (CI) 触发器。
分支:指示每个分支的最新生成状态。
如果在项目中对同一存储库使用多个生成管道,则可以选择为一个或多个管道启用此选项。 在多个管道上启用此选项的情况下, “代码 ”页上的锁屏提醒指示所有管道中最新生成的状态。 团队成员可以单击生成状态徽章以查看每个生成管道的最新生成状态。
GitHub
如果源位于 GitHub 中,则此选项使用 GitHub 检查 或 状态 API 将生成状态发布到 GitHub。 如果生成是从 GitHub 拉取请求触发的,则可以在 GitHub 拉取请求页上查看状态。 这还允许你在 GitHub 中设置状态策略并自动执行合并。 如果生成是由持续集成 (CI) 触发的,则可以在 GitHub 中的提交或分支上查看生成状态。
其他类型的 Git 远程存储库
如果源位于任何其他类型的远程存储库中,则无法使用 Azure Pipelines 或 TFS 自动将生成状态发布到该存储库。 但是,可以使用 生成锁屏提醒 在版本控制体验中集成和显示生成状态。
如果要签出单个存储库,默认情况下,源代码将签出到名为 的 s
目录中。 对于 YAML 管道,可以通过使用 path
指定checkout
来更改此设置。 指定的路径相对于 $(Agent.BuildDirectory)
。 例如:如果签出路径值为 mycustompath
且 $(Agent.BuildDirectory)
为 C:\agent\_work\1
,则源代码将签出到 C:\agent\_work\1\mycustompath
中。
如果使用多个 checkout
步骤并签出多个存储库,并且未使用 path
显式指定文件夹,则每个存储库都放置在以存储库命名的 的 s
子文件夹中。 例如,如果检查两个名为 tools
和 code
的存储库,则源代码将签出到 C:\agent\_work\1\s\tools
和 C:\agent\_work\1\s\code
中。
请注意,签出路径值不能设置为高于 $(Agent.BuildDirectory)
的任何目录级别,因此 path\..\anotherpath
将导致有效的签出路径 (即 C:\agent\_work\1\anotherpath
) ,但类似 的值 ..\invalidpath
不会 (即 C:\agent\_work\invalidpath
) 。
如果使用多个 checkout
步骤并签出多个存储库,并且想要使用 path
显式指定文件夹,请考虑避免设置路径,该路径是另一个签出步骤的路径的子文件夹 (C:\agent\_work\1\s\repo1
即和 C:\agent\_work\1\s\repo1\repo2
) ,否则,签出步骤的子文件夹将由另一个存储库的清理清除。 请注意,如果 clean 选项对于 repo1
)
只能为 YAML 管道指定签出路径。 有关详细信息,请参阅在 YAML 架构中签出。
签出子模块
选择是否要从 子模块下载文件。
可以选择获取即时子模块或嵌套到任何递归深度的所有子模块。
如果要将 LFS 与子模块一起使用,请务必查看有关将 LFS 与子模块配合使用的说明。
有关用于签出子模块的 YAML 语法的详细信息,请参阅 在 YAML 架构中签出。
生成管道将检查 Git 子模块,只要它们是:
未经身份验证: 一个未经身份验证的公共存储库,无需凭据即可克隆或提取。
包含在上面指定的 Git 存储库所在的同一项目、GitHub 组织或 Bitbucket 云帐户中。
通过使用相对于 main 存储库的 URL 添加。 例如,将签出此一个: git submodule add /../../submodule.git mymodule
不会签出此一个: git submodule add https://dev.azure.com/fabrikamfiber/_git/ConsoleApp mymodule
代理用于从 main 存储库获取源的相同凭据也用于获取子模块的源。
如果main存储库和子模块位于 Azure DevOps 项目的 Azure Repos Git 存储库中,则可以选择用于访问源的帐户。 在“ 选项 ”选项卡上的“ 生成作业授权范围 ”菜单上,选择以下任一项:
使用项目集合 生成服务帐户的项目集合
使用项目 生成服务帐户的当前项目。
请确保使用的每个帐户都有权访问 main 存储库和子模块。
如果main存储库和子模块位于同一 GitHub 组织中,则存储在 GitHub 服务连接中的令牌用于访问源。
使用 Checkout 子模块选项的替代方法
在某些情况下,无法使用 “签出子模块 ”选项。
你可能有这样一种情况:需要一组不同的凭据才能访问子模块。
例如,如果main存储库和子模块存储库不存储在同一 Azure DevOps 组织或 Git 服务中,则可能会发生这种情况。
如果无法使用 “签出子模块 ”选项,则可以改用自定义脚本步骤来提取子模块。
首先, (PAT) 获取个人访问令牌,并使用 作为 pat:
前缀。
接下来,对此前缀字符串进行 base64 编码 ,以创建基本身份验证令牌。
最后,将此脚本添加到管道:
git -c http.https://<url of submodule repository>.extraheader="AUTHORIZATION: basic <BASE64_ENCODED_TOKEN_DESCRIBED_ABOVE>" submodule update --init --recursive
请务必将“<BASIC_AUTH_TOKEN>”替换为 Base64 编码的令牌。
在项目或生成管道中使用机密变量来存储生成的基本身份验证令牌。
使用该变量在上述 Git 命令中填充机密。
问:为什么不能在代理上使用 Git 凭据管理器?答: 在专用生成代理上安装的 Git 凭据管理器中存储子模块凭据通常无效,因为每当更新子模块时,凭据管理器可能会提示你重新输入凭据。 当无法进行用户交互时,在自动生成期间,这是不可取的。
从LFS签出文件
选择是否要从大型文件存储 (LFS) 下载文件。
在经典编辑器中,选择“检查”框以启用此选项。
在 YAML 生成中,添加一个将 设置为 true
的lfs
签出步骤:
steps:
- checkout: self
lfs: true
如果使用 TFS,或者将 Azure Pipelines 与自承载代理一起使用,则必须 git-lfs
在代理上安装此选项才能正常工作。 如果托管代理使用 Windows,请考虑使用 System.PreferGitFromPath
变量,以确保管道使用计算机上安装的 git 和 git-lfs 版本。 有关详细信息,请参阅 代理运行哪个版本的 Git?
将 Git LFS 与子模块配合使用
如果子模块包含LFS文件,则必须在签出子模块之前配置 Git LFS。
Microsoft 托管的 macOS 和 Linux 代理以这种方式进行预配置。
Windows 代理和自承载 macOS/Linux 代理可能不会。
作为解决方法,如果使用的是 YAML,则可以在 前面 checkout
添加以下步骤:
steps:
- script: |
git config --global --add filter.lfs.required true
git config --global --add filter.lfs.smudge "git-lfs smudge -- %f"
git config --global --add filter.lfs.process "git-lfs filter-process"
git config --global --add filter.lfs.clean "git-lfs clean -- %f"
displayName: Configure LFS for use with submodules
- checkout: self
lfs: true
submodules: true
# ... rest of steps ...
克隆第二个存储库
默认情况下,管道与来自 Azure Repos 或外部提供程序的一个存储库相关联。
这是可以在提交和拉取请求时触发生成的存储库。
你可能希望在管道中包含第二个存储库中的源。
可以通过编写脚本来执行此操作。
git clone https://github.com/Microsoft/TypeScript.git
如果存储库不是公共存储库,则需要将身份验证传递给 Git 命令。
Azure Repos
管道已有权访问其项目中的其他存储库,可以使用脚本命令在管道中克隆它们,如以下示例所示。
- script: |
git clone -c http.extraheader="AUTHORIZATION: bearer $(System.AccessToken)" https://organization@dev.azure.com/project/FabrikamFiber/_git/reponame
可以使用 多存储库签出在管道所在的同一项目中克隆多个存储库。
如果需要从另一个非公共项目克隆存储库,则需要以有权访问该项目的用户身份进行身份验证。
使用 机密变量 安全地存储凭据。
机密变量不会自动作为环境变量提供给脚本。
请参阅 机密变量 ,了解如何将它们映射到中。
对于Azure Repos,可以将个人访问令牌与代码 (读取) 权限一起使用。
将此作为密码字段发送到“基本”授权标头中,不带用户名。
(换句话说,对 的值 :<PAT>
进行 base64 编码,包括冒号)
AUTH=$(echo -n ":$REPO_PAT" | openssl base64 | tr -d '\n')
git -c http.<repo URL>.extraheader="AUTHORIZATION: basic $AUTH" clone <repo URL> --no-checkout --branch master
非部署作业会自动提取源。
如果要跳过该行为,请使用此选项。
在需要以下情况时,此选项非常有用:
使用自己的自定义选项进行 Git 初始化、配置和提取。
使用生成管道仅运行自动化 (例如,某些脚本) 不依赖于版本控制中的代码。
如果要禁用下载源::
Azure Pipelines、TFS 2018 及更新: 单击“ 高级设置”,然后选择“ 不同步源”。
使用此选项时,代理还会跳过运行清理存储库的 Git 命令。
选择是否要限制历史记录中的下载距离。 这实际上会导致 git fetch --depth=n
。 如果存储库很大,此选项可能会提高生成管道的效率。 如果存储库已使用很长时间并且具有相当大的历史记录,则存储库可能很大。 如果添加和以后删除了大型文件,则它也可能很大。
在这些情况下,此选项有助于节省网络和存储资源。 它还可能节省时间。 它并不总是节省时间的原因是,在某些情况下,服务器可能需要花费时间来计算要下载的提交,以获取指定的深度。
当生成排队时,要生成的分支将解析为提交 ID。 然后,代理提取分支并签出所需的提交。 分支解析为提交 ID和代理执行签出之间有一个小窗口。 如果分支更新迅速,并且你为浅层提取设置了非常小的值,则代理尝试检查它时,提交可能不存在。如果发生这种情况,请增加浅层提取深度设置。
选中“检查”框以启用此选项后,在“深度”框中指定提交数。
Agent.Source.Git.ShallowFetchDepth
下面提到的变量也有效,并替代检查框控件。 这样,就可以在将生成排队时修改设置。
首选路径中的 Git
默认情况下,Windows 代理使用与代理软件捆绑的 Git 版本。 Microsoft 建议使用与代理捆绑的 Git 版本,但有多个选项可以替代此默认行为,并使用代理计算机在路径中安装的 Git 版本。
在管道中将true
名为 的System.PreferGitFromPath
管道变量设置为 。
在自承载代理上,可以在代理根目录中创建名为 .env 的文件,并将行 System.PreferGitFromPath=true
添加到该文件。 有关详细信息,请参阅如何实现为每个代理设置不同的环境变量?
若要查看管道使用的 Git 版本,可以查看管道中某个 checkout
步骤的日志,如以下示例所示。
Syncing repository: PathFilter (Git)
Prepending Path environment variable with directory containing 'git.exe'.
git version
git version 2.26.2.windows.1
在非 Windows 代理上,此设置始终为 true。
其他 Git 的触发器选项
指定其他/外部 Git 存储库时,CI 生成要求可从 Internet 访问该存储库。 如果存储库位于防火墙或代理后面,则只有计划生成和手动生成才能正常工作。
常见问题解答
生成代理可以将哪些协议与 Git 配合使用?
代理支持 HTTPS。
代理尚不支持 SSH。 请参阅 允许生成在签出 Git 子模块时使用 SSH 身份验证。
我在本地使用 TFS,但没有看到其中某些功能。 为什么看不到?
其中某些功能仅在 Azure Pipelines 上可用,在本地尚不可用。 如果你已升级到最新版本的 TFS,则可在本地使用这些功能。