@clickview/ship-it 0.0.48 → 0.0.50

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 (72) hide show
  1. package/.claude/settings.local.json +10 -0
  2. package/config.json +5 -0
  3. package/dist/W2/W2 Notes Audit.csv +57 -0
  4. package/lib/config.json +5 -0
  5. package/lib/src/api-clients/git-lab/GitLabApiClient.js +1 -1
  6. package/lib/src/api-clients/index.js +1 -0
  7. package/lib/src/api-clients/jira/JiraApiClient.js +105 -0
  8. package/lib/src/api-clients/slack/SlackApiClient.js +27 -25
  9. package/lib/src/api-clients/team-city/TeamCityApiClient.js +1 -1
  10. package/lib/src/api-clients/trello/TrelloApiClient.js +1 -1
  11. package/lib/src/commands/BumpPackagesCommand.js +1 -1
  12. package/lib/src/commands/CheckReleaseReadyCommand.js +1 -1
  13. package/lib/src/commands/ConfigureProjectsCommand.js +1 -1
  14. package/lib/src/commands/CreateBranchCommand.js +1 -1
  15. package/lib/src/commands/CreateHotfixCommand.js +1 -1
  16. package/lib/src/commands/CreateMergeRequestCommand.js +1 -1
  17. package/lib/src/commands/CreateNotesAuditCommand.js +1 -1
  18. package/lib/src/commands/CreateReleaseNotesCommand.js +1 -1
  19. package/lib/src/commands/CreateTrelloCardsCommand.js +1 -1
  20. package/lib/src/commands/InstallPackagesCommand.js +1 -1
  21. package/lib/src/commands/JiraTicketsStatusCommand.js +33 -0
  22. package/lib/src/commands/ListProjectsCommand.js +1 -1
  23. package/lib/src/commands/ReleaseCommand.js +11 -9
  24. package/lib/src/commands/StartProjectBuildsCommand.js +1 -1
  25. package/lib/src/commands/StatusCommand.js +1 -1
  26. package/lib/src/commands/TagMasterCommand.js +1 -1
  27. package/lib/src/commands/ToolingReleaseCommand.js +1 -1
  28. package/lib/src/commands/UpdateDescriptionCommand.js +1 -1
  29. package/lib/src/commands/ValidateMergeRequestCommand.js +1 -1
  30. package/lib/src/commands/VersionCommand.js +1 -1
  31. package/lib/src/commands/index.js +2 -0
  32. package/lib/src/constants/CommandTypeMapping.js +2 -0
  33. package/lib/src/constants/SlackUserEmailList.js +8 -0
  34. package/lib/src/inversify.config.js +7 -0
  35. package/lib/src/services/GitLabService.js +9 -4
  36. package/lib/src/services/JiraService.js +34 -0
  37. package/lib/src/services/SlackService.js +3 -7
  38. package/lib/src/services/TrelloService.js +1 -1
  39. package/lib/src/services/index.js +1 -0
  40. package/lib/src/startup/AddMilestoneCommand.js +1 -1
  41. package/lib/src/startup/GetAction.js +1 -1
  42. package/lib/src/startup/SetupCommands.js +3 -1
  43. package/lib/src/tasks/BumpPackagesTask.js +1 -1
  44. package/lib/src/tasks/BumpVersionTxtTask.js +1 -1
  45. package/lib/src/tasks/ChangeMilestoneTask.js +1 -1
  46. package/lib/src/tasks/CheckReleaseReadyTask.js +72 -123
  47. package/lib/src/tasks/CreateBranchTask.js +1 -1
  48. package/lib/src/tasks/CreateHotfixTask.js +1 -1
  49. package/lib/src/tasks/CreateMergeRequestTask.js +1 -1
  50. package/lib/src/tasks/CreateNotesAuditTask.js +40 -16
  51. package/lib/src/tasks/CreateReleaseNotesTask.js +1 -1
  52. package/lib/src/tasks/InstallPackagesTask.js +1 -1
  53. package/lib/src/tasks/JiraTicketsStatusTask.js +180 -0
  54. package/lib/src/tasks/ListProjectsTask.js +1 -1
  55. package/lib/src/tasks/PopulateTrelloBoardTask.js +1 -1
  56. package/lib/src/tasks/StartMonorepoBuildTask.js +1 -1
  57. package/lib/src/tasks/StartProjectBuildsTask.js +1 -1
  58. package/lib/src/tasks/TagMasterTask.js +1 -1
  59. package/lib/src/tasks/UpdateMergeRequestDescriptionTask.js +1 -1
  60. package/lib/src/tasks/ValidateCommitsTask.js +1 -1
  61. package/lib/src/tasks/ValidateDescriptionsTask.js +1 -1
  62. package/lib/src/tasks/ValidateMergeRequestTask.js +1 -1
  63. package/lib/src/tasks/ValidateTask.js +23 -20
  64. package/lib/src/tasks/VersionTask.js +1 -1
  65. package/lib/src/tasks/configure-projects/AddApprovalRulesTask.js +1 -1
  66. package/lib/src/tasks/configure-projects/CreateToolingBranchTask.js +1 -1
  67. package/lib/src/tasks/configure-projects/EnsureApprovalRulesTask.js +1 -1
  68. package/lib/src/tasks/configure-projects/primitives/BaseConfigureProjectsTask.js +2 -2
  69. package/lib/src/tasks/index.js +2 -0
  70. package/lib/src/types.js +7 -0
  71. package/lib/src/utils/Descriptions.js +38 -10
  72. package/package.json +6 -5
