我们在 VSTS 中使用带有分支机构的Git存储库和拉取请求模型以允许代码审核。
我们有一个 CI Build 定义,并按照 Release 定义推送到掌握的所有提交。
如果我们能够为所有分支做 CI,那将是一个巨大的奖励。 但是,Git repos的Build定义只允许设置单个分支来跟踪。
创建每个分支的构建是不可行的,因为我们的分支是短生命的特征分支,我们在PR合并到主人之后删除它们。
是的,可以指定在分支机构政策页面中运行 CI for PRs 来掌握。但是有两个问题:
这将只构建PR,而我们想要在分支中建立所有单独的提交
PR的CI构建也将触发我们的发布,但我们显然希望它仅针对主构建触发。是的,我可以在版本定义中分析$(Build.SourceBranch)
或$(Build.SourceBranchName)
,如果不是"掌握"则会失败但无论如何它都会创建一个失败的版本,我只想避免它
那么......我们怎样才能在VSTS中为任意分支建立CI构建?
仅针对主构建运行Release的另一个想法是从Build端触发Release,例如by using API如果$(Build.SourceBranch)
等于' master',请使用自定义PowerShell脚本。
我甚至可以看到VSTS Trigger build step的扩展名,但即使是非母版本,它也会触发,但微软正致力于a feature to run steps conditionally。
答案 0 :(得分:2)
然而,Git repos的构建定义只允许设置单个分支来跟踪。
实际上并非如此。 (您可能会对Repository
标签设置Default branch
这一事实感到困惑,该设置只接受一个分支。)
在构建定义上,转到Triggers
标签。如果不是Continuous Integration
框,请选中它。
在Branch filters
下点击Add new filter
并将值设置为*
。 (它会提示您选择现有分支,但您可以忽略它,只需按Enter键。)
您的构建定义现在将在您的仓库中的任何分支上构建提交。
答案 1 :(得分:2)
您可以在构建定义的末尾添加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,并在该定义的安全配置中,为“Project Collection Build Service”的“创建版本”权限设置为“允许” “帐户。
答案 2 :(得分:0)
非常容易。
转到市场并将GitVersion
安装到VSTS / Azure DevOps中
https://marketplace.visualstudio.com/items?itemName=gittools.gitversion
我之所以在监视标签上添加第2行的原因是,当我准备发布产品时,我利用GitVersion和git标签对构建工件进行版本控制。当我应用并推送git标签时,除非我明确告诉它监视它,否则该构建不会检测到它。我的git标记格式为“ v1.2.3”,以小写的“ v”开头。万一我想应用任何其他标签而不开始构建。
最后更改内部版本号格式。您需要识别正在建立的分支。 GitVersion使用语义版本控制,因此它描述了正在构建的内容。
好处:
秘诀:GitVersion读取Git历史记录,因此在标记了每个git commit之后,数字都会增加。它从正在使用的CI系统创建构建变量并使它们可用。它派生这些变量,并根据您正在使用GitVersion的tag
为正在建立的分支创建一个mode
或别名。在上面的示例中,当它是版本0.1.0
,然后标记了版本1.0.0
并将其发布。下一次提交预测下一个版本为1.1.0
,并且develop
分支中有很多提交(其中11个)。构建名称使用别名alpha
,因为构建工件是alpha候选对象。还有4次提交。在从提交#15分支到分支之后,进行了第16次提交并将其推入并构建,然后进行了功能分支构建。我认为您已经明白了。全部来自一个构建管道,并使用GitVersion描述正在构建的分支和正在构建的提交。语义版本描述了该版本。