@clickview/ship-it 0.0.26 → 0.0.27-dev.0

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.
Files changed (79) hide show
  1. package/config.json +1 -1
  2. package/dist/F1/Analytics Web.md +8 -0
  3. package/dist/F1/AutoCaptions.md +30 -0
  4. package/dist/F1/Classroom.Api.md +23 -0
  5. package/dist/F1/ClickView Online.md +17 -0
  6. package/dist/F1/ClickView.Curator.md +100 -0
  7. package/dist/F1/ClickView.EmailService.md +53 -0
  8. package/dist/F1/ClickView.OnlineApi.md +13 -0
  9. package/dist/F1/Clients.md +19 -0
  10. package/dist/F1/Domain.Api.md +23 -0
  11. package/dist/F1/Exchange.Web.md +8 -0
  12. package/dist/F1/Image.Api.md +8 -0
  13. package/dist/F1/Integrations.Api.md +23 -0
  14. package/dist/F1/Krakend.md +8 -0
  15. package/dist/F1/Library Editor.md +0 -0
  16. package/dist/F1/Lite.md +60 -0
  17. package/dist/F1/Master.Api.md +58 -0
  18. package/dist/F1/Master.Auth.md +22 -0
  19. package/dist/F1/Objects.Api.md +12 -0
  20. package/dist/F1/Permissions.Api.md +12 -0
  21. package/dist/F1/RealtimeSalesforceSync.md +14 -0
  22. package/dist/F1/Release Notes.md +990 -0
  23. package/dist/F1/Search.Api.md +12 -0
  24. package/dist/F1/StreamableLearning.Web.md +35 -0
  25. package/dist/F1/Users.Api.md +13 -0
  26. package/dist/F1/VideoProcessorService.md +23 -0
  27. package/dist/F1/clickview.md +321 -0
  28. package/dist/F2/Analytics Web.md +7 -0
  29. package/dist/F2/Batch.Api.md +27 -0
  30. package/dist/F2/ClickView Online.md +12 -0
  31. package/dist/F2/ClickView.Curator.md +166 -0
  32. package/dist/F2/Clients.md +14 -0
  33. package/dist/F2/CurriculumIngestion.Api.md +13 -0
  34. package/dist/F2/Discover.Api.md +64 -0
  35. package/dist/F2/Domain.Api.md +16 -0
  36. package/dist/F2/Exchange.Web.md +7 -0
  37. package/dist/F2/Krakend.md +12 -0
  38. package/dist/F2/Library Editor.md +11 -0
  39. package/dist/F2/Lite.md +30 -0
  40. package/dist/F2/Objects.Api.md +12 -0
  41. package/dist/F2/Release Notes.md +759 -0
  42. package/dist/F2/Search.Api.md +30 -0
  43. package/dist/F2/Share.Api.md +12 -0
  44. package/dist/F2/StreamableLearning.Web.md +14 -0
  45. package/dist/F2/Subjects.API.md +12 -0
  46. package/dist/F2/Tv.Web.md +8 -0
  47. package/dist/F2/Users.Api.md +21 -0
  48. package/dist/F2/clickview.md +200 -0
  49. package/dist/F2/shortcode-api.md +8 -0
  50. package/dist/F3.1/Analytics Web.md +8 -0
  51. package/dist/F3.1/ClickView.Curator.md +14 -0
  52. package/dist/F3.1/Discover.Api.md +14 -0
  53. package/dist/F3.1/Domain.Api.md +7 -0
  54. package/dist/F3.1/Exchange.Web.md +8 -0
  55. package/dist/F3.1/Library Editor.md +8 -0
  56. package/dist/F3.1/Lite.md +8 -0
  57. package/dist/F3.1/Objects.Api.md +7 -0
  58. package/dist/F3.1/Release Notes.md +207 -0
  59. package/dist/F3.1/Search.Api.md +14 -0
  60. package/dist/F3.1/Share.Api.md +10 -0
  61. package/dist/F3.1/Subjects.API.md +35 -0
  62. package/dist/F3.1/VideoViews.Api.md +7 -0
  63. package/dist/F3.1/clickview.md +28 -0
  64. package/lib/config.json +1 -1
  65. package/lib/src/api-clients/git-lab/GitLabApiClient.js +20 -1
  66. package/lib/src/api-clients/git-lab/GitLabMapper.js +1 -0
  67. package/lib/src/commands/CreateReleaseNotesCommand.js +12 -1
  68. package/lib/src/commands/ReleaseCommand.js +22 -34
  69. package/lib/src/commands/StartConsumingProjectBuildsCommand.js +76 -0
  70. package/lib/src/constants/ProjectNames.js +1 -0
  71. package/lib/src/constants/TeamCityBuildIDs.js +2 -1
  72. package/lib/src/index.js +0 -0
  73. package/lib/src/services/GitLabService.js +10 -3
  74. package/lib/src/services/SlackService.js +0 -3
  75. package/lib/src/startup/SetupCommands.js +3 -0
  76. package/lib/src/tasks/StartConsumingProjectBuildsTask.js +149 -0
  77. package/lib/src/tasks/StartProjectBuildsTask.js +38 -17
  78. package/lib/src/tasks/ValidateTask.js +105 -30
  79. package/package.json +5 -5