@@ -21,6 +21,7 @@ __exportStar(require("./CreateMergeRequestCommand"), exports);
21
21
  __exportStar(require("./ListProjectsCommand"), exports);
22
22
  __exportStar(require("./CreateReleaseNotesCommand"), exports);
23
23
  __exportStar(require("./CreateNotesAuditCommand"), exports);
24
+ __exportStar(require("./JiraTicketsStatusCommand"), exports);
24
25
  __exportStar(require("./InstallPackagesCommand"), exports);
25
26
  __exportStar(require("./ReleaseCommand"), exports);
26
27
  __exportStar(require("./ToolingReleaseCommand"), exports);
@@ -30,5 +31,6 @@ __exportStar(require("./TagMasterCommand"), exports);
30
31
  __exportStar(require("./ValidateMergeRequestCommand"), exports);
31
32
  __exportStar(require("./VersionCommand"), exports);
32
33
  __exportStar(require("./CreateTrelloCardsCommand"), exports);
34
+ __exportStar(require("./CheckReleaseReadyCommand"), exports);
33
35
  __exportStar(require("./CreateHotfixCommand"), exports);
34
36
  __exportStar(require("./UpdateDescriptionCommand"), exports);
@@ -11,6 +11,7 @@ exports.CommandTypeMapping = {
11
11
  'create-mrs': types_1.COMMANDS.CreateMergeRequestCommand,
12
12
  'create-notes': types_1.COMMANDS.CreateReleaseNotesCommand,
13
13
  'create-notes-audit': types_1.COMMANDS.CreateNotesAuditCommand,
14
+ 'testing-status': types_1.COMMANDS.JiraTicketsStatusCommand,
14
15
  'install-packages': types_1.COMMANDS.InstallPackagesCommand,
15
16
  'bump-packages': types_1.COMMANDS.BumpPackagesCommand,
16
17
  'validate-mr': types_1.COMMANDS.ValidateMergeRequestCommand,
@@ -19,6 +20,7 @@ exports.CommandTypeMapping = {
19
20
  'list-projects': types_1.COMMANDS.ListProjectsCommand,
20
21
  'create-trello-cards': types_1.COMMANDS.CreateTrelloCardsCommand,
21
22
  'configure-projects': types_1.COMMANDS.ConfigureProjectsCommand,
23
+ 'check-release-ready': types_1.COMMANDS.CheckReleaseReadyCommand,
22
24
  'create-hotfix': types_1.COMMANDS.CreateHotfixCommand,
23
25
  'update-description': types_1.COMMANDS.UpdateDescriptionCommand
24
26
  };
@@ -9,5 +9,13 @@ exports.SLACK_USER_LIST = [
9
9
  {
10
10
  author: 'Kevin Wellalagodage',
11
11
  email: 'kevin.well@clickview.com.au'
12
+ },
13
+ {
14
+ author: 'Vincent Sit',
15
+ email: 'vincent.sit@clickvieweducation.com'
16
+ },
17
+ {
18
+ author: 'Alexander Deeb',
19
+ email: 'alexander.deeb@clickvieweducation.com'
12
20
  }
13
21
  ];
@@ -15,6 +15,7 @@ function createContainer(config) {
15
15
  * Misc
16
16
  */
17
17
  container.bind(types_1.MISC.GitLabConfig).toConstantValue(config.gitLab);
18
+ container.bind(types_1.MISC.JiraConfig).toConstantValue(config.jira);
18
19
  container.bind(types_1.MISC.TeamCityConfig).toConstantValue(config.teamCity);
19
20
  container.bind(types_1.MISC.SlackConfig).toConstantValue(config.slack);
20
21
  container.bind(types_1.MISC.TrelloConfig).toConstantValue(config.trello);
@@ -22,6 +23,7 @@ function createContainer(config) {
22
23
  * Clients
23
24
  */
24
25
  container.bind(types_1.API_CLIENTS.GitLabApiClient).to(api_clients_1.GitLabApiClient);
26
+ container.bind(types_1.API_CLIENTS.JiraApiClient).to(api_clients_1.JiraApiClient);
25
27
  container.bind(types_1.API_CLIENTS.TeamCityApiClient).to(api_clients_1.TeamCityApiClient);
26
28
  container.bind(types_1.API_CLIENTS.SlackApiClient).to(api_clients_1.SlackApiClient);
27
29
  container.bind(types_1.API_CLIENTS.TrelloApiClient).to(api_clients_1.TrelloApiClient);
@@ -29,6 +31,7 @@ function createContainer(config) {
29
31
  * Services
30
32
  */
31
33
  container.bind(types_1.SERVICES.GitLabService).to(services_1.GitLabService).inSingletonScope();
34
+ container.bind(types_1.SERVICES.JiraService).to(services_1.JiraService).inSingletonScope();
32
35
  container.bind(types_1.SERVICES.TeamCityService).to(services_1.TeamCityService).inSingletonScope();
33
36
  container.bind(types_1.SERVICES.SlackService).to(services_1.SlackService).inSingletonScope();
34
37
  container.bind(types_1.SERVICES.TrelloService).to(services_1.TrelloService).inSingletonScope();
@@ -44,6 +47,7 @@ function createContainer(config) {
44
47
  container.bind(types_1.TASKS.ValidateDescriptionsTask).to(tasks_1.ValidateDescriptionsTask);
45
48
  container.bind(types_1.TASKS.CreateReleaseNotesTask).to(tasks_1.CreateReleaseNotesTask);
46
49
  container.bind(types_1.TASKS.CreateNotesAuditTask).to(tasks_1.CreateNotesAuditTask);
50
+ container.bind(types_1.TASKS.JiraTicketsStatusTask).to(tasks_1.JiraTicketsStatusTask);
47
51
  container.bind(types_1.TASKS.InstallPackagesTask).to(tasks_1.InstallPackagesTask);
48
52
  container.bind(types_1.TASKS.BumpPackagesTask).to(tasks_1.BumpPackagesTask);
49
53
  container.bind(types_1.TASKS.ValidateMergeRequestTask).to(tasks_1.ValidateMergeRequestTask);
@@ -56,6 +60,7 @@ function createContainer(config) {
56
60
  container.bind(types_1.TASKS.AddApprovalRulesTask).to(tasks_1.AddApprovalRulesTask);
57
61
  container.bind(types_1.TASKS.EnsureApprovalRulesTask).to(EnsureApprovalRulesTask_1.EnsureApprovalRulesTask);
58
62
  container.bind(types_1.TASKS.CreateToolingBranchTask).to(tasks_1.CreateToolingBranchTask);
63
+ container.bind(types_1.TASKS.CheckReleaseReadyTask).to(tasks_1.CheckReleaseReadyTask);
59
64
  container.bind(types_1.TASKS.CreateHotfixTask).to(tasks_1.CreateHotfixTask);
60
65
  container.bind(types_1.TASKS.ChangeMilestoneTask).to(ChangeMilestoneTask_1.ChangeMilestoneTask);
61
66
  container
@@ -72,6 +77,7 @@ function createContainer(config) {
72
77
  container.bind(types_1.COMMANDS.ToolingReleaseCommand).to(commands_1.ToolingReleaseCommand);
73
78
  container.bind(types_1.COMMANDS.CreateReleaseNotesCommand).to(commands_1.CreateReleaseNotesCommand);
74
79
  container.bind(types_1.COMMANDS.CreateNotesAuditCommand).to(commands_1.CreateNotesAuditCommand);
80
+ container.bind(types_1.COMMANDS.JiraTicketsStatusCommand).to(commands_1.JiraTicketsStatusCommand);
75
81
  container.bind(types_1.COMMANDS.InstallPackagesCommand).to(commands_1.InstallPackagesCommand);
76
82
  container.bind(types_1.COMMANDS.BumpPackagesCommand).to(commands_1.BumpPackagesCommand);
77
83
  container.bind(types_1.COMMANDS.ValidateMergeRequestCommand).to(commands_1.ValidateMergeRequestCommand);
@@ -81,6 +87,7 @@ function createContainer(config) {
81
87
  container.bind(types_1.COMMANDS.StartProjectBuildsCommand)
82
88
  .to(commands_1.StartProjectBuildsCommand);
83
89
  container.bind(types_1.COMMANDS.ConfigureProjectsCommand).to(commands_1.ConfigureProjectsCommand);
90
+ container.bind(types_1.COMMANDS.CheckReleaseReadyCommand).to(commands_1.CheckReleaseReadyCommand);
84
91
  container.bind(types_1.COMMANDS.CreateHotfixCommand).to(commands_1.CreateHotfixCommand);
85
92
  container.bind(types_1.COMMANDS.UpdateDescriptionCommand).to(commands_1.UpdateDescriptionCommand);
86
93
  return container;
@@ -37,7 +37,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
37
37
  function verb(n) { return function (v) { return step([n, v]); }; }
38
38
  function step(op) {
39
39
  if (f) throw new TypeError("Generator is already executing.");
40
- while (_) try {
40
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
41
41
  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;
42
42
  if (y = 0, t) op = [op[0] & 2, t.value];
43
43
  switch (op[0]) {
@@ -88,7 +88,7 @@ var GitLabService = /** @class */ (function () {
88
88
  if (omittedProjectIds === void 0) { omittedProjectIds = []; }
89
89
  var _b = _a === void 0 ? {} : _a, _c = _b.invalidateCache, invalidateCache = _c === void 0 ? false : _c;
90
90
  return __awaiter(this, void 0, void 0, function () {
91
- var allMergeRequests, mergeRequests, releaseProjectIds, projects, mappedProjects, _i, mappedProjects_1, mappedProject, extraProjects;
91
+ var allMergeRequests, mergeRequests, releaseIgnoreLabel, releasableMergeRequests, releaseProjectIds, projects, mappedProjects, _i, mappedProjects_1, mappedProject, extraProjects;
92
92
  return __generator(this, function (_d) {
93
93
  switch (_d.label) {
94
94
  case 0:
@@ -101,13 +101,18 @@ var GitLabService = /** @class */ (function () {
101
101
  mergeRequests = allMergeRequests.filter(function (mr) { return mr.targetBranch !== 'master'; });
102
102
  if (!(mergeRequests === null || mergeRequests === void 0 ? void 0 : mergeRequests.length))
103
103
  throw new errors_1.ShipItError('Could not find any merge requests for the specified options');
104
- releaseProjectIds = lodash_1.default.uniqBy(mergeRequests, function (m) { return m.projectId; }).map(function (m) { return m.projectId; });
104
+ releaseIgnoreLabel = 'shipit::release_ignore';
105
+ releasableMergeRequests = mergeRequests.filter(function (mr) {
106
+ var _a;
107
+ return !((_a = mr.labels) !== null && _a !== void 0 ? _a : []).includes(releaseIgnoreLabel);
108
+ });
109
+ releaseProjectIds = lodash_1.default.uniqBy(releasableMergeRequests, function (m) { return m.projectId; }).map(function (m) { return m.projectId; });
105
110
  return [4 /*yield*/, this.apiClient.getProjectsByIds(releaseProjectIds)];
106
111
  case 2:
107
112
  projects = _d.sent();
108
113
  if (!(projects === null || projects === void 0 ? void 0 : projects.length) || projects.length !== releaseProjectIds.length)
109
114
  throw new errors_1.ShipItError('Could not find all projects for the found merge requests');
110
- mappedProjects = projects.map(function (p) { return (__assign(__assign({}, p), { mergeRequests: mergeRequests.filter(function (mr) { return mr.projectId === p.id; }) })); });
115
+ mappedProjects = projects.map(function (p) { return (__assign(__assign({}, p), { mergeRequests: releasableMergeRequests.filter(function (mr) { return mr.projectId === p.id; }) })); });
111
116
  _i = 0, mappedProjects_1 = mappedProjects;
112
117
  _d.label = 3;
113
118
  case 3:
@@ -0,0 +1,34 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.JiraService = void 0;
16
+ require("reflect-metadata");
17
+ var inversify_1 = require("inversify");
18
+ var types_1 = require("../types");
19
+ var api_clients_1 = require("../api-clients");
20
+ var JiraService = /** @class */ (function () {
21
+ function JiraService(apiClient) {
22
+ this.apiClient = apiClient;
23
+ }
24
+ JiraService.prototype.searchIssues = function (jql) {
25
+ return this.apiClient.searchIssues(jql);
26
+ };
27
+ JiraService = __decorate([
28
+ (0, inversify_1.injectable)(),
29
+ __param(0, (0, inversify_1.inject)(types_1.API_CLIENTS.JiraApiClient)),
30
+ __metadata("design:paramtypes", [api_clients_1.JiraApiClient])
31
+ ], JiraService);
32
+ return JiraService;
33
+ }());
34
+ exports.JiraService = JiraService;
@@ -26,7 +26,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
26
26
  function verb(n) { return function (v) { return step([n, v]); }; }
27
27
  function step(op) {
28
28
  if (f) throw new TypeError("Generator is already executing.");
29
- while (_) try {
29
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
30
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
31
  if (y = 0, t) op = [op[0] & 2, t.value];
32
32
  switch (op[0]) {
@@ -89,7 +89,7 @@ var SlackService = /** @class */ (function () {
89
89
  SlackService.prototype.sendSlackStatusMessage = function (options) {
90
90
  var _a, _b;
91
91
  return __awaiter(this, void 0, void 0, function () {
92
- var threadTs, _c, formatedMessage, authorList, userList, mentionUserString;
92
+ var threadTs, _c, authorList, userList, mentionUserString;
93
93
  return __generator(this, function (_d) {
94
94
  switch (_d.label) {
95
95
  case 0: return [4 /*yield*/, this.apiClient.findLatestMessageTs(options.threadLabel)];
@@ -105,8 +105,7 @@ var SlackService = /** @class */ (function () {
105
105
  threadTs = _c;
106
106
  if (!options.statusMessage)
107
107
  options.statusMessage = options.statusCleanMessage;
108
- formatedMessage = this.createTextFileMessage(options.statusMessage);
109
- return [4 /*yield*/, this.apiClient.replyInThread(formatedMessage, threadTs)];
108
+ return [4 /*yield*/, this.apiClient.replyInThread(options.statusMessage, threadTs, options.sendAsFile)];
110
109
  case 5:
111
110
  _d.sent();
112
111
  if (!((_b = options.emailList) === null || _b === void 0 ? void 0 : _b.length))
@@ -129,9 +128,6 @@ var SlackService = /** @class */ (function () {
129
128
  SlackService.prototype.formatMentionUsers = function (usernames) {
130
129
  return usernames.map(function (username) { return "<@".concat(username, ">"); }).join(' ');
131
130
  };
132
- SlackService.prototype.createTextFileMessage = function (fileContent) {
133
- return "```\n".concat(fileContent, "\n```");
134
- };
135
131
  SlackService = __decorate([
136
132
  (0, inversify_1.injectable)(),
137
133
  __param(0, (0, inversify_1.inject)(types_1.API_CLIENTS.SlackApiClient)),
@@ -26,7 +26,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
26
26
  function verb(n) { return function (v) { return step([n, v]); }; }
27
27
  function step(op) {
28
28
  if (f) throw new TypeError("Generator is already executing.");
29
- while (_) try {
29
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
30
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
31
  if (y = 0, t) op = [op[0] & 2, t.value];
32
32
  switch (op[0]) {
@@ -15,6 +15,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./GitLabService"), exports);
18
+ __exportStar(require("./JiraService"), exports);
18
19
  __exportStar(require("./TeamCityService"), exports);
19
20
  __exportStar(require("./TrelloService"), exports);
20
21
  __exportStar(require("./SlackService"), exports);
@@ -14,7 +14,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
14
14
  function verb(n) { return function (v) { return step([n, v]); }; }
15
15
  function step(op) {
16
16
  if (f) throw new TypeError("Generator is already executing.");
17
- while (_) try {
17
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
18
18
  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;
19
19
  if (y = 0, t) op = [op[0] & 2, t.value];
20
20
  switch (op[0]) {
@@ -14,7 +14,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
14
14
  function verb(n) { return function (v) { return step([n, v]); }; }
15
15
  function step(op) {
16
16
  if (f) throw new TypeError("Generator is already executing.");
17
- while (_) try {
17
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
18
18
  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;
19
19
  if (y = 0, t) op = [op[0] & 2, t.value];
20
20
  switch (op[0]) {
@@ -25,7 +25,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
25
25
  function verb(n) { return function (v) { return step([n, v]); }; }
26
26
  function step(op) {
27
27
  if (f) throw new TypeError("Generator is already executing.");
28
- while (_) try {
28
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
29
29
  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;
30
30
  if (y = 0, t) op = [op[0] & 2, t.value];
31
31
  switch (op[0]) {
@@ -60,8 +60,10 @@ function setupCommands(program, container) {
60
60
  addMilestoneCommand('create-branches', 'Create release branches for all projects that are part of a milestone');
61
61
  addMilestoneCommand('create-mrs', 'Create merge requests for all projects that are part of a milestone');
62
62
  addMilestoneCommand('create-notes-audit', 'Builds a spreadsheet of all the customer changes and who wrote them.');
63
+ addMilestoneCommand('testing-status', 'Fetches Jira ticket status for a milestone and posts results to Slack.');
63
64
  addMilestoneCommand('tag-master', 'Tags master for all release MRs that are part of a milestone');
64
65
  addMilestoneCommand('create-trello-cards', 'Creates the cards on the ship-it trello board for all projects that are part of a milestone');
66
+ addMilestoneCommand('check-release-ready', 'Checks for all pre-release tasks to ensure release is ready to be pushed');
65
67
  addMilestoneCommand('update-description', 'Recreates descriptions for release MRs');
66
68
  program.command('status')
67
69
  .description('Get the status of all MRs in a milestone')
@@ -26,7 +26,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
26
26
  function verb(n) { return function (v) { return step([n, v]); }; }
27
27
  function step(op) {
28
28
  if (f) throw new TypeError("Generator is already executing.");
29
- while (_) try {
29
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
30
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
31
  if (y = 0, t) op = [op[0] & 2, t.value];
32
32
  switch (op[0]) {
@@ -26,7 +26,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
26
26
  function verb(n) { return function (v) { return step([n, v]); }; }
27
27
  function step(op) {
28
28
  if (f) throw new TypeError("Generator is already executing.");
29
- while (_) try {
29
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
30
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
31
  if (y = 0, t) op = [op[0] & 2, t.value];
32
32
  switch (op[0]) {
@@ -26,7 +26,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
26
26
  function verb(n) { return function (v) { return step([n, v]); }; }
27
27
  function step(op) {
28
28
  if (f) throw new TypeError("Generator is already executing.");
29
- while (_) try {
29
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
30
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
31
  if (y = 0, t) op = [op[0] & 2, t.value];
32
32
  switch (op[0]) {
@@ -26,7 +26,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
26
26
  function verb(n) { return function (v) { return step([n, v]); }; }
27
27
  function step(op) {
28
28
  if (f) throw new TypeError("Generator is already executing.");
29
- while (_) try {
29
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
30
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
31
  if (y = 0, t) op = [op[0] & 2, t.value];
32
32
  switch (op[0]) {
@@ -56,138 +56,93 @@ var types_1 = require("../types");
56
56
  var services_1 = require("../services");
57
57
  var utils_1 = require("../utils");
58
58
  var CheckReleaseReadyTask = /** @class */ (function () {
59
- function CheckReleaseReadyTask(service, slackService, trelloService) {
59
+ function CheckReleaseReadyTask(service, slackService) {
60
60
  this.service = service;
61
61
  this.slackService = slackService;
62
- this.trelloService = trelloService;
63
62
  }
64
63
  CheckReleaseReadyTask.prototype.run = function (options) {
65
- var _a;
66
64
  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) {
65
+ var projects, deployDependenciesTasks, beforeReleaseTasks, afterReleaseTasks, sqlSections, failedProjects, _i, projects_1, project, branchName, mergeRequest, deployDependencies, beforeTasks, afterTasks, beforeSQL, afterSQL, _a, failedProjects_1, _b, project, branch, milestoneLabel, taskSummary, sqlMessage;
66
+ return __generator(this, function (_c) {
67
+ switch (_c.label) {
70
68
  case 0:
71
69
  Logger_1.Logger.logTask('Checking status of the current release...');
72
70
  return [4 /*yield*/, this.service.getReleaseProjects(options.milestone, options.projectIds, options.omittedProjectIds, options.sourceBranch)];
73
71
  case 1:
74
- projects = _f.sent();
72
+ projects = _c.sent();
75
73
  deployDependenciesTasks = [];
76
74
  beforeReleaseTasks = [];
77
75
  afterReleaseTasks = [];
78
76
  sqlSections = [];
77
+ failedProjects = [];
79
78
  _i = 0, projects_1 = projects;
80
- _f.label = 2;
79
+ _c.label = 2;
81
80
  case 2:
82
- if (!(_i < projects_1.length)) return [3 /*break*/, 7];
81
+ if (!(_i < projects_1.length)) return [3 /*break*/, 6];
83
82
  project = projects_1[_i];
84
83
  return [4 /*yield*/, this.service.getNextBranchInfo(project.id, options.version)];
85
84
  case 3:
86
- branchName = (_f.sent()).branchName;
85
+ branchName = (_c.sent()).branchName;
87
86
  return [4 /*yield*/, this.service.getMergeRequest(project.id, branchName)];
88
87
  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
- });
88
+ mergeRequest = _c.sent();
89
+ if (!mergeRequest) {
90
+ failedProjects.push([project.title, branchName]);
91
+ return [3 /*break*/, 5];
141
92
  }
142
- _f.label = 6;
143
- case 6:
93
+ deployDependencies = utils_1.Descriptions.getDescriptionSection('Dependencies', mergeRequest);
94
+ beforeTasks = utils_1.Descriptions.getDescriptionSection('BeforeRelease', mergeRequest, 'Tasks');
95
+ afterTasks = utils_1.Descriptions.getDescriptionSection('AfterRelease', mergeRequest, 'Tasks');
96
+ beforeSQL = utils_1.Descriptions.getDescriptionSection('BeforeRelease', mergeRequest, 'SQL');
97
+ afterSQL = utils_1.Descriptions.getDescriptionSection('AfterRelease', mergeRequest, 'SQL');
98
+ if (deployDependencies)
99
+ deployDependenciesTasks.push({ project: project.title, mr: mergeRequest.title, content: deployDependencies });
100
+ if (beforeTasks)
101
+ beforeReleaseTasks.push({ project: project.title, mr: mergeRequest.title, content: beforeTasks });
102
+ if (afterTasks)
103
+ afterReleaseTasks.push({ project: project.title, mr: mergeRequest.title, content: afterTasks });
104
+ if (beforeSQL)
105
+ sqlSections.push({ project: project.title, mr: mergeRequest.title, content: beforeSQL, phase: 'BeforeRelease' });
106
+ if (afterSQL)
107
+ sqlSections.push({ project: project.title, mr: mergeRequest.title, content: afterSQL, phase: 'AfterRelease' });
108
+ _c.label = 5;
109
+ case 5:
144
110
  _i++;
145
111
  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);
112
+ case 6:
113
+ if (failedProjects.length > 0) {
114
+ Logger_1.Logger.logError('Failed to find release MR for the following projects:');
115
+ for (_a = 0, failedProjects_1 = failedProjects; _a < failedProjects_1.length; _a++) {
116
+ _b = failedProjects_1[_a], project = _b[0], branch = _b[1];
117
+ Logger_1.Logger.logError("- ".concat(project, " on branch ").concat(branch));
118
+ }
119
+ return [2 /*return*/, false];
171
120
  }
172
- if (!options.slackNotifier) return [3 /*break*/, 11];
121
+ this.logSection('====== ALL DEPLOY DEPENDENCIES ======', deployDependenciesTasks);
122
+ this.logSection('====== ALL BEFORE RELEASE TASKS ======', beforeReleaseTasks);
123
+ this.logSection('====== ALL AFTER RELEASE TASKS ======', afterReleaseTasks);
124
+ this.logSection('====== ALL SQL CHANGES (with context) ======', sqlSections, function (item) { return item.phase === 'BeforeRelease' ? 'Before Release' : 'After Release'; });
125
+ if (!options.slackNotifier)
126
+ return [2 /*return*/, true];
173
127
  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];
128
+ taskSummary = [
129
+ this.formatSection('Deploy Dependencies', deployDependenciesTasks),
130
+ this.formatSection('Before Release Tasks', beforeReleaseTasks),
131
+ this.formatSection('After Release Tasks', afterReleaseTasks)
132
+ ].filter(Boolean).join('\n');
133
+ if (!taskSummary) return [3 /*break*/, 8];
180
134
  return [4 /*yield*/, this.slackService.sendSlackStatusMessage({
181
135
  emailList: [],
182
- threadLabel: "".concat(milestoneLabel, " Tasks & Dependencies"),
136
+ threadLabel: "".concat(milestoneLabel, " Tasks and Dependencies"),
183
137
  statusMessage: taskSummary,
184
138
  statusCleanMessage: 'No Before/After Release Tasks found!'
185
139
  })];
140
+ case 7:
141
+ _c.sent();
142
+ _c.label = 8;
186
143
  case 8:
187
- _f.sent();
188
- _f.label = 9;
189
- case 9:
190
- if (!sqlMessage) return [3 /*break*/, 11];
144
+ sqlMessage = this.formatSection('SQL Changes', sqlSections, function (item) { return item.phase === 'BeforeRelease' ? 'Before Release' : 'After Release'; });
145
+ if (!sqlMessage) return [3 /*break*/, 10];
191
146
  return [4 /*yield*/, this.slackService.sendSlackStatusMessage({
192
147
  emailList: [],
193
148
  threadLabel: "".concat(milestoneLabel, " SQL"),
@@ -195,35 +150,31 @@ var CheckReleaseReadyTask = /** @class */ (function () {
195
150
  statusCleanMessage: 'No SQL changes found in release!',
196
151
  sendAsFile: true
197
152
  })];
198
- case 10:
199
- _f.sent();
200
- _f.label = 11;
201
- case 11: return [2 /*return*/, true];
153
+ case 9:
154
+ _c.sent();
155
+ _c.label = 10;
156
+ case 10: return [2 /*return*/, true];
202
157
  }
203
158
  });
204
159
  });
205
160
  };
206
- CheckReleaseReadyTask.prototype.formatTaskSection = function (title, items) {
207
- if (items.length === 0)
208
- return 'No tasks found!';
209
- var output = "## ".concat(title, "\n\n");
161
+ CheckReleaseReadyTask.prototype.logSection = function (header, items, getPhaseLabel) {
162
+ Logger_1.Logger.logInfo(header);
210
163
  for (var _i = 0, items_1 = items; _i < items_1.length; _i++) {
211
164
  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");
165
+ var phase = getPhaseLabel ? " (".concat(getPhaseLabel(item), ")") : '';
166
+ Logger_1.Logger.logMessage("\uD83D\uDD39 ".concat(item.project, " | ").concat(item.mr).concat(phase));
167
+ Logger_1.Logger.logMessage(item.content);
215
168
  }
216
- return output;
217
169
  };
218
- CheckReleaseReadyTask.prototype.formatSQLSection = function (items) {
170
+ CheckReleaseReadyTask.prototype.formatSection = function (title, items, getPhaseLabel) {
219
171
  if (items.length === 0)
220
- return 'No SQL found!';
221
- var output = "## SQL Changes\n\n";
172
+ return '';
173
+ var output = "## ".concat(title, "\n\n");
222
174
  for (var _i = 0, items_2 = items; _i < items_2.length; _i++) {
223
175
  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");
176
+ var phase = getPhaseLabel ? " (".concat(getPhaseLabel(item), ")") : '';
177
+ output += "### ".concat(item.project, " \u2013 ").concat(item.mr).concat(phase, "\n");
227
178
  output += "".concat(item.content.trim(), "\n");
228
179
  }
229
180
  return output;
@@ -232,10 +183,8 @@ var CheckReleaseReadyTask = /** @class */ (function () {
232
183
  (0, inversify_1.injectable)(),
233
184
  __param(0, (0, inversify_1.inject)(types_1.SERVICES.GitLabService)),
234
185
  __param(1, (0, inversify_1.inject)(types_1.SERVICES.SlackService)),
235
- __param(2, (0, inversify_1.inject)(types_1.SERVICES.TrelloService)),
236
186
  __metadata("design:paramtypes", [services_1.GitLabService,
237
- services_1.SlackService,
238
- services_1.TrelloService])
187
+ services_1.SlackService])
239
188
  ], CheckReleaseReadyTask);
240
189
  return CheckReleaseReadyTask;
241
190
  }());
@@ -26,7 +26,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
26
26
  function verb(n) { return function (v) { return step([n, v]); }; }
27
27
  function step(op) {
28
28
  if (f) throw new TypeError("Generator is already executing.");
29
- while (_) try {
29
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
30
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
31
  if (y = 0, t) op = [op[0] & 2, t.value];
32
32
  switch (op[0]) {
@@ -26,7 +26,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
26
26
  function verb(n) { return function (v) { return step([n, v]); }; }
27
27
  function step(op) {
28
28
  if (f) throw new TypeError("Generator is already executing.");
29
- while (_) try {
29
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
30
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
31
  if (y = 0, t) op = [op[0] & 2, t.value];
32
32
  switch (op[0]) {
@@ -26,7 +26,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
26
26
  function verb(n) { return function (v) { return step([n, v]); }; }
27
27
  function step(op) {
28
28
  if (f) throw new TypeError("Generator is already executing.");
29
- while (_) try {
29
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
30
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
31
  if (y = 0, t) op = [op[0] & 2, t.value];
32
32
  switch (op[0]) {