@clickview/ship-it 0.0.48 → 0.0.49
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/.claude/settings.local.json +10 -0
- package/dist/W2/W2 Notes Audit.csv +57 -0
- package/lib/src/api-clients/jira/JiraApiClient.js +105 -0
- package/lib/src/commands/JiraTicketsStatusCommand.js +73 -0
- package/lib/src/commands/ReleaseCommand.js +10 -8
- package/lib/src/constants/SlackUserEmailList.js +8 -0
- package/lib/src/services/JiraService.js +34 -0
- package/lib/src/tasks/CheckReleaseReadyTask.js +58 -121
- package/lib/src/tasks/JiraTicketsStatusTask.js +180 -0
- package/package.json +1 -1
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"permissions": {
|
|
3
|
+
"allow": [
|
|
4
|
+
"Bash(grep -r release /Users/varun.singh/Desktop/cv-projects/ship-it --include=*.ts --include=*.js)",
|
|
5
|
+
"Bash(ls /Users/varun.singh/Desktop/cv-projects/ship-it/config*)",
|
|
6
|
+
"Bash(ls /Users/varun.singh/Desktop/cv-projects/ship-it/*.json)",
|
|
7
|
+
"Bash(grep -E \"^\\(axios|node-fetch|got|undici\\)$\")"
|
|
8
|
+
]
|
|
9
|
+
}
|
|
10
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
projectName,mrTitle,mrAuthor,mrAssignee,mrUrl,notes
|
|
2
|
+
clickview,Lite: Fix classroom avatars in the insights heatmap,Shale Kuzmanovski,Boris Berak,https://gitlab.cvinternal.net/clickview/front-end/clickview/-/merge_requests/6273,"# Lite
|
|
3
|
+
- Fix classroom avatars in the insights heatmap. Partially addresses INBOX-11438."
|
|
4
|
+
clickview,Player: Fix missing qualities,Shale Kuzmanovski,Cameron Hill,https://gitlab.cvinternal.net/clickview/front-end/clickview/-/merge_requests/6271,"# Player
|
|
5
|
+
- Fixed a bug that was preventing the last quality level from showing. Fixes TEST-357."
|
|
6
|
+
clickview,Lite - Temporary use hardcoded presentation cover,Nan Chen,Nischal Shrestha,https://gitlab.cvinternal.net/clickview/front-end/clickview/-/merge_requests/6262,"# Lite
|
|
7
|
+
- Update cover for US High presentation to use photo-style cover when the customer has the preferred theme set to be `photo`.
|
|
8
|
+
- 
|
|
9
|
+
- "
|
|
10
|
+
clickview,Curator: Displays presentation last updated information,Nischal Shrestha,Nan Chen,https://gitlab.cvinternal.net/clickview/front-end/clickview/-/merge_requests/6258,"# Curator
|
|
11
|
+
* Displays the last updated time for presentations in the list view, providing users with a clear indicator of a presentation's freshness. Hovering over the time will show the exact date. Implements CC-1351."
|
|
12
|
+
clickview,Fix - Update video status OGQL when fetching playlist,Nan Chen,Nischal Shrestha,https://gitlab.cvinternal.net/clickview/front-end/clickview/-/merge_requests/6256,"# Lite
|
|
13
|
+
* Fix an issue when the count on the playlist tile on `/playlists` does not match the number of videos on the playlist page. Fixes INBOX-11120"
|
|
14
|
+
clickview,Lite: Search - Fixes search-in tags flakey visibility,Nischal Shrestha,Nan Chen,https://gitlab.cvinternal.net/clickview/front-end/clickview/-/merge_requests/6244,"# Lite
|
|
15
|
+
* Users will experience more reliable display of the ""Search in X"" tag when navigating to scoped search results, preventing instances where the tag might incorrectly disappear."
|
|
16
|
+
clickview,Curator - Support remove video banner for a content partner,Nan Chen,Nischal Shrestha,https://gitlab.cvinternal.net/clickview/front-end/clickview/-/merge_requests/6240,"# Curator
|
|
17
|
+
- Now you can remove the video banner for a content partner. And the Replace video button icon is replaced with an upload icon.
|
|
18
|
+
- "
|
|
19
|
+
clickview,Curator: Channels - Videos view,Nischal Shrestha,Nan Chen,https://gitlab.cvinternal.net/clickview/front-end/clickview/-/merge_requests/6238,"# Curator
|
|
20
|
+
* Add a tab in manage channels where users can view all videos for that channel. Implements CC-1358.
|
|
21
|
+
* Ability to add new videos to the channel
|
|
22
|
+
* Ability to delete video(s) in the channel"
|
|
23
|
+
clickview,Lite: Tutorial Videos,Vincent Sit,Shale Kuzmanovski,https://gitlab.cvinternal.net/clickview/front-end/clickview/-/merge_requests/6237,"# Lite
|
|
24
|
+
This change should only be visible to users who are new to ClickView (accounts created less than 14 days ago). They will see an additional bar in the dashboard page that features a series of tutorial videos from ClickView. Implements LTE-3240
|
|
25
|
+
Before: 
|
|
26
|
+
After: ↵ ↵ 
|
|
27
|
+
The user can dismiss the tutorial video panel through the 'Hide' text button on the top right hand corner. Otherwise, once 14 days have lapsed since account creation, the panel will not be displayed."
|
|
28
|
+
clickview,Shared - Fix visible svg icon id collision issue,Nan Chen,Nischal Shrestha,https://gitlab.cvinternal.net/clickview/front-end/clickview/-/merge_requests/6229,"# Curator
|
|
29
|
+
- Fixed the visible-on and visible-off icons are not being shown correctly. Fixes INBOX-11338"
|
|
30
|
+
clickview,Lite - Fix playlist member count not matching issue,Nan Chen,Nischal Shrestha,https://gitlab.cvinternal.net/clickview/front-end/clickview/-/merge_requests/6228,"# Lite
|
|
31
|
+
- Fix an issue when the count on the playlist tile on `/playlists` does not match the number of videos on the playlist page. Fixes INBOX-11120"
|
|
32
|
+
clickview,Improve the names generated from the anonymise name function,Cameron Hill,Boris Berak,https://gitlab.cvinternal.net/clickview/front-end/clickview/-/merge_requests/6227,"# Shared
|
|
33
|
+
- Improve the names used for ""anonymise names"". Closes INBOX-10122"
|
|
34
|
+
clickview,Player - Extend volume slider hit area to cover the full hover zone,Nan Chen,Shale Kuzmanovski,https://gitlab.cvinternal.net/clickview/front-end/clickview/-/merge_requests/6226,"# Player
|
|
35
|
+
- Increase the hit area for the player volume bar."
|
|
36
|
+
clickview,Lite: aligns classroom staff role pill design,Nischal Shrestha,Shale Kuzmanovski,https://gitlab.cvinternal.net/clickview/front-end/clickview/-/merge_requests/6224,"# Lite
|
|
37
|
+
* Updates the visual design of the ""Admin"" and ""Owner"" role pills displayed next to teacher names in the classroom management view. Fixes INBOX-9615.
|
|
38
|
+
| Before | After |
|
|
39
|
+
|--------|-------|
|
|
40
|
+
| {width=1113 height=368} | {width=1142 height=367} |"
|
|
41
|
+
clickview,Lite - Add theme setting,Nan Chen,Nischal Shrestha,https://gitlab.cvinternal.net/clickview/front-end/clickview/-/merge_requests/6219,"# Lite
|
|
42
|
+
- Added new Appearance setting for admin and it's only for customer who has US high presentation.
|
|
43
|
+
- 
|
|
44
|
+
- Admin can toggle theme for topic assets in the Appearance setting page:
|
|
45
|
+
- "
|
|
46
|
+
clickview,Curator: Channels - Enables delete for read-only 'all videos' widget,Nischal Shrestha,Nan Chen,https://gitlab.cvinternal.net/clickview/front-end/clickview/-/merge_requests/6218,"# Curator
|
|
47
|
+
* Users can now delete specific read-only widgets, such as 'all videos' widgets in channels, from their dashboards. Implements CC-1357."
|
|
48
|
+
clickview,Crm studio - IDP form update,Nan Chen,Boris Berak,https://gitlab.cvinternal.net/clickview/front-end/clickview/-/merge_requests/6216,"# Curator
|
|
49
|
+
- Now in the IDP details section in the create IDP form, only the IDP name is required:
|
|
50
|
+
- 
|
|
51
|
+
- Removed the default value for the displayed name for Microsoft.
|
|
52
|
+
- "
|
|
53
|
+
clickview,Lite - Fix player is rendered in hover mode on play page,Nan Chen,Shale Kuzmanovski,https://gitlab.cvinternal.net/clickview/front-end/clickview/-/merge_requests/6214,"# Lite
|
|
54
|
+
* Fixes an issue when hovering on a pop-up video to preview the video, then clicking on the title in the pop-up card to go to the video play page. The play page is showing a non-interactive player. (no control bar)."
|
|
55
|
+
clickview,Lite: Channels - Enables parent editing for channels,Nischal Shrestha,Nan Chen,https://gitlab.cvinternal.net/clickview/front-end/clickview/-/merge_requests/6211,"# Curator
|
|
56
|
+
* Users can now update the parent of an existing content partner, as the selection field is no longer disabled during the editing process. Implements CC-1356."
|
|
57
|
+
Master.Auth,Legacy saml check fixes,Cameron Hill,Kevin Wellalagodage,https://gitlab.cvinternal.net/clickview/back-end/Master.Auth/-/merge_requests/842,- Fix some SSO setups redirecting to the wrong SAML IDP on login. Fixes INBOX-11324
|
|
@@ -0,0 +1,105 @@
|
|
|
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 (g && (g = 0, op[0] && (_ = 0)), _) 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.JiraApiClient = void 0;
|
|
52
|
+
require("reflect-metadata");
|
|
53
|
+
var inversify_1 = require("inversify");
|
|
54
|
+
var jira_js_1 = require("jira.js");
|
|
55
|
+
var types_1 = require("../../types");
|
|
56
|
+
var JiraApiClient = /** @class */ (function () {
|
|
57
|
+
function JiraApiClient(config) {
|
|
58
|
+
this.config = config;
|
|
59
|
+
this.client = new jira_js_1.Version3Client({
|
|
60
|
+
host: config.url,
|
|
61
|
+
authentication: {
|
|
62
|
+
basic: {
|
|
63
|
+
email: config.email,
|
|
64
|
+
apiToken: config.apiToken
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
JiraApiClient.prototype.searchIssues = function (jql) {
|
|
70
|
+
var _a;
|
|
71
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
72
|
+
var result;
|
|
73
|
+
var _this = this;
|
|
74
|
+
return __generator(this, function (_b) {
|
|
75
|
+
switch (_b.label) {
|
|
76
|
+
case 0: return [4 /*yield*/, this.client.issueSearch.searchForIssuesUsingJqlEnhancedSearchPost({
|
|
77
|
+
jql: jql,
|
|
78
|
+
fields: ['summary', 'status', 'assignee'],
|
|
79
|
+
maxResults: 100
|
|
80
|
+
})];
|
|
81
|
+
case 1:
|
|
82
|
+
result = _b.sent();
|
|
83
|
+
return [2 /*return*/, ((_a = result.issues) !== null && _a !== void 0 ? _a : []).map(function (issue) {
|
|
84
|
+
var _a, _b, _c, _d, _e, _f;
|
|
85
|
+
return ({
|
|
86
|
+
key: issue.key,
|
|
87
|
+
summary: issue.fields.summary,
|
|
88
|
+
status: (_b = (_a = issue.fields.status) === null || _a === void 0 ? void 0 : _a.name) !== null && _b !== void 0 ? _b : 'Unknown',
|
|
89
|
+
assigneeDisplayName: (_d = (_c = issue.fields.assignee) === null || _c === void 0 ? void 0 : _c.displayName) !== null && _d !== void 0 ? _d : null,
|
|
90
|
+
assigneeEmail: (_f = (_e = issue.fields.assignee) === null || _e === void 0 ? void 0 : _e.emailAddress) !== null && _f !== void 0 ? _f : null,
|
|
91
|
+
url: "".concat(_this.config.url, "/browse/").concat(issue.key)
|
|
92
|
+
});
|
|
93
|
+
})];
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
};
|
|
98
|
+
JiraApiClient = __decorate([
|
|
99
|
+
(0, inversify_1.injectable)(),
|
|
100
|
+
__param(0, (0, inversify_1.inject)(types_1.MISC.JiraConfig)),
|
|
101
|
+
__metadata("design:paramtypes", [Object])
|
|
102
|
+
], JiraApiClient);
|
|
103
|
+
return JiraApiClient;
|
|
104
|
+
}());
|
|
105
|
+
exports.JiraApiClient = JiraApiClient;
|
|
@@ -0,0 +1,73 @@
|
|
|
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 (g && (g = 0, op[0] && (_ = 0)), _) 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.JiraTicketsStatusCommand = void 0;
|
|
52
|
+
require("reflect-metadata");
|
|
53
|
+
var inversify_1 = require("inversify");
|
|
54
|
+
var types_1 = require("../types");
|
|
55
|
+
var JiraTicketsStatusCommand = /** @class */ (function () {
|
|
56
|
+
function JiraTicketsStatusCommand(jiraTicketsStatusTask) {
|
|
57
|
+
this.jiraTicketsStatusTask = jiraTicketsStatusTask;
|
|
58
|
+
}
|
|
59
|
+
JiraTicketsStatusCommand.prototype.run = function (options) {
|
|
60
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
61
|
+
return __generator(this, function (_a) {
|
|
62
|
+
return [2 /*return*/, this.jiraTicketsStatusTask.run(options)];
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
};
|
|
66
|
+
JiraTicketsStatusCommand = __decorate([
|
|
67
|
+
(0, inversify_1.injectable)(),
|
|
68
|
+
__param(0, (0, inversify_1.inject)(types_1.TASKS.JiraTicketsStatusTask)),
|
|
69
|
+
__metadata("design:paramtypes", [Object])
|
|
70
|
+
], JiraTicketsStatusCommand);
|
|
71
|
+
return JiraTicketsStatusCommand;
|
|
72
|
+
}());
|
|
73
|
+
exports.JiraTicketsStatusCommand = JiraTicketsStatusCommand;
|
|
@@ -96,33 +96,35 @@ var ReleaseCommand = /** @class */ (function () {
|
|
|
96
96
|
cont = _a.sent();
|
|
97
97
|
if (!cont)
|
|
98
98
|
return [2 /*return*/, false];
|
|
99
|
-
return [4 /*yield*/, this.
|
|
99
|
+
return [4 /*yield*/, this.validateCommitsTask.run(options)];
|
|
100
100
|
case 4:
|
|
101
|
-
// cont = await this.validateCommitsTask.run(options);
|
|
102
|
-
// if (!cont)
|
|
103
|
-
// return false;
|
|
104
101
|
cont = _a.sent();
|
|
105
102
|
if (!cont)
|
|
106
103
|
return [2 /*return*/, false];
|
|
107
|
-
return [4 /*yield*/, this.
|
|
104
|
+
return [4 /*yield*/, this.ensureApprovalRulesTask.run(options)];
|
|
108
105
|
case 5:
|
|
109
106
|
cont = _a.sent();
|
|
110
107
|
if (!cont)
|
|
111
108
|
return [2 /*return*/, false];
|
|
112
|
-
return [4 /*yield*/, this.
|
|
109
|
+
return [4 /*yield*/, this.createBranchTask.run(options)];
|
|
113
110
|
case 6:
|
|
114
111
|
cont = _a.sent();
|
|
115
112
|
if (!cont)
|
|
116
113
|
return [2 /*return*/, false];
|
|
117
|
-
return [4 /*yield*/, this.
|
|
114
|
+
return [4 /*yield*/, this.bumpVersionTxtTask.run(options)];
|
|
118
115
|
case 7:
|
|
116
|
+
cont = _a.sent();
|
|
117
|
+
if (!cont)
|
|
118
|
+
return [2 /*return*/, false];
|
|
119
|
+
return [4 /*yield*/, this.createMergeRequestTask.run(options)];
|
|
120
|
+
case 8:
|
|
119
121
|
cont = _a.sent();
|
|
120
122
|
if (!cont)
|
|
121
123
|
return [2 /*return*/, false];
|
|
122
124
|
if (!options.triggerMonorepoBuild)
|
|
123
125
|
return [2 /*return*/, true];
|
|
124
126
|
return [4 /*yield*/, this.startMonorepoBuildTask.run(options)];
|
|
125
|
-
case
|
|
127
|
+
case 9: return [2 /*return*/, _a.sent()];
|
|
126
128
|
}
|
|
127
129
|
});
|
|
128
130
|
});
|
|
@@ -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
|
];
|
|
@@ -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;
|
|
@@ -56,138 +56,81 @@ 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
|
|
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,
|
|
68
|
-
return __generator(this, function (
|
|
69
|
-
switch (
|
|
65
|
+
var projects, deployDependenciesTasks, beforeReleaseTasks, afterReleaseTasks, sqlSections, _i, projects_1, project, branchName, mergeRequest, deployDependencies, beforeTasks, afterTasks, beforeSQL, afterSQL, milestoneLabel, taskSummary, sqlMessage;
|
|
66
|
+
return __generator(this, function (_a) {
|
|
67
|
+
switch (_a.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 =
|
|
72
|
+
projects = _a.sent();
|
|
75
73
|
deployDependenciesTasks = [];
|
|
76
74
|
beforeReleaseTasks = [];
|
|
77
75
|
afterReleaseTasks = [];
|
|
78
76
|
sqlSections = [];
|
|
79
77
|
_i = 0, projects_1 = projects;
|
|
80
|
-
|
|
78
|
+
_a.label = 2;
|
|
81
79
|
case 2:
|
|
82
|
-
if (!(_i < projects_1.length)) return [3 /*break*/,
|
|
80
|
+
if (!(_i < projects_1.length)) return [3 /*break*/, 6];
|
|
83
81
|
project = projects_1[_i];
|
|
84
82
|
return [4 /*yield*/, this.service.getNextBranchInfo(project.id, options.version)];
|
|
85
83
|
case 3:
|
|
86
|
-
branchName = (
|
|
84
|
+
branchName = (_a.sent()).branchName;
|
|
87
85
|
return [4 /*yield*/, this.service.getMergeRequest(project.id, branchName)];
|
|
88
86
|
case 4:
|
|
89
|
-
mergeRequest =
|
|
87
|
+
mergeRequest = _a.sent();
|
|
90
88
|
if (!mergeRequest)
|
|
91
|
-
|
|
92
|
-
return [4 /*yield*/, this.trelloService.getMember(mergeRequest.url)];
|
|
93
|
-
case 5:
|
|
94
|
-
owner = (_a = _f.sent()) !== null && _a !== void 0 ? _a : 'Unknown';
|
|
89
|
+
throw new Error("No release MR found for project ".concat(project.title, " on branch ").concat(branchName));
|
|
95
90
|
deployDependencies = utils_1.Descriptions.getDescriptionSection('Dependencies', mergeRequest);
|
|
96
|
-
beforeTasks = utils_1.Descriptions.
|
|
97
|
-
afterTasks = utils_1.Descriptions.
|
|
98
|
-
beforeSQL = utils_1.Descriptions.
|
|
99
|
-
afterSQL = utils_1.Descriptions.
|
|
100
|
-
if (deployDependencies)
|
|
101
|
-
deployDependenciesTasks.push({
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
if (
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
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:
|
|
91
|
+
beforeTasks = utils_1.Descriptions.getDescriptionSection('BeforeRelease', mergeRequest, 'Tasks');
|
|
92
|
+
afterTasks = utils_1.Descriptions.getDescriptionSection('AfterRelease', mergeRequest, 'Tasks');
|
|
93
|
+
beforeSQL = utils_1.Descriptions.getDescriptionSection('BeforeRelease', mergeRequest, 'SQL');
|
|
94
|
+
afterSQL = utils_1.Descriptions.getDescriptionSection('AfterRelease', mergeRequest, 'SQL');
|
|
95
|
+
if (deployDependencies)
|
|
96
|
+
deployDependenciesTasks.push({ project: project.title, mr: mergeRequest.title, content: deployDependencies });
|
|
97
|
+
if (beforeTasks)
|
|
98
|
+
beforeReleaseTasks.push({ project: project.title, mr: mergeRequest.title, content: beforeTasks });
|
|
99
|
+
if (afterTasks)
|
|
100
|
+
afterReleaseTasks.push({ project: project.title, mr: mergeRequest.title, content: afterTasks });
|
|
101
|
+
if (beforeSQL)
|
|
102
|
+
sqlSections.push({ project: project.title, mr: mergeRequest.title, content: beforeSQL, phase: 'BeforeRelease' });
|
|
103
|
+
if (afterSQL)
|
|
104
|
+
sqlSections.push({ project: project.title, mr: mergeRequest.title, content: afterSQL, phase: 'AfterRelease' });
|
|
105
|
+
_a.label = 5;
|
|
106
|
+
case 5:
|
|
144
107
|
_i++;
|
|
145
108
|
return [3 /*break*/, 2];
|
|
146
|
-
case
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
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];
|
|
109
|
+
case 6:
|
|
110
|
+
this.logSection('====== ALL DEPLOY DEPENDENCIES ======', deployDependenciesTasks);
|
|
111
|
+
this.logSection('====== ALL BEFORE RELEASE TASKS ======', beforeReleaseTasks);
|
|
112
|
+
this.logSection('====== ALL AFTER RELEASE TASKS ======', afterReleaseTasks);
|
|
113
|
+
this.logSection('====== ALL SQL CHANGES (with context) ======', sqlSections, function (item) { return item.phase === 'BeforeRelease' ? 'Before Release' : 'After Release'; });
|
|
114
|
+
if (!options.slackNotifier) return [3 /*break*/, 10];
|
|
173
115
|
milestoneLabel = "".concat(options.milestone, " Release");
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
if (!taskSummary) return [3 /*break*/,
|
|
116
|
+
taskSummary = [
|
|
117
|
+
this.formatSection('Deploy Dependencies', deployDependenciesTasks),
|
|
118
|
+
this.formatSection('Before Release Tasks', beforeReleaseTasks),
|
|
119
|
+
this.formatSection('After Release Tasks', afterReleaseTasks)
|
|
120
|
+
].filter(Boolean).join('\n');
|
|
121
|
+
if (!taskSummary) return [3 /*break*/, 8];
|
|
180
122
|
return [4 /*yield*/, this.slackService.sendSlackStatusMessage({
|
|
181
123
|
emailList: [],
|
|
182
124
|
threadLabel: "".concat(milestoneLabel, " Tasks & Dependencies"),
|
|
183
125
|
statusMessage: taskSummary,
|
|
184
126
|
statusCleanMessage: 'No Before/After Release Tasks found!'
|
|
185
127
|
})];
|
|
128
|
+
case 7:
|
|
129
|
+
_a.sent();
|
|
130
|
+
_a.label = 8;
|
|
186
131
|
case 8:
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
case 9:
|
|
190
|
-
if (!sqlMessage) return [3 /*break*/, 11];
|
|
132
|
+
sqlMessage = this.formatSection('SQL Changes', sqlSections, function (item) { return item.phase === 'BeforeRelease' ? 'Before Release' : 'After Release'; });
|
|
133
|
+
if (!sqlMessage) return [3 /*break*/, 10];
|
|
191
134
|
return [4 /*yield*/, this.slackService.sendSlackStatusMessage({
|
|
192
135
|
emailList: [],
|
|
193
136
|
threadLabel: "".concat(milestoneLabel, " SQL"),
|
|
@@ -195,35 +138,31 @@ var CheckReleaseReadyTask = /** @class */ (function () {
|
|
|
195
138
|
statusCleanMessage: 'No SQL changes found in release!',
|
|
196
139
|
sendAsFile: true
|
|
197
140
|
})];
|
|
198
|
-
case
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
case
|
|
141
|
+
case 9:
|
|
142
|
+
_a.sent();
|
|
143
|
+
_a.label = 10;
|
|
144
|
+
case 10: return [2 /*return*/, true];
|
|
202
145
|
}
|
|
203
146
|
});
|
|
204
147
|
});
|
|
205
148
|
};
|
|
206
|
-
CheckReleaseReadyTask.prototype.
|
|
207
|
-
|
|
208
|
-
return 'No tasks found!';
|
|
209
|
-
var output = "## ".concat(title, "\n\n");
|
|
149
|
+
CheckReleaseReadyTask.prototype.logSection = function (header, items, getPhaseLabel) {
|
|
150
|
+
Logger_1.Logger.logInfo(header);
|
|
210
151
|
for (var _i = 0, items_1 = items; _i < items_1.length; _i++) {
|
|
211
152
|
var item = items_1[_i];
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
153
|
+
var phase = getPhaseLabel ? " (".concat(getPhaseLabel(item), ")") : '';
|
|
154
|
+
Logger_1.Logger.logMessage("\uD83D\uDD39 ".concat(item.project, " | ").concat(item.mr).concat(phase));
|
|
155
|
+
Logger_1.Logger.logMessage(item.content);
|
|
215
156
|
}
|
|
216
|
-
return output;
|
|
217
157
|
};
|
|
218
|
-
CheckReleaseReadyTask.prototype.
|
|
158
|
+
CheckReleaseReadyTask.prototype.formatSection = function (title, items, getPhaseLabel) {
|
|
219
159
|
if (items.length === 0)
|
|
220
|
-
return '
|
|
221
|
-
var output = "##
|
|
160
|
+
return '';
|
|
161
|
+
var output = "## ".concat(title, "\n\n");
|
|
222
162
|
for (var _i = 0, items_2 = items; _i < items_2.length; _i++) {
|
|
223
163
|
var item = items_2[_i];
|
|
224
|
-
var
|
|
225
|
-
output += "### ".concat(item.project, " \u2013 ").concat(item.mr
|
|
226
|
-
output += "**Owner:** ".concat(item.owner, "\n\n");
|
|
164
|
+
var phase = getPhaseLabel ? " (".concat(getPhaseLabel(item), ")") : '';
|
|
165
|
+
output += "### ".concat(item.project, " \u2013 ").concat(item.mr).concat(phase, "\n");
|
|
227
166
|
output += "".concat(item.content.trim(), "\n");
|
|
228
167
|
}
|
|
229
168
|
return output;
|
|
@@ -232,10 +171,8 @@ var CheckReleaseReadyTask = /** @class */ (function () {
|
|
|
232
171
|
(0, inversify_1.injectable)(),
|
|
233
172
|
__param(0, (0, inversify_1.inject)(types_1.SERVICES.GitLabService)),
|
|
234
173
|
__param(1, (0, inversify_1.inject)(types_1.SERVICES.SlackService)),
|
|
235
|
-
__param(2, (0, inversify_1.inject)(types_1.SERVICES.TrelloService)),
|
|
236
174
|
__metadata("design:paramtypes", [services_1.GitLabService,
|
|
237
|
-
services_1.SlackService
|
|
238
|
-
services_1.TrelloService])
|
|
175
|
+
services_1.SlackService])
|
|
239
176
|
], CheckReleaseReadyTask);
|
|
240
177
|
return CheckReleaseReadyTask;
|
|
241
178
|
}());
|
|
@@ -0,0 +1,180 @@
|
|
|
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 (g && (g = 0, op[0] && (_ = 0)), _) 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
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
51
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
52
|
+
if (ar || !(i in from)) {
|
|
53
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
54
|
+
ar[i] = from[i];
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
58
|
+
};
|
|
59
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
60
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
61
|
+
};
|
|
62
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
63
|
+
exports.JiraTicketsStatusTask = void 0;
|
|
64
|
+
require("reflect-metadata");
|
|
65
|
+
var inversify_1 = require("inversify");
|
|
66
|
+
var lodash_1 = __importDefault(require("lodash"));
|
|
67
|
+
var services_1 = require("../services");
|
|
68
|
+
var utils_1 = require("../utils");
|
|
69
|
+
var types_1 = require("../types");
|
|
70
|
+
var IN_PROGRESS_STATUSES = [
|
|
71
|
+
'To Do', 'Re-Triage', 'Reopened', 'Decision Needed', 'Open',
|
|
72
|
+
'Backlog', 'On Hold', 'In Progress', 'Merge Requested', 'Linked'
|
|
73
|
+
];
|
|
74
|
+
var DEV_TESTING_STATUSES = __spreadArray(__spreadArray([], IN_PROGRESS_STATUSES, true), [
|
|
75
|
+
'Awaiting Testing'
|
|
76
|
+
], false);
|
|
77
|
+
var JiraTicketsStatusTask = /** @class */ (function () {
|
|
78
|
+
function JiraTicketsStatusTask(jiraService, slackService) {
|
|
79
|
+
this.jiraService = jiraService;
|
|
80
|
+
this.slackService = slackService;
|
|
81
|
+
}
|
|
82
|
+
JiraTicketsStatusTask.prototype.run = function (options) {
|
|
83
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
84
|
+
var milestone, slackNotifier, statusList, devTestingStatusList;
|
|
85
|
+
return __generator(this, function (_a) {
|
|
86
|
+
switch (_a.label) {
|
|
87
|
+
case 0:
|
|
88
|
+
utils_1.Logger.logTask('Fetching Jira ticket status');
|
|
89
|
+
milestone = options.milestone, slackNotifier = options.slackNotifier;
|
|
90
|
+
statusList = IN_PROGRESS_STATUSES.map(function (s) { return "\"".concat(s, "\""); }).join(', ');
|
|
91
|
+
devTestingStatusList = DEV_TESTING_STATUSES.map(function (s) { return "\"".concat(s, "\""); }).join(', ');
|
|
92
|
+
return [4 /*yield*/, this.processTicketGroup({
|
|
93
|
+
label: "".concat(milestone, " To Do and In Progress Tickets"),
|
|
94
|
+
cleanMessage: 'No outstanding tickets!',
|
|
95
|
+
jql: "\"Release\" = \"".concat(milestone, "\" AND status IN (").concat(statusList, ") ORDER BY assignee ASC"),
|
|
96
|
+
slackNotifier: slackNotifier
|
|
97
|
+
})];
|
|
98
|
+
case 1:
|
|
99
|
+
_a.sent();
|
|
100
|
+
return [4 /*yield*/, this.processTicketGroup({
|
|
101
|
+
label: "".concat(milestone, " No Requires Testing Tickets"),
|
|
102
|
+
cleanMessage: 'All tickets have testing status set!',
|
|
103
|
+
jql: "\"Release\" = \"".concat(milestone, "\" AND \"Requires Testing[Radio Buttons]\" = EMPTY ORDER BY assignee ASC"),
|
|
104
|
+
slackNotifier: slackNotifier
|
|
105
|
+
})];
|
|
106
|
+
case 2:
|
|
107
|
+
_a.sent();
|
|
108
|
+
return [4 /*yield*/, this.processTicketGroup({
|
|
109
|
+
label: "".concat(milestone, " Requires Dev Testing Tickets"),
|
|
110
|
+
cleanMessage: 'No dev testing tickets outstanding!',
|
|
111
|
+
jql: "\"Release\" = \"".concat(milestone, "\" AND \"Requires Testing[Radio Buttons]\" = \"Yes - Dev\" AND status IN (").concat(devTestingStatusList, ") ORDER BY assignee ASC"),
|
|
112
|
+
slackNotifier: slackNotifier
|
|
113
|
+
})];
|
|
114
|
+
case 3:
|
|
115
|
+
_a.sent();
|
|
116
|
+
return [2 /*return*/, true];
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
};
|
|
121
|
+
JiraTicketsStatusTask.prototype.processTicketGroup = function (options) {
|
|
122
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
123
|
+
var label, cleanMessage, jql, slackNotifier, issues, _a, message, emailList;
|
|
124
|
+
return __generator(this, function (_b) {
|
|
125
|
+
switch (_b.label) {
|
|
126
|
+
case 0:
|
|
127
|
+
label = options.label, cleanMessage = options.cleanMessage, jql = options.jql, slackNotifier = options.slackNotifier;
|
|
128
|
+
utils_1.Logger.logMessage("\n".concat(label));
|
|
129
|
+
return [4 /*yield*/, this.jiraService.searchIssues(jql)];
|
|
130
|
+
case 1:
|
|
131
|
+
issues = _b.sent();
|
|
132
|
+
_a = this.buildMessage(issues), message = _a.message, emailList = _a.emailList;
|
|
133
|
+
if (!issues.length) {
|
|
134
|
+
utils_1.Logger.logSuccess(cleanMessage);
|
|
135
|
+
}
|
|
136
|
+
if (!slackNotifier)
|
|
137
|
+
return [2 /*return*/];
|
|
138
|
+
return [4 /*yield*/, this.slackService.sendSlackStatusMessage({
|
|
139
|
+
emailList: emailList,
|
|
140
|
+
threadLabel: label,
|
|
141
|
+
statusMessage: message,
|
|
142
|
+
statusCleanMessage: cleanMessage
|
|
143
|
+
})];
|
|
144
|
+
case 2:
|
|
145
|
+
_b.sent();
|
|
146
|
+
return [2 /*return*/];
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
});
|
|
150
|
+
};
|
|
151
|
+
JiraTicketsStatusTask.prototype.buildMessage = function (issues) {
|
|
152
|
+
var grouped = lodash_1.default.groupBy(issues, function (issue) { var _a; return (_a = issue.assigneeDisplayName) !== null && _a !== void 0 ? _a : 'Unassigned'; });
|
|
153
|
+
var emailList = [];
|
|
154
|
+
var message = '';
|
|
155
|
+
for (var assignee in grouped) {
|
|
156
|
+
if (assignee !== 'Unassigned') {
|
|
157
|
+
var email = this.slackService.convertToEmailFormat(assignee);
|
|
158
|
+
if (email)
|
|
159
|
+
emailList.push(email);
|
|
160
|
+
}
|
|
161
|
+
utils_1.Logger.logMessage(assignee);
|
|
162
|
+
message += "".concat(assignee, ":\n");
|
|
163
|
+
for (var _i = 0, _a = grouped[assignee]; _i < _a.length; _i++) {
|
|
164
|
+
var issue = _a[_i];
|
|
165
|
+
utils_1.Logger.logMessage("- ".concat(issue.key, ": ").concat(issue.summary, " (").concat(issue.url, ")"));
|
|
166
|
+
message += "- ".concat(issue.key, ": ").concat(issue.summary, " (").concat(issue.url, ")\n");
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return { message: message, emailList: emailList };
|
|
170
|
+
};
|
|
171
|
+
JiraTicketsStatusTask = __decorate([
|
|
172
|
+
(0, inversify_1.injectable)(),
|
|
173
|
+
__param(0, (0, inversify_1.inject)(types_1.SERVICES.JiraService)),
|
|
174
|
+
__param(1, (0, inversify_1.inject)(types_1.SERVICES.SlackService)),
|
|
175
|
+
__metadata("design:paramtypes", [services_1.JiraService,
|
|
176
|
+
services_1.SlackService])
|
|
177
|
+
], JiraTicketsStatusTask);
|
|
178
|
+
return JiraTicketsStatusTask;
|
|
179
|
+
}());
|
|
180
|
+
exports.JiraTicketsStatusTask = JiraTicketsStatusTask;
|