Skip to content

Instantly share code, notes, and snippets.

@matejskubic
Created September 21, 2017 14:25
Show Gist options
  • Save matejskubic/7d9a11dff69e4eca6ba5a95cd6bb60f8 to your computer and use it in GitHub Desktop.
Save matejskubic/7d9a11dff69e4eca6ba5a95cd6bb60f8 to your computer and use it in GitHub Desktop.
VisualStudio Release Environment Cleanup
<#
.SYNOPSIS
.DESCRIPTION
#>
[CmdletBinding()]
Param(
#
[Parameter(Mandatory=$true)]
[string]$tfsUrl
,
#
[Parameter(Mandatory=$true)]
[string]$tfsProject
,
#
[Parameter(Mandatory=$true)]
[string]$tfsAuthPAT
,
#
[string[]]$tfsReleaseDefinition
,
#
[string[]]$tfsReleaseEnvironment
,
#
[timespan]$maxAge = "5:00:00"
)
Set-StrictMode -Version 2.0
#$VerbosePreference = [System.Management.Automation.ActionPreference]::Continue
function processReleaseDefinition($tfsReleaseDefinitionId)
{
$releases = Invoke-RestMethod -WebSession $ws "$vsrmUri/$projectName/_apis/release/releases?definitionId=$tfsReleaseDefinitionId&%24expand=2&statusFilter=active&isDeleted=false&api-version=4.0-preview"
#$releases = Invoke-RestMethod -WebSession $ws "$vsrmUri/$projectName/_apis/release/releases?definitionId=$tfsReleaseDefinitionId&%24expand=2&statusFilter=active&environmentStatusFilter=inProgress&api-version=4.0-preview"
#$releases.value|ogv
#$release = $releases.value[0]
$releases.value | % {
$release = $_
processRelease $release
}
}
function processRelease($release)
{
$releaseCreatedOn = [System.DateTimeOffset]::Parse($release.createdOn)
if ($releaseCreatedOn -gt $cancelReleasesOlderThan)
{
Write-Verbose "Release $($release.releaseDefinition.name) / $($release.name) ($($release.id)) will be canceled after $($releaseCreatedOn.Add($maxAge).ToString('o'))"
return
}
$releaseEnvironmentCancelRequest = @{
"status"= "Canceled"; # Canceled = 8
"comment"= "Canceled by release cleanup script";
}
$jsonCancel = $releaseEnvironmentCancelRequest | ConvertTo-Json
#$environment = $release.environments[0]
$release.environments | % {
$environment = $_
if ($environment.status -eq 'inProgress' -and (!$tfsReleaseEnvironment -or $tfsReleaseEnvironment.Contains($environment.name)))
{
write "Canceling release $($release.releaseDefinition.name) / $($release.name) ($($release.id)) for environment $($environment.name)"
$releaseEnvironmentCancel = Invoke-RestMethod -WebSession $ws -Method Patch -Body $jsonCancel "$vsrmUri/$projectName/_apis/release/releases/$($release.id)/environments/$($environment.id)?api-version=4.0-preview"
}
}
}
function main()
{
$cancelReleasesOlderThan = [System.DateTimeOffset]::UtcNow.Subtract($maxAge)
$ws = New-Object Microsoft.PowerShell.Commands.WebRequestSession
$ws.Headers.Add("Authorization", "Basic $([System.Convert]::ToBase64String([System.Text.Encoding]::Default.GetBytes(":$tfsAuthPAT")))")
$ws.Headers.Add('Content-Type', 'application/json')
#$ws.Proxy = New-Object System.Net.WebProxy "http://localhost:8888"
$project = Invoke-RestMethod -WebSession $ws "$uri/DefaultCollection/_apis/projects/$($tfsProject)?api-version=2.0"
$projectId = $project.id
$projectName = $project.name
$uriLoc = $uri.IndexOf(".visualstudio.com")
$vsrmUri = $uri.Substring(0, $uriLoc) + ".vsrm" + $uri.Substring($uriLoc)
if ($tfsReleaseDefinition -eq $null)
{
$tfsReleaseDefinition = @()
}
$tfsReleaseDefinitionIds = New-Object System.Collections.Generic.List[int]
$definitions = Invoke-RestMethod -WebSession $ws "$vsrmUri/$projectName/_apis/release/definitions?api-version=4.0-preview"
#$definitions.value|ogv
#$definition = $definitions.value[0]
$definitions.value | % {
$definition = $_
if (!$tfsReleaseDefinition -or $tfsReleaseDefinition.Contains($definition.name))
{
$tfsReleaseDefinitionIds.Add($definition.id)
}
}
$tfsReleaseDefinitionIds | % {
$tfsReleaseDefinitionId = $_
processReleaseDefinition $tfsReleaseDefinitionId
}
}
main
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment