Skip to content

Commit 595e6aa

Browse files
authored
Automatically assign milestones to dependency upgrade PRs (#2120)
This new GitHub Actions workflow assigns the first upcoming open milestone to pull requests labeled `dependencies`, if no milestone is already assigned.
1 parent 9d9839e commit 595e6aa

File tree

1 file changed

+61
-0
lines changed

1 file changed

+61
-0
lines changed
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
name: Assign milestone to dependency upgrade PR
2+
on:
3+
pull_request_target:
4+
types:
5+
- labeled
6+
permissions:
7+
contents: read
8+
jobs:
9+
assign-milestone:
10+
if: ${{ github.event.label.name == 'dependencies' && github.event.pull_request.milestone == null }}
11+
permissions:
12+
contents: read
13+
issues: write
14+
pull-requests: write
15+
runs-on: ubuntu-24.04
16+
steps:
17+
- name: Install Harden-Runner
18+
uses: step-security/harden-runner@a90bcbc6539c36a85cdfeb73f7e2f433735f215b # v2.15.0
19+
with:
20+
disable-sudo-and-containers: true
21+
egress-policy: block
22+
allowed-endpoints: >
23+
api.github.com:443
24+
- name: Assign first upcoming milestone
25+
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
26+
with:
27+
github-token: ${{ secrets.GITHUB_TOKEN }}
28+
script: |
29+
const milestones = (await github.rest.issues.listMilestones({
30+
owner: context.repo.owner,
31+
repo: context.repo.repo,
32+
state: 'open',
33+
per_page: 100,
34+
})).data;
35+
36+
if (milestones.length === 0) {
37+
core.warning('No open milestones found.');
38+
return;
39+
}
40+
41+
const parseVersion = (title) => title.split('.').map(Number);
42+
const compareVersions = (a, b) => {
43+
const va = parseVersion(a);
44+
const vb = parseVersion(b);
45+
for (let i = 0; i < Math.max(va.length, vb.length); i++) {
46+
const diff = (va[i] ?? 0) - (vb[i] ?? 0);
47+
if (diff !== 0) {
48+
return diff;
49+
}
50+
}
51+
return 0;
52+
};
53+
const milestone = milestones.reduce((a, b) => compareVersions(a.title, b.title) <= 0 ? a : b);
54+
core.info(`Assigning milestone "${milestone.title}" to PR #${context.issue.number}.`);
55+
56+
await github.rest.issues.update({
57+
owner: context.repo.owner,
58+
repo: context.repo.repo,
59+
issue_number: context.issue.number,
60+
milestone: milestone.number,
61+
});

0 commit comments

Comments
 (0)