Skip to content

Commit 67a8b68

Browse files
authored
[ci] chore(workflow): add solved label and correct milestone to issue when PR is merged (#253)
1 parent fd74768 commit 67a8b68

1 file changed

Lines changed: 89 additions & 0 deletions

File tree

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
name: "Update linked issues on PR merge"
2+
3+
on:
4+
pull_request_target:
5+
types: [closed]
6+
7+
permissions:
8+
issues: write
9+
pull-requests: read
10+
11+
jobs:
12+
update-linked-issues:
13+
name: Add solved label and milestone
14+
if: github.event.pull_request.merged == true
15+
runs-on: ubuntu-latest
16+
steps:
17+
- name: Update linked issues with label and milestone
18+
uses: actions/github-script@v7
19+
with:
20+
github-token: ${{ secrets.GITHUB_TOKEN }}
21+
script: |
22+
const prNumber = context.payload.pull_request.number;
23+
24+
const query = `query($owner:String!, $repo:String!, $number:Int!) {
25+
repository(owner:$owner, name:$repo) {
26+
pullRequest(number:$number) {
27+
closingIssuesReferences(first:10) {
28+
nodes { number }
29+
}
30+
}
31+
}
32+
}`;
33+
34+
const variables = {
35+
owner: context.repo.owner,
36+
repo: context.repo.repo,
37+
number: prNumber,
38+
};
39+
40+
const result = await github.graphql(query, variables);
41+
const issues = result.repository.pullRequest.closingIssuesReferences.nodes;
42+
43+
// Fetch milestone numbers once
44+
const milestones = await github.rest.issues.listMilestones({
45+
owner: context.repo.owner,
46+
repo: context.repo.repo,
47+
state: "open",
48+
per_page: 100,
49+
});
50+
const milestonesMap = Object.fromEntries(
51+
milestones.data.map((m) => [m.title, m.number])
52+
);
53+
54+
for (const issue of issues) {
55+
core.info(`Adding "solved" label to issue #${issue.number}`);
56+
await github.rest.issues.addLabels({
57+
owner: context.repo.owner,
58+
repo: context.repo.repo,
59+
issue_number: issue.number,
60+
labels: ["solved"],
61+
});
62+
63+
// Fetch issue details to check labels
64+
const { data: issueData } = await github.rest.issues.get({
65+
owner: context.repo.owner,
66+
repo: context.repo.repo,
67+
issue_number: issue.number,
68+
});
69+
const labelNames = issueData.labels.map((l) => l.name);
70+
71+
let milestoneName = null;
72+
if (labelNames.includes("bug")) {
73+
milestoneName = "Bugs backlog";
74+
} else if (labelNames.includes("feature")) {
75+
milestoneName = "1. Now";
76+
}
77+
78+
if (milestoneName && milestonesMap[milestoneName]) {
79+
core.info(`Setting milestone "${milestoneName}" on issue #${issue.number}`);
80+
await github.rest.issues.update({
81+
owner: context.repo.owner,
82+
repo: context.repo.repo,
83+
issue_number: issue.number,
84+
milestone: milestonesMap[milestoneName],
85+
});
86+
} else if (milestoneName) {
87+
core.warning(`Milestone "${milestoneName}" not found in repo`);
88+
}
89+
}

0 commit comments

Comments
 (0)