如何 CI 在 VSTS 中建立分支
How to CI build branches in VSTS
我们在 VSTS 中使用 Git 存储库与分支和 拉取请求 模型以允许代码审查。
我们有一个 CI Build 定义,并遵循它 Release 定义所有推送到 master 的提交。
如果我们也能为所有分支CI做,那将是一个巨大的收获。
然而,Git 回购的构建定义只允许设置单个分支进行跟踪。
并且为每个分支创建一个构建是不可行的,因为我们的分支是短命的,也就是功能分支,我们在 PR 合并到 master 后删除它们。
是的,可以指定 运行 CI 构建 PRs 以在 分支策略 [=49] 中掌握=] 页。但这有两个问题:
这将只构建 PR,而我们希望在将它们推送到分支后立即在分支中构建所有单独的提交
CI 为 PRs 构建也会触发我们的 Release,但我们显然希望它只被主构建触发。是的,我可以在 Release 定义中分析 $(Build.SourceBranch)
或 $(Build.SourceBranchName)
,如果不是 "master" 则失败,但无论如何它都会创建一个失败的 Release,我只想完全避免
那么...我们如何在 VSTS 中为任意分支构建 CI?
更新
另一个想法 wrt 运行ning Release only for master builds - 是从构建端触发发布,例如by using API 如果 $(Build.SourceBranch)
等于 'master',通过自定义 PowerShell 脚本说。
我什至可以看到 VSTS Trigger build step, but it will trigger even for non-master builds, although Microsoft is working on a feature to run steps conditionally 的扩展名。
However Build definition for Git repos allows to setup only single branch to track.
事实并非如此。 (您可能会对 Repository
选项卡有一个 Default branch
设置感到困惑,它只接受一个分支。)
在构建定义中,转到 Triggers
选项卡。如果尚未选中 Continuous Integration
框。
在 Branch filters
下单击 Add new filter
并将值设置为 *
。 (它会提示你 select 一个现有的分支,但你可以忽略它并直接按 Enter。)
您的构建定义现在将在您的存储库中的任何分支上构建提交。
您可以在构建定义的末尾添加一个 powershell 脚本任务以通过 Rest 触发发布 API,我创建了一个简单的代码示例供您参考:
if ($env:BUILD_SOURCEBRANCHNAME -eq "master")
{
$collectionuri = $env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI
$buildid = $env:BUILD_BUILDID
$project = $env:SYSTEM_TEAMPROJECT
$token = $env:SYSTEM_ACCESSTOKEN
$builddef = $env:BUILD_DEFINITIONNAME
$buildnum = $env:BUILD_BUILDID
$releaseid = 2;
#Generate API URL
$account = "";
$reg = "https://+(?<acc>\w+?).visualstudio+"
if ($collectionuri -match $reg)
{
$account = $Matches.acc;
}
else
{
Write-Host "Fail to get the account name from collection url";
}
$url= "https://" + $account + ".vsrm.visualstudio.com/"+ $project + "/_apis/release/releases?api-version=3.0-preview.2"
#Generate Auth info
$basicAuth= ("{0}:{1}"-f "anys",$token)
$basicAuth=[System.Text.Encoding]::UTF8.GetBytes($basicAuth)
$basicAuth=[System.Convert]::ToBase64String($basicAuth)
$headers= @{Authorization=("Basic {0}"-f $basicAuth)}
#Generate body content
$instanceRef = @{id = $buildID};
$artif = @{alias = $builddef; instanceReference = @{id = $buildnum}}
$content = @{
definitionId = $releaseid
description = "Triggered from CI Build"
artifacts = @($artif)
}
$json = $content | ConvertTo-Json -Depth 100
#Call Rest API to start the release
$responseBuild = Invoke-RestMethod -Uri $url -headers $headers -Method Post -Body $json -ContentType "application/json"
}
else
{
Write-Host "Not master branch, no release triggered"
}
您需要将 "releaseid" 更新为您要触发的发布定义的 ID,并在该定义的安全配置中,将 "Create releases" 权限设置为 "Allow" "Project Collection Build Service" 个帐户。
非常非常容易。
转到市场并将 GitVersion
安装到 VSTS/Azure DevOps
https://marketplace.visualstudio.com/items?itemName=gittools.gitversion
如前所述,更改 CI 触发器以监视所有分支:
我还添加第 2 行来监视标签的原因是,当我准备发布我的产品时,我利用 GitVersion 和 git 标签对构建工件进行版本控制。当我应用并推送 git 标签时,构建不会检测到它,除非我明确告诉它要注意它。我的 git 标签格式是 "v1.2.3" 以 lower-case "v" 开头。以防万一我想应用任何其他标签而不开始构建。
最后更改版本号格式。您需要辨别正在构建的分支。 Git版本使用语义版本控制,因此这描述了正在构建的内容。
- 现在从任意数量的分支开始尽可能多的构建,并看到它们全部从单个构建定义开始。设置一次,从此忘记!
好处:
- 没有要维护的脚本
- 遵循语义版本控制
- 一次构建pipeline/definition,再也不用担心功能分支了。
- 仍然适用于合并请求。
- 在 https://gitversion.readthedocs.io
阅读有关 Git 版本的更多信息
秘诀:Git版本读取 Git 历史记录,因此每次 git 提交后数字都会增加。它从它正在使用的 CI 系统创建构建变量并使它们可用。它导出这些变量并根据您使用的 Git 版本中的 mode
为它正在构建的分支创建一个 tag
或别名。在上面的示例中,我有一些提交(未显示) ),当它是版本 0.1.0
时,我将其标记为版本 1.0.0
并发布了它。下一次提交预测下一个版本将是 1.1.0
并且 develop
分支中有很多提交(其中 11 个)。构建名称使用别名 alpha
,因为构建工件是 alpha 候选者。还有 4 个提交。在从提交 #15 分支之后有一个功能分支构建,进行了第 16 次提交并推送了它,然后构建。我想你明白了。这一切都来自一个单一的构建管道,并使用 GitVersion 来描述正在构建的分支和正在构建的提交。语义版本控制描述构建。
我们在 VSTS 中使用 Git 存储库与分支和 拉取请求 模型以允许代码审查。
我们有一个 CI Build 定义,并遵循它 Release 定义所有推送到 master 的提交。
如果我们也能为所有分支CI做,那将是一个巨大的收获。 然而,Git 回购的构建定义只允许设置单个分支进行跟踪。
并且为每个分支创建一个构建是不可行的,因为我们的分支是短命的,也就是功能分支,我们在 PR 合并到 master 后删除它们。
是的,可以指定 运行 CI 构建 PRs 以在 分支策略 [=49] 中掌握=] 页。但这有两个问题:
这将只构建 PR,而我们希望在将它们推送到分支后立即在分支中构建所有单独的提交
CI 为 PRs 构建也会触发我们的 Release,但我们显然希望它只被主构建触发。是的,我可以在 Release 定义中分析
$(Build.SourceBranch)
或$(Build.SourceBranchName)
,如果不是 "master" 则失败,但无论如何它都会创建一个失败的 Release,我只想完全避免
那么...我们如何在 VSTS 中为任意分支构建 CI?
更新
另一个想法 wrt 运行ning Release only for master builds - 是从构建端触发发布,例如by using API 如果 $(Build.SourceBranch)
等于 'master',通过自定义 PowerShell 脚本说。
我什至可以看到 VSTS Trigger build step, but it will trigger even for non-master builds, although Microsoft is working on a feature to run steps conditionally 的扩展名。
However Build definition for Git repos allows to setup only single branch to track.
事实并非如此。 (您可能会对 Repository
选项卡有一个 Default branch
设置感到困惑,它只接受一个分支。)
在构建定义中,转到 Triggers
选项卡。如果尚未选中 Continuous Integration
框。
在 Branch filters
下单击 Add new filter
并将值设置为 *
。 (它会提示你 select 一个现有的分支,但你可以忽略它并直接按 Enter。)
您的构建定义现在将在您的存储库中的任何分支上构建提交。
您可以在构建定义的末尾添加一个 powershell 脚本任务以通过 Rest 触发发布 API,我创建了一个简单的代码示例供您参考:
if ($env:BUILD_SOURCEBRANCHNAME -eq "master")
{
$collectionuri = $env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI
$buildid = $env:BUILD_BUILDID
$project = $env:SYSTEM_TEAMPROJECT
$token = $env:SYSTEM_ACCESSTOKEN
$builddef = $env:BUILD_DEFINITIONNAME
$buildnum = $env:BUILD_BUILDID
$releaseid = 2;
#Generate API URL
$account = "";
$reg = "https://+(?<acc>\w+?).visualstudio+"
if ($collectionuri -match $reg)
{
$account = $Matches.acc;
}
else
{
Write-Host "Fail to get the account name from collection url";
}
$url= "https://" + $account + ".vsrm.visualstudio.com/"+ $project + "/_apis/release/releases?api-version=3.0-preview.2"
#Generate Auth info
$basicAuth= ("{0}:{1}"-f "anys",$token)
$basicAuth=[System.Text.Encoding]::UTF8.GetBytes($basicAuth)
$basicAuth=[System.Convert]::ToBase64String($basicAuth)
$headers= @{Authorization=("Basic {0}"-f $basicAuth)}
#Generate body content
$instanceRef = @{id = $buildID};
$artif = @{alias = $builddef; instanceReference = @{id = $buildnum}}
$content = @{
definitionId = $releaseid
description = "Triggered from CI Build"
artifacts = @($artif)
}
$json = $content | ConvertTo-Json -Depth 100
#Call Rest API to start the release
$responseBuild = Invoke-RestMethod -Uri $url -headers $headers -Method Post -Body $json -ContentType "application/json"
}
else
{
Write-Host "Not master branch, no release triggered"
}
您需要将 "releaseid" 更新为您要触发的发布定义的 ID,并在该定义的安全配置中,将 "Create releases" 权限设置为 "Allow" "Project Collection Build Service" 个帐户。
非常非常容易。
转到市场并将
GitVersion
安装到 VSTS/Azure DevOps https://marketplace.visualstudio.com/items?itemName=gittools.gitversion如前所述,更改 CI 触发器以监视所有分支:
我还添加第 2 行来监视标签的原因是,当我准备发布我的产品时,我利用 GitVersion 和 git 标签对构建工件进行版本控制。当我应用并推送 git 标签时,构建不会检测到它,除非我明确告诉它要注意它。我的 git 标签格式是 "v1.2.3" 以 lower-case "v" 开头。以防万一我想应用任何其他标签而不开始构建。
最后更改版本号格式。您需要辨别正在构建的分支。 Git版本使用语义版本控制,因此这描述了正在构建的内容。
- 现在从任意数量的分支开始尽可能多的构建,并看到它们全部从单个构建定义开始。设置一次,从此忘记!
好处:
- 没有要维护的脚本
- 遵循语义版本控制
- 一次构建pipeline/definition,再也不用担心功能分支了。
- 仍然适用于合并请求。
- 在 https://gitversion.readthedocs.io 阅读有关 Git 版本的更多信息
秘诀:Git版本读取 Git 历史记录,因此每次 git 提交后数字都会增加。它从它正在使用的 CI 系统创建构建变量并使它们可用。它导出这些变量并根据您使用的 Git 版本中的 mode
为它正在构建的分支创建一个 tag
或别名。在上面的示例中,我有一些提交(未显示) ),当它是版本 0.1.0
时,我将其标记为版本 1.0.0
并发布了它。下一次提交预测下一个版本将是 1.1.0
并且 develop
分支中有很多提交(其中 11 个)。构建名称使用别名 alpha
,因为构建工件是 alpha 候选者。还有 4 个提交。在从提交 #15 分支之后有一个功能分支构建,进行了第 16 次提交并推送了它,然后构建。我想你明白了。这一切都来自一个单一的构建管道,并使用 GitVersion 来描述正在构建的分支和正在构建的提交。语义版本控制描述构建。