How to undelete releases of a release definition?

One of our customer have reported as he has deleted few releases of a given release definition accidentally and wanted to know a way to bulk un-delete those releases. The undelete can be done within 15 days of the soft delete and after that releases are permanently deleted. It can be un-deleted either using Powershell or C# program.

Using powershell:-

===============

 param (
[Parameter(Mandatory=$true)]
[ValidateNotNullOrEmpty()]
[string] $token,
[int32] $definitionId
)

## Construct a basic auth head using PAT
function BasicAuthHeader()
{

  param([string]$authtoken)
  $ba = (":{0}" -f $authtoken)
  $ba = [System.Text.Encoding]::UTF8.GetBytes($ba)
  $ba = [System.Convert]::ToBase64String($ba)
  $h = @{Authorization=("Basic{0}" -f $ba);ContentType="application/json"}
  return $h
}

# Fill in your account name/project name/definition name
$accountName = "anjani1"
$projectName = "TFVCProj"
$definitionNameToRecover = "New Release Definition"
# Find the Id of release definition that got deleted
$deletedReleasesUri = "https://$accountName.vsrm.visualstudio.com/$projectName/_apis/Release/releases?api-version=4.1-preview.6&isDeleted=true&definitionId=$definitionId"
$h = BasicAuthHeader $token
$deletedReleases = Invoke-RestMethod -Uri $deletedReleasesUri -Headers $h -ContentType “application/json" -Method Get
$deletedReleasesIds = $deletedReleases.value.id # | ConvertTo-Json -Depth 100
write-host "Found the total deleted releases : $deletedReleasesIds.count"
For ($i=0; $i -lt $deletedReleasesIds.count; $i++)
{
$deletedReleaseId = $deletedReleasesIds[$i];
Write-Host "Found the deleted id : $deletedReleaseId";
# Recover the deleted release
$undeleteReason = '{ "Comment" : "Deleted by mistake" }'
$undeleteReleaseUri = "https://$accountName.vsrm.visualstudio.com/$projectName/_apis/Release/releases/$deletedReleaseId`?comment=$undeleteReason&api-version=4.1-preview.6"
$undeletedDefinition = Invoke-RestMethod -Uri $undeleteReleaseUri -Headers $h -ContentType “application/json" -Method Put -Body $undeleteReason
write-host "Release id: $deletedReleaseId recovered successfully"
}

 

Using C# You may refer the blog link to know as how to program using ReleaseManagement client

==============

 using System;
using Microsoft.VisualStudio.Services.Client;
using Microsoft.VisualStudio.Services.Common;
using Microsoft.VisualStudio.Services.ReleaseManagement.WebApi.Clients;
using Microsoft.VisualStudio.Services.WebApi;
using Microsoft.VisualStudio.Services.ReleaseManagement.WebApi;
using Microsoft.VisualStudio.Services.ReleaseManagement.WebApi.Contracts;
using System.Diagnostics;

namespace ReleaseHttpClientSample
{
 class Program
 {

  static void Main(string[] args)

    {

      Uri serverUrl = new Uri("https://anjani1.visualstudio.com");
      var project = "TFVCProj";
      VssCredentials credentials = new VssClientCredentials();
      credentials.Storage = new VssClientCredentialStorage();
      VssConnection connection = new VssConnection(serverUrl, credentials);
      ReleaseHttpClient rmClient = connection.GetClient<ReleaseHttpClient>();
      var releases = rmClient.GetReleasesAsync(project, definitionId: 1, isDeleted: true).Result;
      foreach(var release in releases)
          {
             rmClient.UndeleteReleaseAsync(project, release.Id, "Deleted by mistake").SyncResult();
          }
    }
 }
}