mirror of
https://gitlab.com/openstapps/openstapps.git
synced 2026-01-04 20:42:52 +00:00
feat: add new task to remind about open merge requests
This commit is contained in:
105
src/tasks/remind.ts
Normal file
105
src/tasks/remind.ts
Normal file
@@ -0,0 +1,105 @@
|
||||
import {Api} from '@openstapps/gitlab-api';
|
||||
import {
|
||||
AccessLevel,
|
||||
MembershipScope,
|
||||
MergeRequestMergeStatus,
|
||||
MergeRequestState,
|
||||
Scope,
|
||||
User,
|
||||
} from '@openstapps/gitlab-api/lib/types';
|
||||
import {WebClient} from '@slack/client';
|
||||
import {asyncPool} from 'async-pool-native/dist/async-pool';
|
||||
import {logger} from '../common';
|
||||
import {GROUPS} from '../configuration';
|
||||
|
||||
export async function remind(api: Api): Promise<void> {
|
||||
// get list of open merge requests
|
||||
const mergeRequests = await api.getMergeRequests(MembershipScope.GROUPS, GROUPS[0], MergeRequestState.OPENED);
|
||||
|
||||
logger.info(`Found ${mergeRequests.length} open merge requests.`);
|
||||
|
||||
// instantiate slack client
|
||||
const client = new WebClient(process.env.SLACK_API_TOKEN);
|
||||
|
||||
// get members of main group
|
||||
const members = await api.getMembers(MembershipScope.GROUPS, GROUPS[0]);
|
||||
|
||||
// filter members with at least maintainer status
|
||||
const maintainers = members.filter((member) => member.access_level >= AccessLevel.Maintainer);
|
||||
|
||||
// extract maintainer's usernames
|
||||
const maintainerUsernames = maintainers.map((maintainer) => maintainer.username);
|
||||
|
||||
// sort maintainer's usernames alphabetically
|
||||
maintainerUsernames.sort((a, b) => {
|
||||
return a.localeCompare(b);
|
||||
});
|
||||
|
||||
logger.info(`Found ${maintainers.length} maintainer(s).`);
|
||||
|
||||
await asyncPool(2, mergeRequests, async (mergeRequest) => {
|
||||
// check if merge request is WIP
|
||||
if (mergeRequest.work_in_progress) {
|
||||
logger.info(`Merge request '${mergeRequest.title}' is WIP.`);
|
||||
return;
|
||||
}
|
||||
|
||||
// get merge request approval
|
||||
const approval = await api.getMergeRequestApproval(mergeRequest.project_id, mergeRequest.iid);
|
||||
|
||||
if (approval.merge_status === MergeRequestMergeStatus.CAN_BE_MERGED) {
|
||||
if (approval.approvals_left > 0) {
|
||||
logger.warn(`Merge request '${mergeRequest.title}' needs more approvals!`);
|
||||
|
||||
// get possible appropers, prefixed with '@' and joined with commas
|
||||
const possibleApprovers = maintainerUsernames
|
||||
.filter((username) => {
|
||||
if (approval.approved_by.length === 0) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return approval.approved_by.find((approver: { user: User }) => {
|
||||
return approver.user.username !== username;
|
||||
});
|
||||
})
|
||||
.map((username) => '@' + username)
|
||||
.join(', ');
|
||||
|
||||
// send message to slack
|
||||
await client.chat.postMessage({
|
||||
channel: 'C762UG76Z',
|
||||
text: `Merge request '${mergeRequest.title}' needs more approvals! See ${mergeRequest.web_url}!`,
|
||||
});
|
||||
|
||||
// create note in merge request
|
||||
await api.createNote(
|
||||
mergeRequest.project_id,
|
||||
Scope.MERGE_REQUESTS,
|
||||
mergeRequest.iid,
|
||||
`Please review, ${possibleApprovers}!`,
|
||||
);
|
||||
} else {
|
||||
logger.log(`Merge request '${mergeRequest.title}' is ready to be merged!`);
|
||||
|
||||
// send message to slack
|
||||
await client.chat.postMessage({
|
||||
channel: 'C762UG76Z',
|
||||
text: `Merge request '${mergeRequest.title}' is ready to be merged! See ${mergeRequest.web_url}!`,
|
||||
});
|
||||
|
||||
// prefix maintainers with '@' and join with commas
|
||||
const possibleMergers = maintainerUsernames
|
||||
.map((username) => '@' + username)
|
||||
.join(', ');
|
||||
|
||||
// create note in merge request
|
||||
await api.createNote(
|
||||
mergeRequest.project_id,
|
||||
Scope.MERGE_REQUESTS,
|
||||
mergeRequest.iid,
|
||||
`Merge request is ready to be merged, ${possibleMergers}!`,
|
||||
);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user