2017-07-14 8 views
1

私たちはCI/CD環境にVSTSを使用しています。私が変更された場合にトリガされている私たちのプロジェクトの構成要素のそれぞれに別々のビルドを作成している複数のビルドを1つのリリースにまとめる

src/ 
    Database 
    Frontend1 
    ... 

:私たちのプロジェクトでは、我々は我々のリポジトリに別のフォルダを持っているデータベースとFrontend1などの複数の部分を、持っています対応するサブフォルダにプッシュされます。このように分けて、各コンポーネントのバージョンを簡単に制御して確認したいと思っています。私は単一のコミットとDatabaseFrontend1のために変更をチェックインする場合は、このような構成により

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

は2は、そこにトリガビルドされています。

私は両方のアーティファクトがリンクされた単一のリリースを構成しました。ビルドごとにリリースがトリガーされます。

DatabaseFrontend1の変更をチェックインすると、両方のビルドがトリガされ、ビルド後にもトリガされたリリースが存在するという問題があります。これは、同じコミットに対して2つのリリースがあることを意味します。

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

は、このような構成をachiveするいずれかの可能性がある:私は両方のビルドを兼ね備えた唯一のリリースがあることをachiveしたいですか?

+0

ビルド定義のパスフィルタを設定しましたか?私はコミットが両方のビルドの代わりに対応するビルドをトリガするだけであることを確認したいと思いますか? –

+0

私はパスフィルターを定義しました。しかし、複数のパスに関連するチェックインがある場合、複数のビルドに関連するチェックインがある場合は、ただ1つのリリースが必要です。 – boindiil

答えて

2

最後に、私の問題の解決策を見つけました。他のビルドが動作していない場合、私は現在のビルドにラベルを追加VSTSのタスクを作成した/キューに登録:

enter image description here

[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

現在、あなたがしたいことを本当に達成することはできません。リリースは、複数のアーティファクト・ソース(この場合はビルド)からトリガーするように構成できますが、これらのアーティファクトのいずれかが更新されるといつでもリリースがトリガーされます。 2つのビルドを起動する1つの変更がある場合は、2つのリリースを取得します。

ただし、特定の環境でアーティファクト条件を使用して、その環境の展開のみをトリガすることができます。

だから、あなたは2つの環境にあなたのリリース定義を破るだろう:あなたが唯一のデータベースの変更のためのデータベースのリリースを取得していることを確認し、フロントのフロントエンドのリリースでしょう

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

アーティファクト条件終わりの変化。

「バッチ」モードを使用して、同じコミットで複数のビルドを表示し、それらのすべてが完了するのを待つことができますが、残念なことにそのようなものはありません。

+0

あなたの答えをありがとう、私は別の解決策があると思った。私は自分のソリューションを構築する(私の答えを参照) – boindiil

関連する問題