/
PipelineRunner.cs
108 lines (94 loc) · 4.02 KB
/
PipelineRunner.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text.Json;
using System.Threading.Tasks;
namespace Orchestrator
{
internal interface IPipelineRunner
{
Task<int> PendingBuilds();
Task<int> PendingReleases();
}
internal class FakePipelineRunner : IPipelineRunner
{
/// <summary>
/// The Azure DevOps REST API is a bit flaky, so using this for faster feedback.
/// </summary>
/// <returns>A small number.</returns>
public Task<int> PendingBuilds()
{
return Task.FromResult(new Random().Next(0, 2));
}
/// <summary>
/// The Azure DevOps REST API is a bit flaky, so using this for faster feedback.
/// </summary>
/// <returns>A small number.</returns>
public Task<int> PendingReleases()
{
return Task.FromResult(new Random().Next(0, 2));
}
}
internal class AzureDevOpsPipelineRunner : IPipelineRunner
{
private readonly HttpClient httpClient;
private readonly Settings settings;
public AzureDevOpsPipelineRunner(
HttpClient httpClient,
Settings settings)
{
this.httpClient = httpClient;
this.settings = settings;
}
/// <summary>
/// Makes a REST API call to Azure DevOps to query all builds with the status Not Started.
/// </summary>
/// <returns>The number of not started builds.</returns>
public async Task<int> PendingBuilds()
{
var request = CreateAuthenticatedRequest(
$"{settings.AzureDevOpsProjectUrl}/_apis/build/builds?statusFilter=notStarted&api-version=6.0");
var response = await this.httpClient.SendAsync(request);
var content = await response.Content.ReadAsStringAsync();
var builds = JsonSerializer.Deserialize<Builds>(content);
return builds.count;
}
/// <summary>
/// Makes a REST API call to Azure DevOps to query all releases which are Not Started.
/// </summary>
/// <remarks>
/// The queries to VSTS RM don't work properly.
/// Waiting for an answer on my GitHub issue over here: https://github.com/MicrosoftDocs/vsts-rest-api-specs/issues/485
///
/// https://docs.microsoft.com/en-us/rest/api/azure/devops/release/releases/list?view=azure-devops-rest-6.0#releasestatus
///
/// Got the following information from GitHub:
/// environmentStatusFilter values Undefined = 0, NotStarted = 1, InProgress = 2, Succeeded = 4, Canceled = 8, Rejected = 16, Qeued = 32, Scheduled = 64, PartiallySucceeded = 128
///
/// https://vsrm.dev.azure.com/janv/Livecoding/_apis/release/releases?api-version=6.1-preview.8&$expand=environments&environmentStatusFilter=4
/// </remarks>
/// <returns>The number of all Not Started releases.</returns>
public async Task<int> PendingReleases()
{
var request = CreateAuthenticatedRequest(
$"{settings.AzureDevOpsProjectUrl}/_apis/release/releases?api-version=6.1-preview.8&$expand=environments&environmentStatusFilter=4");
var response = await this.httpClient.SendAsync(request);
var content = await response.Content.ReadAsStringAsync();
var builds = JsonSerializer.Deserialize<Builds>(content);
return builds.count;
}
private HttpRequestMessage CreateAuthenticatedRequest(string url)
{
var credentials = Convert.ToBase64String(
System.Text.ASCIIEncoding.ASCII.GetBytes(
string.Format("{0}:{1}", "", settings.AzureDevOpsPAT)));
var request = new HttpRequestMessage
{
RequestUri = new Uri(url),
Method = HttpMethod.Get,
Headers = { Authorization = new AuthenticationHeaderValue("Basic", credentials) }
};
return request;
}
}
}