如何在VSTS中构建分支

时间:2016-10-05 14:33:43

标签: git continuous-integration azure-devops pull-request

我们在 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

3 个答案:

答案 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)

非常容易。

  1. 转到市场并将GitVersion安装到VSTS / Azure DevOps中 https://marketplace.visualstudio.com/items?itemName=gittools.gitversion

  2. 如前所述,更改CI触发器以监视所有分支: enter image description here

    我之所以在监视标签上添加第2行的原因是,当我准备发布产品时,我利用GitVersion和git标签对构建工件进行版本控制。当我应用并推送git标签时,除非我明确告诉它监视它,否则该构建不会检测到它。我的git标记格式为“ v1.2.3”,以小写的“ v”开头。万一我想应用任何其他标签而不开始构建。

  3. 最后更改内部版本号格式。您需要识别正在建立的分支。 GitVersion使用语义版本控制,因此它描述了正在构建的内容。

enter image description here

  1. 现在从任意数量的分支中启动尽可能多的构建,并查看它们全部从单个构建定义中启动。设置一次,从现在开始忘记! enter image description here

好处:

  • 无需维护脚本
  • 遵循语义版本控制
  • 一次创建构建管道/定义,而不必再担心功能分支。
  • 对于拉取请求仍然有效。
  • https://gitversion.readthedocs.io上了解有关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次提交并将其推入并构建,然后进行了功能分支构建。我认为您已经明白了。全部来自一个构建管道,并使用Gi​​tVersion描述正在构建的分支和正在构建的提交。语义版本描述了该版本。