@clickview/ship-it 0.0.43 → 0.0.45
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.gitlab-ci.yml +4 -0
- package/Dangerfile +5 -0
- package/Gemfile +7 -0
- package/config.json +1 -1
- package/danger/validatePackages/Dangerfile +42 -0
- package/dist/P3/P3 Notes Audit.csv +49 -0
- package/lib/config.json +1 -1
- package/lib/src/api-clients/git-lab/GitLabApiClient.js +17 -0
- package/lib/src/commands/CheckReleaseReadyCommand.js +76 -0
- package/lib/src/commands/CreateMergeRequestCommand.js +12 -1
- package/lib/src/commands/CreateNotesAuditCommand.js +12 -1
- package/lib/src/commands/CreateReleaseNotesCommand.js +1 -1
- package/lib/src/commands/ReleaseCommand.js +12 -1
- package/lib/src/commands/StatusCommand.js +12 -1
- package/lib/src/commands/ToolingReleaseCommand.js +12 -1
- package/lib/src/commands/UpdateDescriptionCommand.js +95 -0
- package/lib/src/commands/index.js +1 -0
- package/lib/src/constants/CommandTypeMapping.js +2 -1
- package/lib/src/index.js +0 -0
- package/lib/src/inversify.config.js +4 -0
- package/lib/src/services/GitLabService.js +13 -0
- package/lib/src/startup/SetupCommands.js +1 -0
- package/lib/src/tasks/CheckReleaseReadyTask.js +242 -0
- package/lib/src/tasks/UpdateMergeRequestDescriptionTask.js +121 -0
- package/lib/src/tasks/ValidateDescriptionsTask.js +90 -50
- package/lib/src/tasks/index.js +1 -0
- package/lib/src/types.js +3 -1
- package/lib/src/utils/Descriptions.js +84 -18
- package/package.json +1 -1
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
15
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
16
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
17
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
18
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
19
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
20
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
24
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
25
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
26
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
27
|
+
function step(op) {
|
|
28
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
29
|
+
while (_) try {
|
|
30
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
31
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
32
|
+
switch (op[0]) {
|
|
33
|
+
case 0: case 1: t = op; break;
|
|
34
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
35
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
36
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
37
|
+
default:
|
|
38
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
39
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
40
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
41
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
42
|
+
if (t[2]) _.ops.pop();
|
|
43
|
+
_.trys.pop(); continue;
|
|
44
|
+
}
|
|
45
|
+
op = body.call(thisArg, _);
|
|
46
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
47
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
51
|
+
exports.CheckReleaseReadyTask = void 0;
|
|
52
|
+
require("reflect-metadata");
|
|
53
|
+
var inversify_1 = require("inversify");
|
|
54
|
+
var Logger_1 = require("../utils/Logger");
|
|
55
|
+
var types_1 = require("../types");
|
|
56
|
+
var services_1 = require("../services");
|
|
57
|
+
var utils_1 = require("../utils");
|
|
58
|
+
var CheckReleaseReadyTask = /** @class */ (function () {
|
|
59
|
+
function CheckReleaseReadyTask(service, slackService, trelloService) {
|
|
60
|
+
this.service = service;
|
|
61
|
+
this.slackService = slackService;
|
|
62
|
+
this.trelloService = trelloService;
|
|
63
|
+
}
|
|
64
|
+
CheckReleaseReadyTask.prototype.run = function (options) {
|
|
65
|
+
var _a;
|
|
66
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
67
|
+
var projects, deployDependenciesTasks, beforeReleaseTasks, afterReleaseTasks, sqlSections, _i, projects_1, project, branchName, mergeRequest, owner, deployDependencies, beforeTasks, afterTasks, beforeSQL, afterSQL, _b, deployDependenciesTasks_1, task, _c, beforeReleaseTasks_1, task, _d, afterReleaseTasks_1, task, _e, sqlSections_1, sql, milestoneLabel, deployDependenciesMessage, beforeTasksMessage, afterTasksMessage, sqlMessage, taskSummary;
|
|
68
|
+
return __generator(this, function (_f) {
|
|
69
|
+
switch (_f.label) {
|
|
70
|
+
case 0:
|
|
71
|
+
Logger_1.Logger.logTask('Checking status of the current release...');
|
|
72
|
+
return [4 /*yield*/, this.service.getReleaseProjects(options.milestone, options.projectIds, options.omittedProjectIds, options.sourceBranch)];
|
|
73
|
+
case 1:
|
|
74
|
+
projects = _f.sent();
|
|
75
|
+
deployDependenciesTasks = [];
|
|
76
|
+
beforeReleaseTasks = [];
|
|
77
|
+
afterReleaseTasks = [];
|
|
78
|
+
sqlSections = [];
|
|
79
|
+
_i = 0, projects_1 = projects;
|
|
80
|
+
_f.label = 2;
|
|
81
|
+
case 2:
|
|
82
|
+
if (!(_i < projects_1.length)) return [3 /*break*/, 7];
|
|
83
|
+
project = projects_1[_i];
|
|
84
|
+
return [4 /*yield*/, this.service.getNextBranchInfo(project.id, options.version)];
|
|
85
|
+
case 3:
|
|
86
|
+
branchName = (_f.sent()).branchName;
|
|
87
|
+
return [4 /*yield*/, this.service.getMergeRequest(project.id, branchName)];
|
|
88
|
+
case 4:
|
|
89
|
+
mergeRequest = _f.sent();
|
|
90
|
+
if (!mergeRequest)
|
|
91
|
+
return [3 /*break*/, 6];
|
|
92
|
+
return [4 /*yield*/, this.trelloService.getMember(mergeRequest.url)];
|
|
93
|
+
case 5:
|
|
94
|
+
owner = (_a = _f.sent()) !== null && _a !== void 0 ? _a : 'Unknown';
|
|
95
|
+
deployDependencies = utils_1.Descriptions.getDescriptionSection('Dependencies', mergeRequest);
|
|
96
|
+
beforeTasks = utils_1.Descriptions.getDescriptionSubSection('BeforeRelease', 'Tasks', mergeRequest);
|
|
97
|
+
afterTasks = utils_1.Descriptions.getDescriptionSubSection('AfterRelease', 'Tasks', mergeRequest);
|
|
98
|
+
beforeSQL = utils_1.Descriptions.getDescriptionSubSection('BeforeRelease', 'SQL', mergeRequest);
|
|
99
|
+
afterSQL = utils_1.Descriptions.getDescriptionSubSection('AfterRelease', 'SQL', mergeRequest);
|
|
100
|
+
if (deployDependencies) {
|
|
101
|
+
deployDependenciesTasks.push({
|
|
102
|
+
project: project.title,
|
|
103
|
+
mr: mergeRequest.title,
|
|
104
|
+
content: deployDependencies,
|
|
105
|
+
owner: owner
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
if (beforeTasks) {
|
|
109
|
+
beforeReleaseTasks.push({
|
|
110
|
+
project: project.title,
|
|
111
|
+
mr: mergeRequest.title,
|
|
112
|
+
content: beforeTasks,
|
|
113
|
+
owner: owner
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
if (afterTasks) {
|
|
117
|
+
afterReleaseTasks.push({
|
|
118
|
+
project: project.title,
|
|
119
|
+
mr: mergeRequest.title,
|
|
120
|
+
content: afterTasks,
|
|
121
|
+
owner: owner
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
if (beforeSQL) {
|
|
125
|
+
sqlSections.push({
|
|
126
|
+
project: project.title,
|
|
127
|
+
mr: mergeRequest.title,
|
|
128
|
+
content: beforeSQL,
|
|
129
|
+
phase: 'BeforeRelease',
|
|
130
|
+
owner: owner
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
if (afterSQL) {
|
|
134
|
+
sqlSections.push({
|
|
135
|
+
project: project.title,
|
|
136
|
+
mr: mergeRequest.title,
|
|
137
|
+
content: afterSQL,
|
|
138
|
+
phase: 'AfterRelease',
|
|
139
|
+
owner: owner
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
_f.label = 6;
|
|
143
|
+
case 6:
|
|
144
|
+
_i++;
|
|
145
|
+
return [3 /*break*/, 2];
|
|
146
|
+
case 7:
|
|
147
|
+
// PRINTING TIME
|
|
148
|
+
Logger_1.Logger.logInfo('====== ALL DEPLOY DEPENDENCIES ======');
|
|
149
|
+
for (_b = 0, deployDependenciesTasks_1 = deployDependenciesTasks; _b < deployDependenciesTasks_1.length; _b++) {
|
|
150
|
+
task = deployDependenciesTasks_1[_b];
|
|
151
|
+
Logger_1.Logger.logMessage("\uD83D\uDD39 ".concat(task.project, " | ").concat(task.mr, " | \uD83D\uDC64 ").concat(task.owner));
|
|
152
|
+
Logger_1.Logger.logMessage(task.content);
|
|
153
|
+
}
|
|
154
|
+
Logger_1.Logger.logInfo('====== ALL BEFORE RELEASE TASKS ======');
|
|
155
|
+
for (_c = 0, beforeReleaseTasks_1 = beforeReleaseTasks; _c < beforeReleaseTasks_1.length; _c++) {
|
|
156
|
+
task = beforeReleaseTasks_1[_c];
|
|
157
|
+
Logger_1.Logger.logMessage("\uD83D\uDD39 ".concat(task.project, " | ").concat(task.mr, " | \uD83D\uDC64 ").concat(task.owner));
|
|
158
|
+
Logger_1.Logger.logMessage(task.content);
|
|
159
|
+
}
|
|
160
|
+
Logger_1.Logger.logInfo('====== ALL AFTER RELEASE TASKS ======');
|
|
161
|
+
for (_d = 0, afterReleaseTasks_1 = afterReleaseTasks; _d < afterReleaseTasks_1.length; _d++) {
|
|
162
|
+
task = afterReleaseTasks_1[_d];
|
|
163
|
+
Logger_1.Logger.logMessage("\uD83D\uDD39 ".concat(task.project, " | ").concat(task.mr, " | \uD83D\uDC64 ").concat(task.owner));
|
|
164
|
+
Logger_1.Logger.logMessage(task.content);
|
|
165
|
+
}
|
|
166
|
+
Logger_1.Logger.logInfo('====== ALL SQL CHANGES (with context) ======');
|
|
167
|
+
for (_e = 0, sqlSections_1 = sqlSections; _e < sqlSections_1.length; _e++) {
|
|
168
|
+
sql = sqlSections_1[_e];
|
|
169
|
+
Logger_1.Logger.logMessage("\uD83E\uDDFE ".concat(sql.project, " | ").concat(sql.mr, " (").concat(sql.phase === 'BeforeRelease' ? 'Before Release' : 'After Release', ") | \uD83D\uDC64 ").concat(sql.owner));
|
|
170
|
+
Logger_1.Logger.logMessage(sql.content);
|
|
171
|
+
}
|
|
172
|
+
if (!options.slackNotifier) return [3 /*break*/, 11];
|
|
173
|
+
milestoneLabel = "".concat(options.milestone, " Release");
|
|
174
|
+
deployDependenciesMessage = this.formatTaskSection('Deploy Dependencies', deployDependenciesTasks);
|
|
175
|
+
beforeTasksMessage = this.formatTaskSection('Before Release Tasks', beforeReleaseTasks);
|
|
176
|
+
afterTasksMessage = this.formatTaskSection('After Release Tasks', afterReleaseTasks);
|
|
177
|
+
sqlMessage = this.formatSQLSection(sqlSections);
|
|
178
|
+
taskSummary = [deployDependenciesMessage, beforeTasksMessage, afterTasksMessage].filter(Boolean).join('\n');
|
|
179
|
+
if (!taskSummary) return [3 /*break*/, 9];
|
|
180
|
+
return [4 /*yield*/, this.slackService.sendSlackStatusMessage({
|
|
181
|
+
emailList: [],
|
|
182
|
+
threadLabel: "".concat(milestoneLabel, " Tasks & Dependencies"),
|
|
183
|
+
statusMessage: taskSummary,
|
|
184
|
+
statusCleanMessage: 'No Before/After Release Tasks found!'
|
|
185
|
+
})];
|
|
186
|
+
case 8:
|
|
187
|
+
_f.sent();
|
|
188
|
+
_f.label = 9;
|
|
189
|
+
case 9:
|
|
190
|
+
if (!sqlMessage) return [3 /*break*/, 11];
|
|
191
|
+
return [4 /*yield*/, this.slackService.sendSlackStatusMessage({
|
|
192
|
+
emailList: [],
|
|
193
|
+
threadLabel: "".concat(milestoneLabel, " SQL"),
|
|
194
|
+
statusMessage: sqlMessage,
|
|
195
|
+
statusCleanMessage: 'No SQL changes found in release!',
|
|
196
|
+
sendAsFile: true
|
|
197
|
+
})];
|
|
198
|
+
case 10:
|
|
199
|
+
_f.sent();
|
|
200
|
+
_f.label = 11;
|
|
201
|
+
case 11: return [2 /*return*/, true];
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
});
|
|
205
|
+
};
|
|
206
|
+
CheckReleaseReadyTask.prototype.formatTaskSection = function (title, items) {
|
|
207
|
+
if (items.length === 0)
|
|
208
|
+
return 'No tasks found!';
|
|
209
|
+
var output = "## ".concat(title, "\n\n");
|
|
210
|
+
for (var _i = 0, items_1 = items; _i < items_1.length; _i++) {
|
|
211
|
+
var item = items_1[_i];
|
|
212
|
+
output += "### ".concat(item.project, " \u2013 ").concat(item.mr, "\n");
|
|
213
|
+
output += "**Owner:** ".concat(item.owner, "\n\n");
|
|
214
|
+
output += "".concat(item.content.trim(), "\n");
|
|
215
|
+
}
|
|
216
|
+
return output;
|
|
217
|
+
};
|
|
218
|
+
CheckReleaseReadyTask.prototype.formatSQLSection = function (items) {
|
|
219
|
+
if (items.length === 0)
|
|
220
|
+
return 'No SQL found!';
|
|
221
|
+
var output = "## SQL Changes\n\n";
|
|
222
|
+
for (var _i = 0, items_2 = items; _i < items_2.length; _i++) {
|
|
223
|
+
var item = items_2[_i];
|
|
224
|
+
var phaseLabel = item.phase === 'BeforeRelease' ? 'Before Release' : 'After Release';
|
|
225
|
+
output += "### ".concat(item.project, " \u2013 ").concat(item.mr, " (").concat(phaseLabel, ")\n");
|
|
226
|
+
output += "**Owner:** ".concat(item.owner, "\n\n");
|
|
227
|
+
output += "".concat(item.content.trim(), "\n");
|
|
228
|
+
}
|
|
229
|
+
return output;
|
|
230
|
+
};
|
|
231
|
+
CheckReleaseReadyTask = __decorate([
|
|
232
|
+
(0, inversify_1.injectable)(),
|
|
233
|
+
__param(0, (0, inversify_1.inject)(types_1.SERVICES.GitLabService)),
|
|
234
|
+
__param(1, (0, inversify_1.inject)(types_1.SERVICES.SlackService)),
|
|
235
|
+
__param(2, (0, inversify_1.inject)(types_1.SERVICES.TrelloService)),
|
|
236
|
+
__metadata("design:paramtypes", [services_1.GitLabService,
|
|
237
|
+
services_1.SlackService,
|
|
238
|
+
services_1.TrelloService])
|
|
239
|
+
], CheckReleaseReadyTask);
|
|
240
|
+
return CheckReleaseReadyTask;
|
|
241
|
+
}());
|
|
242
|
+
exports.CheckReleaseReadyTask = CheckReleaseReadyTask;
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
15
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
16
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
17
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
18
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
19
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
20
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
24
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
25
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
26
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
27
|
+
function step(op) {
|
|
28
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
29
|
+
while (_) try {
|
|
30
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
31
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
32
|
+
switch (op[0]) {
|
|
33
|
+
case 0: case 1: t = op; break;
|
|
34
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
35
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
36
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
37
|
+
default:
|
|
38
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
39
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
40
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
41
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
42
|
+
if (t[2]) _.ops.pop();
|
|
43
|
+
_.trys.pop(); continue;
|
|
44
|
+
}
|
|
45
|
+
op = body.call(thisArg, _);
|
|
46
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
47
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
51
|
+
exports.UpdateMergeRequestDescriptionTask = void 0;
|
|
52
|
+
require("reflect-metadata");
|
|
53
|
+
var inversify_1 = require("inversify");
|
|
54
|
+
var types_1 = require("../types");
|
|
55
|
+
var services_1 = require("../services");
|
|
56
|
+
var utils_1 = require("../utils");
|
|
57
|
+
var UpdateMergeRequestDescriptionTask = /** @class */ (function () {
|
|
58
|
+
function UpdateMergeRequestDescriptionTask(service) {
|
|
59
|
+
this.service = service;
|
|
60
|
+
}
|
|
61
|
+
UpdateMergeRequestDescriptionTask.prototype.run = function (options) {
|
|
62
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
63
|
+
var projects, _i, projects_1, project, _a, branch, branchName, mergeRequest, projectConfig, description;
|
|
64
|
+
return __generator(this, function (_b) {
|
|
65
|
+
switch (_b.label) {
|
|
66
|
+
case 0:
|
|
67
|
+
utils_1.Logger.logTask('Updating Merge Requests Descriptions');
|
|
68
|
+
return [4 /*yield*/, this.service.getReleaseProjects(options.milestone, options.projectIds, options.omittedProjectIds, options.sourceBranch)];
|
|
69
|
+
case 1:
|
|
70
|
+
projects = _b.sent();
|
|
71
|
+
_i = 0, projects_1 = projects;
|
|
72
|
+
_b.label = 2;
|
|
73
|
+
case 2:
|
|
74
|
+
if (!(_i < projects_1.length)) return [3 /*break*/, 8];
|
|
75
|
+
project = projects_1[_i];
|
|
76
|
+
return [4 /*yield*/, this.service.getNextBranchInfo(project.id, options.version)];
|
|
77
|
+
case 3:
|
|
78
|
+
_a = _b.sent(), branch = _a.branch, branchName = _a.branchName;
|
|
79
|
+
if (!branch) {
|
|
80
|
+
utils_1.Logger.logError("[".concat(project.title, "]: [").concat(branchName, "] does not exist"));
|
|
81
|
+
return [3 /*break*/, 7];
|
|
82
|
+
}
|
|
83
|
+
return [4 /*yield*/, this.service.getMergeRequest(project.id, branchName, 'opened')];
|
|
84
|
+
case 4:
|
|
85
|
+
mergeRequest = _b.sent();
|
|
86
|
+
if (!mergeRequest) {
|
|
87
|
+
utils_1.Logger.logWarning("[".concat(project.title, "]: MR does not exist"));
|
|
88
|
+
return [3 /*break*/, 7];
|
|
89
|
+
}
|
|
90
|
+
return [4 /*yield*/, this.service.getProjectConfig(project.id, options.sourceBranch)];
|
|
91
|
+
case 5:
|
|
92
|
+
projectConfig = _b.sent();
|
|
93
|
+
description = projectConfig.monorepo.enabled ?
|
|
94
|
+
utils_1.Descriptions.getMonorepoCombinedDescription(project.mergeRequests) :
|
|
95
|
+
utils_1.Descriptions.getCombinedDescription(project.mergeRequests);
|
|
96
|
+
return [4 /*yield*/, this.service.updateMergeRequestDescription({
|
|
97
|
+
projectId: project.id,
|
|
98
|
+
mergeRequestIid: mergeRequest.iid,
|
|
99
|
+
description: description
|
|
100
|
+
})];
|
|
101
|
+
case 6:
|
|
102
|
+
mergeRequest = _b.sent();
|
|
103
|
+
utils_1.Logger.logMessage("[".concat(project.title, "]: MR description updated"));
|
|
104
|
+
utils_1.Logger.logInfo(mergeRequest.url);
|
|
105
|
+
_b.label = 7;
|
|
106
|
+
case 7:
|
|
107
|
+
_i++;
|
|
108
|
+
return [3 /*break*/, 2];
|
|
109
|
+
case 8: return [2 /*return*/, true];
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
};
|
|
114
|
+
UpdateMergeRequestDescriptionTask = __decorate([
|
|
115
|
+
(0, inversify_1.injectable)(),
|
|
116
|
+
__param(0, (0, inversify_1.inject)(types_1.SERVICES.GitLabService)),
|
|
117
|
+
__metadata("design:paramtypes", [services_1.GitLabService])
|
|
118
|
+
], UpdateMergeRequestDescriptionTask);
|
|
119
|
+
return UpdateMergeRequestDescriptionTask;
|
|
120
|
+
}());
|
|
121
|
+
exports.UpdateMergeRequestDescriptionTask = UpdateMergeRequestDescriptionTask;
|
|
@@ -66,66 +66,86 @@ var ValidateDescriptionsTask = /** @class */ (function () {
|
|
|
66
66
|
ValidateDescriptionsTask.prototype.run = function (options) {
|
|
67
67
|
var _a;
|
|
68
68
|
return __awaiter(this, void 0, void 0, function () {
|
|
69
|
-
var projects, cont, allInvalidDescriptionsMessage, emailList,
|
|
70
|
-
return __generator(this, function (
|
|
71
|
-
switch (
|
|
69
|
+
var projects, cont, allInvalidDescriptionsMessage, emailList, _loop_1, this_1, _i, projects_1, project, threadLabel, statusCleanMessage;
|
|
70
|
+
return __generator(this, function (_b) {
|
|
71
|
+
switch (_b.label) {
|
|
72
72
|
case 0:
|
|
73
73
|
utils_1.Logger.logTask('Validating descriptions');
|
|
74
74
|
return [4 /*yield*/, this.gitLabService.getReleaseProjects(options.milestone, options.projectIds, options.omittedProjectIds, options.sourceBranch)];
|
|
75
75
|
case 1:
|
|
76
|
-
projects =
|
|
76
|
+
projects = _b.sent();
|
|
77
77
|
cont = true;
|
|
78
78
|
allInvalidDescriptionsMessage = '';
|
|
79
79
|
emailList = [];
|
|
80
|
+
_loop_1 = function (project) {
|
|
81
|
+
var invalidMrs, targetBranch, mergeRequestsTargetingSource, projectConfig, isMonorepo, _c, mergeRequestsTargetingSource_1, mr, errors, isMrValid, projectErrorMessage, groupedByUser, key, authorEmail, _d, _e, _f, mr, errors, _g, errors_1, error;
|
|
82
|
+
return __generator(this, function (_h) {
|
|
83
|
+
switch (_h.label) {
|
|
84
|
+
case 0:
|
|
85
|
+
invalidMrs = [];
|
|
86
|
+
return [4 /*yield*/, this_1.getTargetBranch(project, options)];
|
|
87
|
+
case 1:
|
|
88
|
+
targetBranch = _h.sent();
|
|
89
|
+
if (!targetBranch) {
|
|
90
|
+
utils_1.Logger.logWarning("[".concat(project.title, "]: Skipping due to missing target branch"));
|
|
91
|
+
return [2 /*return*/, "continue"];
|
|
92
|
+
}
|
|
93
|
+
mergeRequestsTargetingSource = project.mergeRequests.filter(function (mergeRequest) {
|
|
94
|
+
return mergeRequest.targetBranch === targetBranch;
|
|
95
|
+
});
|
|
96
|
+
return [4 /*yield*/, this_1.gitLabService.getProjectConfig(project.id, options.sourceBranch)];
|
|
97
|
+
case 2:
|
|
98
|
+
projectConfig = _h.sent();
|
|
99
|
+
isMonorepo = project.id.toString() === utils_1.ProjectIds.MONOREPO_PROJECT_ID;
|
|
100
|
+
for (_c = 0, mergeRequestsTargetingSource_1 = mergeRequestsTargetingSource; _c < mergeRequestsTargetingSource_1.length; _c++) {
|
|
101
|
+
mr = mergeRequestsTargetingSource_1[_c];
|
|
102
|
+
errors = utils_1.Descriptions.validate(mr.description, projectConfig);
|
|
103
|
+
isMrValid = errors.length === 0;
|
|
104
|
+
if (isMonorepo && !((_a = mr.labels) === null || _a === void 0 ? void 0 : _a.length))
|
|
105
|
+
isMrValid = false;
|
|
106
|
+
if (!isMrValid)
|
|
107
|
+
invalidMrs.push([mr, errors]);
|
|
108
|
+
}
|
|
109
|
+
if (invalidMrs.length) {
|
|
110
|
+
utils_1.Logger.logError("\n[".concat(project.title, "] has invalid MRs"));
|
|
111
|
+
projectErrorMessage = "[".concat(project.title, "] has invalid MRs");
|
|
112
|
+
allInvalidDescriptionsMessage += "\n".concat(projectErrorMessage);
|
|
113
|
+
groupedByUser = lodash_1.default.groupBy(invalidMrs, function (_a) {
|
|
114
|
+
var mr = _a[0];
|
|
115
|
+
return mr.author;
|
|
116
|
+
});
|
|
117
|
+
for (key in groupedByUser) {
|
|
118
|
+
utils_1.Logger.logMessage(key);
|
|
119
|
+
authorEmail = this_1.slackService.convertToEmailFormat(key);
|
|
120
|
+
emailList.push(authorEmail);
|
|
121
|
+
allInvalidDescriptionsMessage += "\n".concat(key);
|
|
122
|
+
for (_d = 0, _e = groupedByUser[key]; _d < _e.length; _d++) {
|
|
123
|
+
_f = _e[_d], mr = _f[0], errors = _f[1];
|
|
124
|
+
utils_1.Logger.logMessage("- ".concat(mr.url));
|
|
125
|
+
allInvalidDescriptionsMessage += "\n- ".concat(mr.url);
|
|
126
|
+
for (_g = 0, errors_1 = errors; _g < errors_1.length; _g++) {
|
|
127
|
+
error = errors_1[_g];
|
|
128
|
+
utils_1.Logger.logMessage(" - ".concat(error));
|
|
129
|
+
allInvalidDescriptionsMessage += "\n - ".concat(error);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
cont = false;
|
|
134
|
+
}
|
|
135
|
+
return [2 /*return*/];
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
};
|
|
139
|
+
this_1 = this;
|
|
80
140
|
_i = 0, projects_1 = projects;
|
|
81
|
-
|
|
141
|
+
_b.label = 2;
|
|
82
142
|
case 2:
|
|
83
143
|
if (!(_i < projects_1.length)) return [3 /*break*/, 5];
|
|
84
144
|
project = projects_1[_i];
|
|
85
|
-
|
|
86
|
-
mergeRequestsTargetingSource = project.mergeRequests.filter(function (mergeRequest) {
|
|
87
|
-
return mergeRequest.targetBranch === options.sourceBranch;
|
|
88
|
-
});
|
|
89
|
-
return [4 /*yield*/, this.gitLabService.getProjectConfig(project.id, options.sourceBranch)];
|
|
145
|
+
return [5 /*yield**/, _loop_1(project)];
|
|
90
146
|
case 3:
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
for (_b = 0, mergeRequestsTargetingSource_1 = mergeRequestsTargetingSource; _b < mergeRequestsTargetingSource_1.length; _b++) {
|
|
94
|
-
mr = mergeRequestsTargetingSource_1[_b];
|
|
95
|
-
errors = utils_1.Descriptions.validate(mr.description, projectConfig);
|
|
96
|
-
isMrValid = errors.length === 0;
|
|
97
|
-
if (isMonorepo && !((_a = mr.labels) === null || _a === void 0 ? void 0 : _a.length))
|
|
98
|
-
isMrValid = false;
|
|
99
|
-
if (!isMrValid)
|
|
100
|
-
invalidMrs.push([mr, errors]);
|
|
101
|
-
}
|
|
102
|
-
if (invalidMrs.length) {
|
|
103
|
-
utils_1.Logger.logError("\n[".concat(project.title, "] has invalid MRs"));
|
|
104
|
-
projectErrorMessage = "[".concat(project.title, "] has invalid MRs");
|
|
105
|
-
allInvalidDescriptionsMessage += "\n".concat(projectErrorMessage);
|
|
106
|
-
groupedByUser = lodash_1.default.groupBy(invalidMrs, function (_a) {
|
|
107
|
-
var mr = _a[0];
|
|
108
|
-
return mr.author;
|
|
109
|
-
});
|
|
110
|
-
for (key in groupedByUser) {
|
|
111
|
-
utils_1.Logger.logMessage(key);
|
|
112
|
-
authorEmail = this.slackService.convertToEmailFormat(key);
|
|
113
|
-
emailList.push(authorEmail);
|
|
114
|
-
allInvalidDescriptionsMessage += "\n".concat(key);
|
|
115
|
-
for (_c = 0, _d = groupedByUser[key]; _c < _d.length; _c++) {
|
|
116
|
-
_e = _d[_c], mr = _e[0], errors = _e[1];
|
|
117
|
-
utils_1.Logger.logMessage("- ".concat(mr.url));
|
|
118
|
-
allInvalidDescriptionsMessage += "\n- ".concat(mr.url);
|
|
119
|
-
for (_f = 0, errors_1 = errors; _f < errors_1.length; _f++) {
|
|
120
|
-
error = errors_1[_f];
|
|
121
|
-
utils_1.Logger.logMessage(" - ".concat(error));
|
|
122
|
-
allInvalidDescriptionsMessage += "\n - ".concat(error);
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
cont = false;
|
|
127
|
-
}
|
|
128
|
-
_g.label = 4;
|
|
147
|
+
_b.sent();
|
|
148
|
+
_b.label = 4;
|
|
129
149
|
case 4:
|
|
130
150
|
_i++;
|
|
131
151
|
return [3 /*break*/, 2];
|
|
@@ -142,8 +162,8 @@ var ValidateDescriptionsTask = /** @class */ (function () {
|
|
|
142
162
|
})];
|
|
143
163
|
case 6:
|
|
144
164
|
// Send formated status update in slack
|
|
145
|
-
|
|
146
|
-
|
|
165
|
+
_b.sent();
|
|
166
|
+
_b.label = 7;
|
|
147
167
|
case 7:
|
|
148
168
|
if (cont)
|
|
149
169
|
utils_1.Logger.logSuccess('All MR descriptions are valid');
|
|
@@ -152,6 +172,26 @@ var ValidateDescriptionsTask = /** @class */ (function () {
|
|
|
152
172
|
});
|
|
153
173
|
});
|
|
154
174
|
};
|
|
175
|
+
ValidateDescriptionsTask.prototype.getTargetBranch = function (project, options) {
|
|
176
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
177
|
+
var _a, branch, branchName;
|
|
178
|
+
return __generator(this, function (_b) {
|
|
179
|
+
switch (_b.label) {
|
|
180
|
+
case 0:
|
|
181
|
+
if (options.target === 'source-branch') {
|
|
182
|
+
return [2 /*return*/, options.sourceBranch];
|
|
183
|
+
}
|
|
184
|
+
return [4 /*yield*/, this.gitLabService.getNextBranchInfo(project.id, options.version)];
|
|
185
|
+
case 1:
|
|
186
|
+
_a = _b.sent(), branch = _a.branch, branchName = _a.branchName;
|
|
187
|
+
if (!branch) {
|
|
188
|
+
utils_1.Logger.logError("[".concat(project.title, "]: [").concat(branchName, "] does not exist"));
|
|
189
|
+
}
|
|
190
|
+
return [2 /*return*/, branchName];
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
});
|
|
194
|
+
};
|
|
155
195
|
ValidateDescriptionsTask = __decorate([
|
|
156
196
|
(0, inversify_1.injectable)(),
|
|
157
197
|
__param(0, (0, inversify_1.inject)(types_1.SERVICES.GitLabService)),
|
package/lib/src/tasks/index.js
CHANGED
|
@@ -33,3 +33,4 @@ __exportStar(require("./ValidateTask"), exports);
|
|
|
33
33
|
__exportStar(require("./VersionTask"), exports);
|
|
34
34
|
__exportStar(require("./PopulateTrelloBoardTask"), exports);
|
|
35
35
|
__exportStar(require("./CreateHotfixTask"), exports);
|
|
36
|
+
__exportStar(require("./UpdateMergeRequestDescriptionTask"), exports);
|
package/lib/src/types.js
CHANGED
|
@@ -42,6 +42,7 @@ exports.TASKS = {
|
|
|
42
42
|
EnsureApprovalRulesTask: Symbol.for('EnsureApprovalRulesTask'),
|
|
43
43
|
CreateHotfixTask: Symbol.for('CreateHotfixTask'),
|
|
44
44
|
ChangeMilestoneTask: Symbol.for('ChangeMilestoneTask'),
|
|
45
|
+
UpdateMergeRequestDescriptionTask: Symbol.for('UpdateMergeRequestDescriptionTask')
|
|
45
46
|
};
|
|
46
47
|
exports.COMMANDS = {
|
|
47
48
|
StatusCommand: Symbol.for('StatusCommand'),
|
|
@@ -60,5 +61,6 @@ exports.COMMANDS = {
|
|
|
60
61
|
ListProjectsCommand: Symbol.for('ListProjectsCommand'),
|
|
61
62
|
CreateTrelloCardsCommand: Symbol.for('CreateTrelloCardsCommand'),
|
|
62
63
|
ConfigureProjectsCommand: Symbol.for('ConfigureProjectsCommand'),
|
|
63
|
-
CreateHotfixCommand: Symbol.for('CreateHotfixCommand')
|
|
64
|
+
CreateHotfixCommand: Symbol.for('CreateHotfixCommand'),
|
|
65
|
+
UpdateDescriptionCommand: Symbol.for('UpdateDescriptionCommand')
|
|
64
66
|
};
|