Back to jobs

GitHub issue reminder

Trigger: eventTrigger

Sends a reminder message to a Slack channel if a GitHub issue is left open for 24 hours.

Integrations:

/src/githubIssueReminder

Dev Ops

1
import { TriggerClient } from "@trigger.dev/sdk";
2
import { Github, events } from "@trigger.dev/github";
3
import { Slack } from "@trigger.dev/slack";
4
5
const client = new TriggerClient({ id: "jobs-showcase" });
6
7
const github = new Github({ id: "github" });
8
const slack = new Slack({ id: "slack" });
9
10
// Sends a Slack message to a channel if a GitHub issue is left open for 24 hours
11
client.defineJob({
12
id: "github-new-issue-reminder",
13
name: "GitHub: new issue reminder",
14
version: "1.0.0",
15
trigger: github.triggers.repo({
16
event: events.onIssueOpened,
17
owner: "<your-org-name>",
18
repo: "<your-repo-name>",
19
}),
20
integrations: {
21
github,
22
slack,
23
},
24
run: async (payload, io, ctx) => {
25
const delayDuration =
26
ctx.environment.type === "DEVELOPMENT" ? 3 : 60 * 60 * 24;
27
await io.wait("wait 24 hours", delayDuration);
28
29
const issue = await io.github.getIssue("get issue", {
30
owner: payload.repository.owner.login,
31
repo: payload.repository.name,
32
issueNumber: payload.issue.number,
33
});
34
35
if (issue.updated_at === payload.issue.updated_at) {
36
const assigneeResult = await io.github.addIssueAssignees("add assignee", {
37
owner: payload.repository.owner.login,
38
repo: payload.repository.name,
39
issueNumber: payload.issue.number,
40
assignees: [payload.sender.login],
41
});
42
43
await io.slack.postMessage("send reminder", {
44
channel: process.env.SLACK_CHANNEL_ID!,
45
text: `Issue ${payload.issue.title} is still open. I've assigned it to ${payload.sender.login}.\n${issue.html_url}`,
46
});
47
}
48
},
49
});
50
51
// These lines can be removed if you don't want to use express
52
import { createExpressServer } from "@trigger.dev/express";
53
createExpressServer(client);