@@ -71,12 +71,14 @@ var services_1 = require("../services");
71
71
  var utils_1 = require("../utils");
72
72
  var ValidateTask = /** @class */ (function () {
73
73
  function ValidateTask(gitLabService, slackService) {
74
+ // Flag to confirm that all Merge requests have been rolled over
75
+ this.rollOverAllMrs = true;
74
76
  this.gitLabService = gitLabService;
75
77
  this.slackService = slackService;
76
78
  }
77
79
  ValidateTask.prototype.run = function (options) {
78
80
  return __awaiter(this, void 0, void 0, function () {
79
- var projects, cont, _loop_1, this_1, _i, projects_1, project, threadLabel, statusCleanMessage;
81
+ var projects, cont, allCorrectTargetMrs, _loop_1, this_1, _i, projects_1, project, nextMilestone, threadLabel, statusCleanMessage;
80
82
  return __generator(this, function (_a) {
81
83
  switch (_a.label) {
82
84
  case 0:
@@ -86,6 +88,7 @@ var ValidateTask = /** @class */ (function () {
86
88
  projects = _a.sent();
87
89
  utils_1.Logger.logMessage("Found ".concat(projects.length, " projects that need to be released"));
88
90
  cont = true;
91
+ allCorrectTargetMrs = true;
89
92
  _loop_1 = function (project) {
90
93
  var hasSomeTags, groupedMRs, count, ready, wrongTargetMrs, nextVersion, message_1, issues;
91
94
  return __generator(this, function (_b) {
@@ -102,8 +105,10 @@ var ValidateTask = /** @class */ (function () {
102
105
  return [4 /*yield*/, this_1.getMRsTargetingWrongBranch(project, options.version)];
103
106
  case 2:
104
107
  wrongTargetMrs = _b.sent();
105
- if (wrongTargetMrs.length)
108
+ if (wrongTargetMrs.length) {
106
109
  ready = false;
110
+ allCorrectTargetMrs = false;
111
+ }
107
112
  if (!ready)
108
113
  cont = false;
109
114
  if (!ready) return [3 /*break*/, 4];
@@ -144,16 +149,33 @@ var ValidateTask = /** @class */ (function () {
144
149
  _i++;
145
150
  return [3 /*break*/, 2];
146
151
  case 5:
147
- if (!!cont) return [3 /*break*/, 8];
152
+ if (!!cont) return [3 /*break*/, 10];
148
153
  utils_1.Logger.logError("\nThis release is NOT READY to go out, here are the outstanding MRs: \n");
149
- return [4 /*yield*/, this.notReadyMrsLog(projects, options.version, options.milestone, options.slackNotifier)];
154
+ nextMilestone = void 0;
155
+ if (!options.nextMilestone) return [3 /*break*/, 7];
156
+ return [4 /*yield*/, this.gitLabService.getMilestone(options.nextMilestone)];
150
157
  case 6:
158
+ // No need for project ID to get milestone since it exists in ClickView Group
159
+ nextMilestone = _a.sent();
160
+ if (!nextMilestone) {
161
+ utils_1.Logger.logError("Invalid roll over milestone '".concat(options.nextMilestone, "'. Exiting!"));
162
+ return [2 /*return*/, false];
163
+ }
164
+ _a.label = 7;
165
+ case 7: return [4 /*yield*/, this.notReadyMrsLog(projects, options.version, options.milestone, options.slackNotifier, nextMilestone)];
166
+ case 8:
151
167
  _a.sent();
152
- return [4 /*yield*/, this.wrongTargetMrsLog(projects, options.version, options.milestone, options.slackNotifier)];
153
- case 7:
168
+ return [4 /*yield*/, this.wrongTargetMrsLog(projects, options.version, options.milestone, options.slackNotifier, nextMilestone)];
169
+ case 9:
154
170
  _a.sent();
171
+ // Check that all MRs rolled over and all MRs targeting dev or release before creating release
172
+ if (options.nextMilestone && this.rollOverAllMrs && allCorrectTargetMrs) {
173
+ return [2 /*return*/, true];
174
+ }
175
+ if (!this.rollOverAllMrs)
176
+ utils_1.Logger.logError('Some or all MRs did not get successfully rolled over. Check logs to find out which ones');
155
177
  return [2 /*return*/, false];
156
- case 8:
178
+ case 10:
157
179
  if (!options.slackNotifier) {
158
180
  utils_1.Logger.logMessage('\nRelease is ready to go out. Not sending any slack notifications.');
159
181
  return [2 /*return*/, true];
@@ -170,7 +192,7 @@ var ValidateTask = /** @class */ (function () {
170
192
  statusMessage: '',
171
193
  statusCleanMessage: statusCleanMessage
172
194
  })];
173
- case 9:
195
+ case 11:
174
196
  // Send formated status update in slack
175
197
  _a.sent();
176
198
  // Send success thread for MRs not targeting Dev
@@ -183,7 +205,7 @@ var ValidateTask = /** @class */ (function () {
183
205
  statusMessage: '',
184
206
  statusCleanMessage: statusCleanMessage
185
207
  })];
186
- case 10:
208
+ case 12:
187
209
  // Send formated status update in slack
188
210
  _a.sent();
189
211
  utils_1.Logger.logSuccess('\nRelease is ready to go out');
@@ -192,11 +214,11 @@ var ValidateTask = /** @class */ (function () {
192
214
  });
193
215
  });
194
216
  };
195
- ValidateTask.prototype.notReadyMrsLog = function (projects, version, milestone, slackNotifier) {
217
+ ValidateTask.prototype.notReadyMrsLog = function (projects, version, milestone, slackNotifier, nextMilestone) {
196
218
  return __awaiter(this, void 0, void 0, function () {
197
- var allNotReadyMrs, emailListNotReadyMrs, _i, projects_2, project, notReadyMrs, groupedByUser, logMessageSlack, key, name, authorEmail, _a, _b, mr, threadLabel, statusCleanMessage;
198
- return __generator(this, function (_c) {
199
- switch (_c.label) {
219
+ var allNotReadyMrs, emailListNotReadyMrs, _i, projects_2, project, notReadyMrs, groupedByUser, logMessageSlack, _a, _b, _c, key, name, authorEmail, _d, _e, mr, updated, threadLabel, statusCleanMessage;
220
+ return __generator(this, function (_f) {
221
+ switch (_f.label) {
200
222
  case 0:
201
223
  allNotReadyMrs = [];
202
224
  emailListNotReadyMrs = [];
@@ -208,25 +230,55 @@ var ValidateTask = /** @class */ (function () {
208
230
  }
209
231
  groupedByUser = lodash_1.default.groupBy(allNotReadyMrs, function (mr) { return mr.author; });
210
232
  logMessageSlack = '';
211
- for (key in groupedByUser) {
212
- name = key;
213
- // Pretty sure this can't happen now 😅
214
- if (!name || name === 'undefined')
215
- name = 'No Author';
216
- authorEmail = this.slackService.convertToEmailFormat(key);
217
- emailListNotReadyMrs.push(authorEmail);
218
- utils_1.Logger.logMessage(name);
219
- logMessageSlack += "".concat(name, ":\n");
220
- for (_a = 0, _b = groupedByUser[key]; _a < _b.length; _a++) {
221
- mr = _b[_a];
222
- utils_1.Logger.logMessage("- ".concat(mr.url));
223
- logMessageSlack += "- ".concat(mr.url, "\n");
224
- }
233
+ _a = [];
234
+ for (_b in groupedByUser)
235
+ _a.push(_b);
236
+ _c = 0;
237
+ _f.label = 1;
238
+ case 1:
239
+ if (!(_c < _a.length)) return [3 /*break*/, 6];
240
+ key = _a[_c];
241
+ name = key;
242
+ // Pretty sure this can't happen now 😅
243
+ if (!name || name === 'undefined')
244
+ name = 'No Author';
245
+ authorEmail = this.slackService.convertToEmailFormat(key);
246
+ emailListNotReadyMrs.push(authorEmail);
247
+ utils_1.Logger.logMessage(name);
248
+ logMessageSlack += "".concat(name, ":\n");
249
+ _d = 0, _e = groupedByUser[key];
250
+ _f.label = 2;
251
+ case 2:
252
+ if (!(_d < _e.length)) return [3 /*break*/, 5];
253
+ mr = _e[_d];
254
+ utils_1.Logger.logMessage("- ".concat(mr.url));
255
+ logMessageSlack += "- ".concat(mr.url, "\n");
256
+ if (!nextMilestone) return [3 /*break*/, 4];
257
+ return [4 /*yield*/, this.updateMrMilestone(nextMilestone.id, milestone, mr)];
258
+ case 3:
259
+ updated = _f.sent();
260
+ if (updated) {
261
+ logMessageSlack += " -> MR has been rolled over from '".concat(milestone, "' to '").concat(nextMilestone.name, "' successfully\n");
262
+ }
263
+ else {
264
+ logMessageSlack += " -> Failed to roll over milestone for this MR. Check logs for error.\n";
225
265
  }
266
+ _f.label = 4;
267
+ case 4:
268
+ _d++;
269
+ return [3 /*break*/, 2];
270
+ case 5:
271
+ _c++;
272
+ return [3 /*break*/, 1];
273
+ case 6:
226
274
  if (!slackNotifier)
227
275
  return [2 /*return*/];
228
276
  threadLabel = "".concat(milestone, " Open Mrs!");
229
277
  statusCleanMessage = 'No outstanding Mrs!';
278
+ if (nextMilestone) {
279
+ threadLabel = "".concat(milestone, " merge requests rolled over to ").concat(nextMilestone.name, "!");
280
+ statusCleanMessage = 'There were no outstanding MRs for this release!';
281
+ }
230
282
  // Send formated status update in slack
231
283
  return [4 /*yield*/, this.slackService.sendSlackStatusMessage({
232
284
  emailList: emailListNotReadyMrs,
@@ -234,15 +286,15 @@ var ValidateTask = /** @class */ (function () {
234
286
  statusMessage: logMessageSlack,
235
287
  statusCleanMessage: statusCleanMessage
236
288
  })];
237
- case 1:
289
+ case 7:
238
290
  // Send formated status update in slack
239
- _c.sent();
291
+ _f.sent();
240
292
  return [2 /*return*/];
241
293
  }
242
294
  });
243
295
  });
244
296
  };
245
- ValidateTask.prototype.wrongTargetMrsLog = function (projects, version, milestone, slackNotifier) {
297
+ ValidateTask.prototype.wrongTargetMrsLog = function (projects, version, milestone, slackNotifier, nextMilestone) {
246
298
  return __awaiter(this, void 0, void 0, function () {
247
299
  var allWrongTargetMrs, emailListWrongTargetMrs, _i, projects_3, project, wrongTargetMrs, logAllWrongTargetMrs, groupedByUser, key, name, authorEmail, _a, _b, mr, threadLabel, statusCleanMessage;
248
300
  return __generator(this, function (_c) {
@@ -288,6 +340,8 @@ var ValidateTask = /** @class */ (function () {
288
340
  }
289
341
  if (!slackNotifier)
290
342
  return [2 /*return*/];
343
+ if (nextMilestone)
344
+ return [2 /*return*/];
291
345
  threadLabel = "".concat(milestone, " MRs not targeting dev!");
292
346
  statusCleanMessage = 'All MRs targeting dev!';
293
347
  // Send formated status update in slack
@@ -332,6 +386,27 @@ var ValidateTask = /** @class */ (function () {
332
386
  });
333
387
  });
334
388
  };
389
+ ValidateTask.prototype.updateMrMilestone = function (nextMilestoneId, milestone, mr) {
390
+ return __awaiter(this, void 0, void 0, function () {
391
+ var updatedMilestone;
392
+ return __generator(this, function (_a) {
393
+ switch (_a.label) {
394
+ case 0: return [4 /*yield*/, this.gitLabService.updateMilestone(mr.projectId, mr.iid, nextMilestoneId)];
395
+ case 1:
396
+ updatedMilestone = _a.sent();
397
+ if (updatedMilestone) {
398
+ utils_1.Logger.logSuccess("MR have been rolled over to next milestone (".concat(milestone, " -> ").concat(updatedMilestone.name, ")"));
399
+ }
400
+ else {
401
+ utils_1.Logger.logError('Failed to update the milestone for merge request!');
402
+ this.rollOverAllMrs = false;
403
+ return [2 /*return*/, false];
404
+ }
405
+ return [2 /*return*/, true];
406
+ }
407
+ });
408
+ });
409
+ };
335
410
  ValidateTask = __decorate([
336
411
  (0, inversify_1.injectable)(),
337
412
  __param(0, (0, inversify_1.inject)(types_1.SERVICES.GitLabService)),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@clickview/ship-it",
3
- "version": "0.0.26",
3
+ "version": "0.0.27-dev.0",
4
4
  "description": "Release Manager",
5
5
  "main": "./lib/index.js",
6
6
  "bin": {
@@ -19,6 +19,8 @@
19
19
  "license": "ISC",
20
20
  "dependencies": {
21
21
  "@gitbeaker/node": "35.6.0",
22
+ "@slack/webhook": "7.0.2",
23
+ "@slack/web-api":"6.11.2",
22
24
  "chalk": "4.1.2",
23
25
  "commander": "9.1.0",
24
26
  "fast-csv": "4.3.6",
@@ -27,7 +29,8 @@
27
29
  "lodash": "4.17.21",
28
30
  "reflect-metadata": "0.1.13",
29
31
  "semver": "7.3.5",
30
- "teamcity-rest-api": "0.0.8"
32
+ "teamcity-rest-api": "0.0.8",
33
+ "trello": "0.11.0"
31
34
  },
32
35
  "devDependencies": {
33
36
  "@clickview/eslint-config": "1.0.3",
@@ -37,11 +40,8 @@
37
40
  "@types/semver": "7.3.9",
38
41
  "@typescript-eslint/eslint-plugin": "5.17.0",
39
42
  "@typescript-eslint/parser": "5.17.0",
40
- "@slack/webhook": "7.0.2",
41
- "@slack/web-api":"6.11.2",
42
43
  "eslint": "8.12.0",
43
44
  "eslint-plugin-react-hooks": "4.4.0",
44
- "trello": "0.11.0",
45
45
  "ts-node": "10.7.0",
46
46
  "tsc-alias": "1.6.6",
47
47
  "tsconfig-paths": "3.14.1",