将多个构建组合到一个版本中

时间:2017-07-14 10:44:37

标签: azure-devops

我们正在为我们的CI / CD环境使用VSTS。在我们的项目中,我们有多个部分,比如Database和Frontend1,它们在我们的存储库中有一个单独的文件夹:

src/
   Database
   Frontend1
   ...

我为项目的每个组件创建了一个单独的构建,如果将更改推送到相应的子文件夹,则会触发这些构建。我希望这种分离能够轻松控制和检查每个组件的版本。

Database  --> Build Database
Frontend1 --> Build Frontend1

使用此配置,如果我通过一次提交签入DatabaseFrontend1的更改,则会触发两个构建。

另外我已经配置了单个版本,并且两个人工制品都已链接在一起。每个版本也会触发该版本。

现在的问题是,如果我检查DatabaseFrontend1的更改,则会触发两个版本,并且每次构建后都会触发一个版本。这意味着我有两个版本用于同一个提交。我想要实现只有一个版本结合了两个版本:

Database  --> Build Database   |
                               | --> Release Database and Frontend1
Frontend1 --> Builds Frontend1 |

是否有可能实现这样的配置?

2 个答案:

答案 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"
}

此外,我已为释放触发器添加了标记条件:

enter image description here

答案 1 :(得分:1)

目前,您无法真正实现自己想要的目标。可以将发行版配置为触发多个工件源(在本例中为构建),但是任何一个工件更新时都会触发发布。如果您有一个触发两个版本的更改,那么您将获得两个版本。

但是,您可以在给定环境中使用工件条件仅触发该环境的部署。

因此,您要将发布定义分为两个环境:

      |-Dev-Database -> QA-Database -> etc
Start-|              
      |-Dev-FrontEnd -> QA-FrontEnd -> etc

工件条件将确保您只获得数据库更新的数据库版本,以及前端版本的更新。

我希望有一个"批次"模式,它足够聪明,可以看到同一个提交的多个构建并等待它们全部完成,但遗憾的是没有类似的东西。