functions/Get-LatestReleasePipelineStageSuccess.ps1

function Get-AzureDevOpsLastSuccessfulRelease { 
    <#
        .SYNOPSIS
        Grabs the latest success of a specific release definition and specific stage.
        .DESCRIPTION
        Grabs the latest success of a specific release definition and specific stage.
        .EXAMPLE
        Get-AzureDevOpsLastSuccessfulRelease -Instance 'FakeVisualStudioInstance' -Project 'VisualStudioProjectName' -User 'fakeuser@fakeemail.com' -PAT 'fakepat912830985' -ReleaseDefinition 'ReleasePipeline' -ReleaseStage "LCSUpload"
        .PARAMETER ParameterName
        Parameter details
        #>
 
    [CmdletBinding()]
    param([Parameter(ValueFromPipeline = $True,
            ValueFromPipelineByPropertyName = $True,
            HelpMessage = 'Help Message?')]
        [Alias('Get-LastSuccessfulRelease')]
        [string]$Instance,
        [string]$Project,
        [string]$User,
        [string]$PAT,
        [string]$ReleaseDefinition, 
        [string]$ReleaseStage
    )

    $base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $User, $PAT)))
    
    $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
    $headers.Add('Authorization', ('Basic {0}' -f $base64AuthInfo))
    $headers.Add('Accept', 'application/json') 
    
    # Get array of project release types and get project (release def) id
    $releasedefinitionlistURL = "https://vsrm.dev.azure.com/$Instance/$Project/_apis/release/definitions?api-version=5.1"
    $results = Invoke-RestMethod -Headers $Headers -ContentType application/json -Uri $releasedefinitionlistURL -Method Get -UseBasicParsing

    $SpecificReleaseDefinition = $results.value | Where-Object { $_.name -eq $ReleaseDefinition }
    $ReleaseDefinitionId = $SpecificReleaseDefinition.id

    if (!$ReleaseDefinitionId) {
        Stop-PSFFunction -Message "Error: Cannot find release definition. Stopping" -EnableException $true -Cmdlet $PSCmdlet
    }
    
    $SpecificDefinitionIDSuccessAPI = "https://vsrm.dev.azure.com/$Instance/$Project/_apis/release/deployments?definitionid=$ReleaseDefinitionId&deploymentStatus=succeeded"
    $RPResults = Invoke-RestMethod -Method Get -Headers $Headers -ContentType application/json -Uri $SpecificDefinitionIDSuccessAPI -UseBasicParsing
    
    $ReleaseId = $RPResults.value.release.id | Sort-Object -Descending | Select-Object -First 1

    # Get release list
    $releaseapi = "https://vsrm.dev.azure.com/$Instance/$Project/_apis/release/releases/?api-version=5.1"
    $releaseapiResult = Invoke-RestMethod -Method Get -Headers $Headers -ContentType application/json -Uri $releaseapi -UseBasicParsing
    
    # Filter by release id and find build number
    $releaseapiFiltered = $releaseapiResult.value | Where-Object { $_.id -eq $ReleaseId }
    $TempArray = $releaseapiFiltered.description.Split(" ")
    $ReleaseName = $TempArray[$TempArray.Count - 1].TrimEnd(".")
    $url = "https://vsrm.dev.azure.com/$Instance/$Project/_apis/release/releases/$releaseID" + "?api-version=5.1"
    $Variables = (invoke-restmethod -method Get -uri $url -Headers $headers).variables
    $VariableNames = $Variables | Get-Member | Where-Object { $_.MemberType -eq "NoteProperty" -and $_.Name -ne "System.Debug" } | Select-Object Name

    $Properties = @{
        "ReleaseId"             = $ReleaseId
        "ReleaseName"           = $ReleaseName
        "ReleaseDefinitionName" = $ReleaseDefinition
    }
    $Output = New-Object PSObject -Property $Properties
    foreach ($VariableName in $VariableNames.Name) {
        
        $value = $Variables.$VariableName.value
        Write-PSFMessage -Level VeryVerbose -Message "Adding Variable $VariableName with a value of $value"
        Add-Member -Name $VariableName -Value $value -InputObject $Output -MemberType NoteProperty
    }


    return $Output
}