我们正在为我们的CI / CD环境使用VSTS。在我们的项目中,我们有多个部分,比如Database和Frontend1,它们在我们的存储库中有一个单独的文件夹:
src/
Database
Frontend1
...
我为项目的每个组件创建了一个单独的构建,如果将更改推送到相应的子文件夹,则会触发这些构建。我希望这种分离能够轻松控制和检查每个组件的版本。
Database --> Build Database
Frontend1 --> Build Frontend1
使用此配置,如果我通过一次提交签入Database
和Frontend1
的更改,则会触发两个构建。
另外我已经配置了单个版本,并且两个人工制品都已链接在一起。每个版本也会触发该版本。
现在的问题是,如果我检查Database
和Frontend1
的更改,则会触发两个版本,并且每次构建后都会触发一个版本。这意味着我有两个版本用于同一个提交。我想要实现只有一个版本结合了两个版本:
Database --> Build Database |
| --> Release Database and Frontend1
Frontend1 --> Builds Frontend1 |
是否有可能实现这样的配置?
答案 0 :(得分:4)
最后,我找到了解决问题的方法。我创建了一个VSTS任务,如果没有其他构建正在运行/排队,它会向当前构建添加标签:
[CmdletBinding()]
param(
[string] $teamfoundationCollectionUri = $env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI,
[string] $teamfoundationProject= $env:SYSTEM_TEAMPROJECT,
[string] $accessToken = "Bearer $env:SYSTEM_ACCESSTOKEN",
[int] $currentBuildId = $Env:BUILD_BUILDID,
[string] $tag
)
if(!$tag)
{
$tag = Get-VstsInput -Name "tag"
}
$buildInformationUrl = "$teamfoundationCollectionUri$teamfoundationProject/_apis/build/builds/$currentBuildId"
Write-Host "Loading build information: " $buildInformationUrl
$buildInformationResponse = Invoke-RestMethod -uri $buildInformationUrl -Headers @{Authorization = "$accessToken"}
$buildSourceVersion = $buildInformationResponse.sourceVersion
$openBuildsUrl = "$teamfoundationCollectionUri$teamfoundationProject/_apis/build/builds?statusFilter=inProgress,notStarted"
Write-Host "Requesting open builds: " $openBuildsUrl
$builds = Invoke-RestMethod -uri $openBuildsUrl -Headers @{Authorization = "$accessToken"}
$otherBuildForCommitIsRunning = $false
ForEach( $currentBuild in $builds.value )
{
if($currentBuild.id -eq $currentBuildId) {
Write-Host "Build with Id " $currentBuild.id " skipped"
continue;
}
if($currentBuild.sourceVersion -eq $buildSourceVersion) {
Write-Host "Found other open build: " $currentBuild.id
$otherBuildForCommitIsRunning = $true
}
}
if($otherBuildForCommitIsRunning -eq $false) {
Write-Host "Tagging build with "$tag
Write-Host "##vso[build.addbuildtag]$tag"
}
此外,我已为释放触发器添加了标记条件:
答案 1 :(得分:1)
目前,您无法真正实现自己想要的目标。可以将发行版配置为触发多个工件源(在本例中为构建),但是任何一个工件更新时都会触发发布。如果您有一个触发两个版本的更改,那么您将获得两个版本。
但是,您可以在给定环境中使用工件条件仅触发该环境的部署。
因此,您要将发布定义分为两个环境:
|-Dev-Database -> QA-Database -> etc
Start-|
|-Dev-FrontEnd -> QA-FrontEnd -> etc
工件条件将确保您只获得数据库更新的数据库版本,以及前端版本的更新。
我希望有一个"批次"模式,它足够聪明,可以看到同一个提交的多个构建并等待它们全部完成,但遗憾的是没有类似的东西。