В TFS 2018 мы можем «Пакетные изменения во время сборки», чтобы, если во время сборки происходило нажатие Git, второй ожидает, пока первым завершит . Таким образом, мы можем остановить одновременное выполнение нескольких сборок.
Тем не менее, похоже, что аналогичная опция для релизов.
Учитывая мою сильно ограниченную пропускную способность, данный выпуск может занять гораздо больше времени, чем сборка, которая его инициировала. Вполне возможно, что эта вторая сборка, даже в очереди, вызовет новую версию, когда она уже выполняется. Мне нужно поставить в очередь весь конвейер до завершения текущего выпуска, а не только сборку.
Я смог сделать это с помощью неуклюжей и хрупкой серии скриптов PowerShell (которую очень сложно настраивать в ее текущем состоянии), но я бы хотел что-то более солидное, если это возможно.
Как мне лучше всего это сделать?
Тест-PipelineStatus.ps1
$BuildDefinitionName = (Get-Item Env:BUILD_DEFINITIONNAME).Value
$ArtifactsDirectory = (Get-Item Env:BUILD_ARTIFACTSTAGINGDIRECTORY).Value
$SourcesDirectory = (Get-Item Env:BUILD_SOURCESDIRECTORY).Value
$LocatorFilePath = "$ArtifactsDirectory\Locator.txt"
$StatusDirectory = "$SourcesDirectory\Pipeline"
$StatusFilePath = "$StatusDirectory\Status.txt"
Set-Content $LocatorFilePath $StatusFilePath
If ((Test-Path $StatusDirectory) -eq $False) {
Write-Output "Creating pipeline status directory"
New-Item $StatusDirectory -ItemType Directory
}
Write-Output "Getting current pipeline status"
If (Test-Path $StatusFilePath) {
$Status = Get-Content $StatusFilePath
If ($Status -eq "Stopped") {
Write-Output "Setting current pipeline status to [Running]"
Set-Content $StatusFilePath "Running"
} Else {
Write-Error "Pipeline [$BuildDefinitionName] is already in progress. Failing this build."
Exit 1
}
} Else {
Write-Output "Setting current pipeline status to [Running]"
Set-Content $StatusFilePath "Running"
}
Get-StatusFilePath.ps1
$ArtifactsDirectory = (Get-Item Env:SYSTEM_ARTIFACTSDIRECTORY).Value
$ReleaseDefinition = (Get-Item Env:RELEASE_DEFINITIONNAME).Value
$LocatorFilePath = "$ArtifactsDirectory\$ReleaseDefinition\drop\Locator.txt"
$StatusFilePath = Get-Content $LocatorFilePath
Write-Output "Setting variable [StatusFilePath] to [$StatusFilePath]"
Write-Host "##vso[task.setvariable variable=StatusFilePath]$StatusFilePath"
Remove-Item $LocatorFilePath
Set-ReleaseComplete.ps1
[CmdletBinding()]
param(
[Parameter(Mandatory)][string] $StatusFilePath
)
Write-Output "Marking pipeline as complete"
Set-Content $StatusFilePath -Value "Stopped"