2017-07-14 27 views
1

我们正在利用我们的CI/CD环境VSTS。在我们的项目,我们有多个部分,如数据库和Frontend1,这在我们的库的一个单独的文件夹:将多个构建成一个释放

src/ 
    Database 
    Frontend1 
    ... 

我创建了一个单独构建我们的每一个项目的组成部分,如果有变化,这是触发推送到相应的子文件夹。我希望这种分离能够轻松控制和检查每个组件的版本。

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

利用这种结构也有,如果我在DatabaseFrontend1变化请与单个提交两个版本触发。

Additionaly我已经配置了连接两个文物的单一版本。每个构建也会触发该版本。

现在的问题是,如果我检查DatabaseFrontend1的更改,两个构建都会触发,并且在每次构建之后还会有一个释放触发。这意味着我有两个同样提交的版本。我想才达到有只有一个结合了构建版本:

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

是否有可能才达到这样的配置?

+0

您是否为您的构建定义配置了路径过滤器?我想你想确保一个提交只触发相应的构建,而不是两个构建? –

+0

我已经定义了一个路径过滤器。但是,如果我有一个与多个路径相关的签入,并因此涉及到多个构建,我只想要一个版本。 – boindiil

回答

2

最后,我发现我的问题的解决方案。我创建了一个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

目前,你真的不能达到你想要做什么。一个版本可以配置为触发多个工件源(在本例中为构建),但是任何时候任何一个工件被更新时都会触发一个版本。如果您有一个触发两个版本的更改,您将获得两个版本。

但是,您可以使用一个特定的环境条件神器只触发环境的部署。

所以,你会打破你的版本定义为两个环境:

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

的神器条件将确保你只能得到数据库的数据库更改的释放,而对于前前端的释放最终变更。

我想那里是一个“批量”模式,它是足够聪明,看到多个建立了相同的承诺,并等待他们全部完成,但没有这样的不幸事情。

+0

谢谢您的回答,我希望能有另一种解决方案。我建立了自己的解决方案(请参阅我的答案) – boindiil