gpt4 book ai didi

git - 如何在 VSTS 中 CI 构建分支

转载 作者:太空狗 更新时间:2023-10-29 13:59:00 24 4
gpt4 key购买 nike

我们在 VSTS 中使用带有分支和 pull 请求模型的 Git 存储库以允许代码审查。

我们有一个 CI Build 定义,并遵循它的 Release 定义,用于推送到 master 的所有提交。

如果我们也能所有分支做CI,那将是一个巨大的收获。然而,Git 存储库的构建定义只允许设置单个分支进行跟踪。

并且为每个分支创建构建是不可行的,因为我们的分支是短命的,也称为功能分支,我们在 PR merge 到主分支后删除它们。

是的,可以在 Branch Policies 页面中指定运行 CI build for PRs 以掌握。但这有两个问题:

  • 这将只构建 PR,而我们希望在分支推送到分支后立即构建所有单独的提交

  • PR 的 CI 构建也会触发我们的发布,但我们显然希望它只针对主构建触发。是的,我可以分析 Release 定义中的 $(Build.SourceBranch)$(Build.SourceBranchName) 如果它不是“master”则失败,但它会创建一个失败的 Release不管怎样,我只想完全避免这种情况

那么...我们如何在 VSTS 中为任意分支构建 CI?


更新

另一个想法 wrt 只为主构建运行发布 - 是从构建端触发发布,例如by using API如果 $(Build.SourceBranch) 等于“master”,例如通过自定义 PowerShell 脚本。

我什至可以看到 VSTS Trigger build step 的扩展名, 但即使是非主版本也会触发,尽管微软正在研究 a feature to run steps conditionally .

最佳答案

您可以在构建定义的末尾添加一个 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,并在该定义的安全配置中,将“项目集合构建服务”的“创建发布”权限设置为“允许” "帐户。

关于git - 如何在 VSTS 中 CI 构建分支,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39876844/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com