tgstation-server 5.12.7
The /tg/station 13 server suite
Loading...
Searching...
No Matches
BaseRemoteDeploymentManager.cs
Go to the documentation of this file.
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Threading;
5using System.Threading.Tasks;
6
7using Microsoft.Extensions.Logging;
8
11
13{
18 {
22 protected Api.Models.Instance Metadata { get; }
23
27 protected ILogger<BaseRemoteDeploymentManager> Logger { get; }
28
34 protected BaseRemoteDeploymentManager(ILogger<BaseRemoteDeploymentManager> logger, Api.Models.Instance metadata)
35 {
36 Logger = logger ?? throw new ArgumentNullException(nameof(logger));
37 Metadata = metadata ?? throw new ArgumentNullException(nameof(metadata));
38 }
39
41 public async Task PostDeploymentComments(
42 CompileJob compileJob,
43 RevisionInformation previousRevisionInformation,
44 RepositorySettings repositorySettings,
45 string repoOwner,
46 string repoName,
47 CancellationToken cancellationToken)
48 {
49 if (repositorySettings?.AccessToken == null)
50 return;
51
52 var deployedRevisionInformation = compileJob.RevisionInformation;
53 if ((previousRevisionInformation != null && previousRevisionInformation.CommitSha == deployedRevisionInformation.CommitSha)
54 || !repositorySettings.PostTestMergeComment.Value)
55 return;
56
57 previousRevisionInformation ??= new RevisionInformation();
58 previousRevisionInformation.ActiveTestMerges ??= new List<RevInfoTestMerge>();
59
60 deployedRevisionInformation.ActiveTestMerges ??= new List<RevInfoTestMerge>();
61 var tasks = new List<Task>();
62
63 // added prs
64 var addedTestMerges = deployedRevisionInformation
65 .ActiveTestMerges
66 .Select(x => x.TestMerge)
67 .Where(x => !previousRevisionInformation
68 .ActiveTestMerges
69 .Any(y => y.TestMerge.Number == x.Number))
70 .ToList();
71 var removedTestMerges = previousRevisionInformation
73 .Select(x => x.TestMerge)
74 .Where(x => !deployedRevisionInformation
75 .ActiveTestMerges
76 .Any(y => y.TestMerge.Number == x.Number))
77 .ToList();
78 var updatedTestMerges = deployedRevisionInformation
79 .ActiveTestMerges
80 .Select(x => x.TestMerge)
81 .Where(x => previousRevisionInformation
82 .ActiveTestMerges
83 .Any(y => y.TestMerge.Number == x.Number))
84 .ToList();
85
86 if (!addedTestMerges.Any() && !removedTestMerges.Any() && !updatedTestMerges.Any())
87 return;
88
89 Logger.LogTrace(
90 "Commenting on {0} added, {1} removed, and {2} updated test merge sources...",
91 addedTestMerges.Count,
92 removedTestMerges.Count,
93 updatedTestMerges.Count);
94 foreach (var addedTestMerge in addedTestMerges)
95 tasks.Add(
97 repositorySettings,
98 repoOwner,
99 repoName,
101 repositorySettings,
102 compileJob,
103 addedTestMerge,
104 repoOwner,
105 repoName,
106 false),
107 addedTestMerge.Number,
108 cancellationToken));
109
110 foreach (var removedTestMerge in removedTestMerges)
111 tasks.Add(
113 repositorySettings,
114 repoOwner,
115 repoName,
116 "#### Test Merge Removed",
117 removedTestMerge.Number,
118 cancellationToken));
119
120 foreach (var updatedTestMerge in updatedTestMerges)
121 tasks.Add(
123 repositorySettings,
124 repoOwner,
125 repoName,
127 repositorySettings,
128 compileJob,
129 updatedTestMerge,
130 repoOwner,
131 repoName,
132 true),
133 updatedTestMerge.Number,
134 cancellationToken));
135
136 if (tasks.Any())
137 await Task.WhenAll(tasks);
138 }
139
141 public abstract Task ApplyDeployment(CompileJob compileJob, CompileJob oldCompileJob, CancellationToken cancellationToken);
142
144 public abstract Task FailDeployment(CompileJob compileJob, string errorMessage, CancellationToken cancellationToken);
145
147 public abstract Task MarkInactive(CompileJob compileJob, CancellationToken cancellationToken);
148
150 public abstract Task<IReadOnlyCollection<TestMerge>> RemoveMergedTestMerges(
151 IRepository repository,
152 RepositorySettings repositorySettings,
153 RevisionInformation revisionInformation,
154 CancellationToken cancellationToken);
155
157 public abstract Task StageDeployment(CompileJob compileJob, CancellationToken cancellationToken);
158
160 public abstract Task StartDeployment(
161 Api.Models.Internal.IGitRemoteInformation remoteInformation,
162 CompileJob compileJob,
163 CancellationToken cancellationToken);
164
175 protected abstract string FormatTestMerge(
176 RepositorySettings repositorySettings,
177 CompileJob compileJob,
178 TestMerge testMerge,
179 string remoteRepositoryOwner,
180 string remoteRepositoryName,
181 bool updated);
182
193 protected abstract Task CommentOnTestMergeSource(
194 RepositorySettings repositorySettings,
195 string remoteRepositoryOwner,
196 string remoteRepositoryName,
197 string comment,
198 int testMergeNumber,
199 CancellationToken cancellationToken);
200 }
201}
Metadata about a server instance.
Definition: Instance.cs:9
bool? PostTestMergeComment
If test merging should create a comment. Requires AccessToken to be set to function.
abstract Task CommentOnTestMergeSource(RepositorySettings repositorySettings, string remoteRepositoryOwner, string remoteRepositoryName, string comment, int testMergeNumber, CancellationToken cancellationToken)
Create a comment of a given testMergeNumber 's source.
Api.Models.Instance Metadata
The Api.Models.Instance for the BaseRemoteDeploymentManager.
abstract Task StageDeployment(CompileJob compileJob, CancellationToken cancellationToken)
Stage a given compileJob 's deployment. A Task representing the running operation.
abstract Task< IReadOnlyCollection< TestMerge > > RemoveMergedTestMerges(IRepository repository, RepositorySettings repositorySettings, RevisionInformation revisionInformation, CancellationToken cancellationToken)
Get the updated list of TestMerges for an origin merge. A Task<TResult> resulting in the IReadOnlyCol...
abstract string FormatTestMerge(RepositorySettings repositorySettings, CompileJob compileJob, TestMerge testMerge, string remoteRepositoryOwner, string remoteRepositoryName, bool updated)
Formats a comment for a given testMerge .
abstract Task FailDeployment(CompileJob compileJob, string errorMessage, CancellationToken cancellationToken)
Fail a deployment for a given compileJob . A Task representing the running operation.
abstract Task MarkInactive(CompileJob compileJob, CancellationToken cancellationToken)
Mark the deplotment for a given compileJob as inactive. A Task representing the running operation.
async Task PostDeploymentComments(CompileJob compileJob, RevisionInformation previousRevisionInformation, RepositorySettings repositorySettings, string repoOwner, string repoName, CancellationToken cancellationToken)
Post deployment comments to the test merge ticket. A Task representing the running operation.
abstract Task StartDeployment(Api.Models.Internal.IGitRemoteInformation remoteInformation, CompileJob compileJob, CancellationToken cancellationToken)
Start a deployment for a given compileJob . A Task representing the running operation.
BaseRemoteDeploymentManager(ILogger< BaseRemoteDeploymentManager > logger, Api.Models.Instance metadata)
Initializes a new instance of the BaseRemoteDeploymentManager class.
ILogger< BaseRemoteDeploymentManager > Logger
The ILogger for the BaseRemoteDeploymentManager.
abstract Task ApplyDeployment(CompileJob compileJob, CompileJob oldCompileJob, CancellationToken cancellationToken)
Stage a given compileJob 's deployment. A Task representing the running operation.
RevisionInformation RevisionInformation
See CompileJobResponse.RevisionInformation.
Definition: CompileJob.cs:27
ICollection< RevInfoTestMerge > ActiveTestMerges
See Api.Models.RevisionInformation.ActiveTestMerges.
Represents an on-disk git repository.
Definition: IRepository.cs:14