Scripts/Unblock-OctopusRelease.ps1

<#
.Synopsis
   Unblocks an Octopus Release from being deployed to another environment
.Synopsis
   Unblocks an Octopus Release from being deployed to another environment
.EXAMPLE
   Unblock-OctopusRelease -Projectname "MyProduct.WebApp" -Version 1.0.0
 
   UnBlocks release 1.0.0 of the project "MyProduct.WebApp"
.EXAMPLE
   Get-OctopusRelease -Project "MyProduct.Webapp" -version 1.0.1 | UnBlock-OctopusRelease
    
   Unblocks the release 1.0.1 of the project "MyProduct.Webapp"
.LINK
   Github project: https://github.com/Dalmirog/Octoposh
   Advanced Cmdlet Usage: https://github.com/Dalmirog/OctoPosh/wiki/Advanced-Examples
   QA and Cmdlet request: https://gitter.im/Dalmirog/OctoPosh#initial
#>

function Unblock-OctopusRelease
{
    [CmdletBinding()]
    Param
    (
        # Project Name
        [Parameter(Mandatory=$true, ValueFromPipelineByPropertyName = $true)]
        [string]$ProjectName,

        # Release Version number
        [Parameter(Mandatory=$true, ValueFromPipelineByPropertyName = $true)]
        [string]$ReleaseVersion,

        # Forces cmdlet to continue without prompting
        [switch]$Force
    )

    Begin
    {
        $c = New-OctopusConnection
    }
    Process
    {

        If(!($Force)){
            If (!(Get-UserConfirmation -message "Are you sure you want to unblock release $ReleaseVersion on project $ProjectName ?")){
                Throw "Canceled by user"
            }
        }
    
        Write-Verbose "[$($MyInvocation.MyCommand)] Looking for project: $ProjectName"        
        $p = Get-OctopusProject -ProjectName $ProjectName -ErrorAction Stop -ResourceOnly        
        Write-Verbose "[$($MyInvocation.MyCommand)] Project found: $ProjectName"
        
        Write-Verbose "[$($MyInvocation.MyCommand)] Looking for release: $ReleaseVersion"

        $release = $c.repository.Projects.GetReleaseByVersion($p, $ReleaseVersion)        

        If($release -eq $null){
            Throw "Release $ReleaseVersion not found for project $ProjectName"
        }
        
        Write-Verbose "[$($MyInvocation.MyCommand)] Release found: $($Release.version)"

        Try{
            Write-Verbose "[$($MyInvocation.MyCommand)] Blocking release $($Release.version)"            
            $r = Invoke-WebRequest $env:OctopusURL/$($release.links.ResolveDefect) -Method Post -Headers $c.header -UseBasicParsing -Verbose:$false
        }

        Catch{
            write-error $_        
        }

    }
    End
    {
        Write-Verbose "[$($MyInvocation.MyCommand)] HTTP request to block release $($Release.version) of project $($p.name) returned code $($r.statuscode)"
        if($r.statuscode -eq 200){        
            Return $True
        }
        Else{
            Return $false
        }

    }
}