Skip to content

Commit a724ffe

Browse files
authored
Merge pull request #266 from christianbumann/feature/gh-265
(GH-265) Add an alias to get all build definitions for a project
2 parents 42fe6d9 + 9983d7f commit a724ffe

7 files changed

+221
-32
lines changed

src/Cake.AzureDevOps/AzureDevOpsAliases.Pipelines.cs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -399,5 +399,42 @@ public static IEnumerable<AzureDevOpsTestRun> AzureDevOpsBuildTestRuns(
399399
new AzureDevOpsBuild(context.Log, settings, new BuildClientFactory(), new TestManagementClientFactory())
400400
.GetTestRuns();
401401
}
402+
403+
/// <summary>
404+
/// Gets Azure Pipelines build definitions for the specified settings.
405+
/// </summary>
406+
/// <param name="context">The context.</param>
407+
/// <param name="settings">Settings for getting the build definitions.</param>
408+
/// <example>
409+
/// <para>Get build definitions running on Azure DevOps Server:</para>
410+
/// <code>
411+
/// <![CDATA[
412+
/// var buildSettings =
413+
/// new AzureDevOpsBuildsSettings(
414+
/// new Uri("http://myserver:8080/defaultcollection"),
415+
/// "MyProject",
416+
/// AzureDevOpsAuthenticationNtlm());
417+
///
418+
/// var buildDefinitions =
419+
/// AzureDevOpsBuildDefinitions(
420+
/// buildSettings);
421+
/// ]]>
422+
/// </code>
423+
/// </example>
424+
/// <returns>The build definitions or an empty list of build definitions.</returns>
425+
[CakeMethodAlias]
426+
[CakeAliasCategory("Azure Pipelines")]
427+
[CakeNamespaceImport("Cake.AzureDevOps.Pipelines")]
428+
public static IEnumerable<AzureDevOpsBuildDefinition> AzureDevOpsBuildDefinitions(
429+
this ICakeContext context,
430+
AzureDevOpsBuildsSettings settings)
431+
{
432+
context.NotNull(nameof(context));
433+
settings.NotNull(nameof(settings));
434+
435+
return AzureDevOpsBuildsDefinitionHelper.GetAzureDevOpsBuildDefinitions(
436+
context.Log,
437+
settings);
438+
}
402439
}
403440
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
namespace Cake.AzureDevOps.Pipelines
2+
{
3+
/// <summary>
4+
/// Representation of a build definition.
5+
/// </summary>
6+
public class AzureDevOpsBuildDefinition
7+
{
8+
/// <summary>
9+
/// Gets the ID of the build definition.
10+
/// </summary>
11+
public int Id { get; internal set; }
12+
13+
/// <summary>
14+
/// Gets the name of the build definition.
15+
/// </summary>
16+
public string Name { get; internal set; }
17+
18+
/// <summary>
19+
/// Gets the queue status.
20+
/// </summary>
21+
public AzureDevOpsDefinitionQueueStatus QueueStatus { get; internal set; }
22+
}
23+
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
namespace Cake.AzureDevOps.Pipelines
2+
{
3+
using System;
4+
using System.Collections.Generic;
5+
using System.Linq;
6+
using Cake.Core.Diagnostics;
7+
using Microsoft.TeamFoundation.Build.WebApi;
8+
9+
/// <summary>
10+
/// Provides functions for Azure DevOps build definitions.
11+
/// </summary>
12+
internal static class AzureDevOpsBuildsDefinitionHelper
13+
{
14+
/// <summary>
15+
/// Returns the build definitions for the <paramref name="settings"/>.
16+
/// </summary>
17+
/// <param name="log">The Cake log context.</param>
18+
/// <param name="settings">Settings for accessing Azure DevOps.</param>
19+
/// <returns>The build definitions for the the <paramref name="settings"/>.</returns>
20+
internal static IEnumerable<AzureDevOpsBuildDefinition> GetAzureDevOpsBuildDefinitions(
21+
ICakeLog log,
22+
AzureDevOpsBuildsSettings settings)
23+
{
24+
log.NotNull(nameof(log));
25+
settings.NotNull(nameof(settings));
26+
27+
List<BuildDefinitionReference> buildDefinitions = null;
28+
29+
using (var buildHttpClient = new BuildClientFactory().CreateBuildClient(settings.CollectionUrl, settings.Credentials))
30+
{
31+
if (settings.ProjectGuid != Guid.Empty)
32+
{
33+
buildDefinitions =
34+
buildHttpClient
35+
.GetDefinitionsAsync(settings.ProjectGuid)
36+
.ConfigureAwait(false)
37+
.GetAwaiter()
38+
.GetResult();
39+
}
40+
else if (!string.IsNullOrWhiteSpace(settings.ProjectName))
41+
{
42+
buildDefinitions =
43+
buildHttpClient
44+
.GetDefinitionsAsync(settings.ProjectName)
45+
.ConfigureAwait(false)
46+
.GetAwaiter()
47+
.GetResult();
48+
}
49+
else
50+
{
51+
throw new ArgumentOutOfRangeException(
52+
nameof(settings),
53+
"Either ProjectGuid or ProjectName needs to be set");
54+
}
55+
56+
log.Verbose(
57+
"{0} Build definitions found",
58+
buildDefinitions.Count);
59+
60+
return buildDefinitions
61+
.Select(x => x.ToAzureDevOpsBuildDefinition())
62+
.ToList();
63+
}
64+
}
65+
}
66+
}

src/Cake.AzureDevOps/Pipelines/AzureDevOpsBuildsHelper.cs

Lines changed: 8 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,11 @@ internal static IEnumerable<AzureDevOpsBuild> GetAzureDevOpsBuilds(
3434
authorizedIdenity.Id,
3535
authorizedIdenity.DisplayName);
3636

37-
BuildDefinitionReference buildDefinition = null;
37+
AzureDevOpsBuildDefinition buildDefinition = null;
3838

3939
if (!string.IsNullOrEmpty(settings.BuildDefinitionName))
4040
{
41-
buildDefinition = GetBuildDefinition(log, buildHttpClient, settings);
41+
buildDefinition = GetBuildDefinition(log, settings);
4242
if (buildDefinition == null)
4343
{
4444
throw new InvalidOperationException($"Build definition '{settings.BuildDefinitionName}' not found");
@@ -105,45 +105,21 @@ internal static IEnumerable<AzureDevOpsBuild> GetAzureDevOpsBuilds(
105105
/// Returns the build definition for the <paramref name="settings"/>.
106106
/// </summary>
107107
/// <param name="log">The Cake log context.</param>
108-
/// <param name="buildHttpClient">The Http build client.</param>
109108
/// <param name="settings">Settings for accessing AzureDevOps.</param>
110109
/// <returns>The build definition for the BuildDefinitionName on <paramref name="settings"/>.
111110
/// <c>null</c> if the BuildDefinitionName was not set or no build definition was found.</returns>
112-
private static BuildDefinitionReference GetBuildDefinition(
111+
private static AzureDevOpsBuildDefinition GetBuildDefinition(
113112
ICakeLog log,
114-
BuildHttpClient buildHttpClient,
115113
AzureDevOpsBuildsSettings settings)
116114
{
117115
log.NotNull(nameof(log));
118-
buildHttpClient.NotNull(nameof(buildHttpClient));
119116
settings.NotNull(nameof(settings));
120117

121-
List<BuildDefinitionReference> buildDefinitions = null;
122-
123-
if (settings.ProjectGuid != Guid.Empty)
124-
{
125-
buildDefinitions =
126-
buildHttpClient
127-
.GetDefinitionsAsync(settings.ProjectGuid)
128-
.ConfigureAwait(false)
129-
.GetAwaiter()
130-
.GetResult();
131-
}
132-
else if (!string.IsNullOrWhiteSpace(settings.ProjectName))
133-
{
134-
buildDefinitions =
135-
buildHttpClient
136-
.GetDefinitionsAsync(settings.ProjectName)
137-
.ConfigureAwait(false)
138-
.GetAwaiter()
139-
.GetResult();
140-
}
141-
else
142-
{
143-
throw new ArgumentOutOfRangeException(
144-
nameof(settings),
145-
"Either ProjectGuid or ProjectName needs to be set");
146-
}
118+
var buildDefinitions =
119+
AzureDevOpsBuildsDefinitionHelper
120+
.GetAzureDevOpsBuildDefinitions(
121+
log,
122+
settings);
147123

148124
var buildDefinition =
149125
buildDefinitions
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
namespace Cake.AzureDevOps.Pipelines
2+
{
3+
/// <summary>
4+
/// Possible states of a build queue.
5+
/// </summary>
6+
public enum AzureDevOpsDefinitionQueueStatus : byte
7+
{
8+
/// <summary>
9+
/// When enabled the definition queue allows builds to be queued by users.
10+
/// The system will queue scheduled, gated and continuous integration builds,
11+
/// and the queued builds will be started by the system.
12+
/// </summary>
13+
Enabled = 0,
14+
15+
/// <summary>
16+
/// When paused the definition queue allows builds to be queued by users and the
17+
/// system will queue scheduled, gated and continuous integration builds.
18+
/// Builds in the queue will not be started by the system.
19+
/// </summary>
20+
Paused = 1,
21+
22+
/// <summary>
23+
/// When disabled the definition queue will not allow builds to be queued by users
24+
/// and the system will not queue scheduled, gated or continuous integration builds.
25+
/// Builds already in the queue will not be started by the system.
26+
/// <summary>
27+
Disabled = 2,
28+
}
29+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
namespace Cake.AzureDevOps.Pipelines
2+
{
3+
using Microsoft.TeamFoundation.Build.WebApi;
4+
5+
/// <summary>
6+
/// Extensions for the <see cref="BuildDefinitionReference"/> class.
7+
/// </summary>
8+
internal static class BuildDefinitionReferenceExtensions
9+
{
10+
/// <summary>
11+
/// Converts a <see cref="BuildDefinitionReference"/> to an <see cref="AzureDevOpsBuildDefinition"/>.
12+
/// </summary>
13+
/// <param name="buildDefinitionReference">Build definition reference to convert.</param>
14+
/// <returns>Converted build definition.</returns>
15+
public static AzureDevOpsBuildDefinition ToAzureDevOpsBuildDefinition(this BuildDefinitionReference buildDefinitionReference)
16+
{
17+
buildDefinitionReference.NotNull(nameof(buildDefinitionReference));
18+
19+
return
20+
new AzureDevOpsBuildDefinition
21+
{
22+
Id = buildDefinitionReference.Id,
23+
Name = buildDefinitionReference.Name,
24+
QueueStatus = buildDefinitionReference.QueueStatus.ToAzureDevOpsDefinitionQueueStatus(),
25+
};
26+
}
27+
}
28+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
namespace Cake.AzureDevOps.Pipelines
2+
{
3+
using Microsoft.TeamFoundation.Build.WebApi;
4+
5+
/// <summary>
6+
/// Extensions for the <see cref="DefinitionQueueStatus"/> class.
7+
/// </summary>
8+
internal static class DefinitionQueueStatusExtensions
9+
{
10+
/// <summary>
11+
/// Converts a <see cref="DefinitionQueueStatus"/> to an <see cref="AzureDevOpsDefinitionQueueStatus"/>.
12+
/// </summary>
13+
/// <param name="status">Status to convert.</param>
14+
/// <returns>Converted status.</returns>
15+
public static AzureDevOpsDefinitionQueueStatus ToAzureDevOpsDefinitionQueueStatus(this DefinitionQueueStatus status)
16+
{
17+
switch (status)
18+
{
19+
case DefinitionQueueStatus.Enabled:
20+
return AzureDevOpsDefinitionQueueStatus.Enabled;
21+
case DefinitionQueueStatus.Paused:
22+
return AzureDevOpsDefinitionQueueStatus.Paused;
23+
case DefinitionQueueStatus.Disabled:
24+
return AzureDevOpsDefinitionQueueStatus.Disabled;
25+
default:
26+
throw new System.Exception("Unknown value");
27+
}
28+
}
29+
}
30+
}

0 commit comments

Comments
 (0)