Skip to content

Commit 532c098

Browse files
committed
feat: add dedicated pre-release cleanup workflow
- Create scheduled workflow to clean up old pre-releases (runs daily at 2 AM UTC) - Add manual workflow_dispatch with configurable keep count and dry-run mode - Remove duplicate cleanup job from CI workflow - Improve logging and error handling for cleanup process
1 parent 7dee5d1 commit 532c098

2 files changed

Lines changed: 100 additions & 53 deletions

File tree

.github/workflows/ci.yml

Lines changed: 0 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -232,59 +232,6 @@ jobs:
232232
233233
Download the appropriate archive for your platform and extract the provider binary.
234234
235-
cleanup-prereleases:
236-
name: Cleanup Old Pre-releases
237-
runs-on: ubuntu-latest
238-
needs: [pre-release]
239-
if: github.ref == 'refs/heads/main' && github.event_name != 'pull_request' && github.actor != 'dependabot[bot]'
240-
permissions:
241-
contents: write
242-
steps:
243-
- name: Cleanup old pre-releases
244-
uses: actions/github-script@v7
245-
with:
246-
script: |
247-
const { owner, repo } = context.repo;
248-
249-
// Get all releases
250-
const releases = await github.rest.repos.listReleases({
251-
owner,
252-
repo,
253-
per_page: 100
254-
});
255-
256-
// Filter pre-releases with dev versions
257-
const preReleases = releases.data
258-
.filter(release => release.prerelease && release.tag_name.includes('-dev.'))
259-
.sort((a, b) => new Date(b.created_at) - new Date(a.created_at));
260-
261-
// Keep the latest 5 pre-releases
262-
const toDelete = preReleases.slice(5);
263-
264-
console.log(`Found ${preReleases.length} pre-releases, will delete ${toDelete.length}`);
265-
266-
// Delete old pre-releases
267-
for (const release of toDelete) {
268-
console.log(`Deleting pre-release: ${release.tag_name}`);
269-
270-
// Delete the release
271-
await github.rest.repos.deleteRelease({
272-
owner,
273-
repo,
274-
release_id: release.id
275-
});
276-
277-
// Delete the tag
278-
try {
279-
await github.rest.git.deleteRef({
280-
owner,
281-
repo,
282-
ref: `tags/${release.tag_name}`
283-
});
284-
} catch (error) {
285-
console.log(`Failed to delete tag ${release.tag_name}: ${error.message}`);
286-
}
287-
}
288235
289236
security-scan:
290237
name: Security Scan
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
name: Cleanup Pre-releases
2+
3+
on:
4+
schedule:
5+
# Run daily at 2 AM UTC
6+
- cron: "0 2 * * *"
7+
workflow_dispatch:
8+
inputs:
9+
keep_count:
10+
description: "Number of pre-releases to keep"
11+
required: false
12+
default: "5"
13+
type: string
14+
dry_run:
15+
description: "Dry run - only show what would be deleted"
16+
required: false
17+
default: "false"
18+
type: boolean
19+
20+
permissions:
21+
contents: write
22+
23+
jobs:
24+
cleanup:
25+
name: Cleanup Old Pre-releases
26+
runs-on: ubuntu-latest
27+
steps:
28+
- name: Cleanup pre-releases
29+
uses: actions/github-script@v7
30+
with:
31+
script: |
32+
const { owner, repo } = context.repo;
33+
const keepCount = parseInt(context.payload.inputs?.keep_count || '5');
34+
const dryRun = context.payload.inputs?.dry_run === 'true';
35+
36+
console.log(`Configuration: Keep ${keepCount} pre-releases, Dry run: ${dryRun}`);
37+
38+
// Get all releases
39+
const releases = await github.rest.repos.listReleases({
40+
owner,
41+
repo,
42+
per_page: 100
43+
});
44+
45+
// Filter pre-releases with dev versions
46+
const preReleases = releases.data
47+
.filter(release => release.prerelease && release.tag_name.includes('-dev.'))
48+
.sort((a, b) => new Date(b.created_at) - new Date(a.created_at));
49+
50+
// Keep the specified number of latest pre-releases
51+
const toDelete = preReleases.slice(keepCount);
52+
53+
console.log(`Found ${preReleases.length} pre-releases, will delete ${toDelete.length}`);
54+
55+
if (toDelete.length === 0) {
56+
console.log('No pre-releases to delete');
57+
return;
58+
}
59+
60+
// List releases to be deleted
61+
console.log('\nPre-releases to delete:');
62+
for (const release of toDelete) {
63+
console.log(`- ${release.tag_name} (created: ${release.created_at})`);
64+
}
65+
66+
if (dryRun) {
67+
console.log('\nDry run mode - no deletions performed');
68+
return;
69+
}
70+
71+
// Delete old pre-releases
72+
for (const release of toDelete) {
73+
console.log(`\nDeleting pre-release: ${release.tag_name}`);
74+
75+
try {
76+
// Delete the release
77+
await github.rest.repos.deleteRelease({
78+
owner,
79+
repo,
80+
release_id: release.id
81+
});
82+
console.log(`✓ Deleted release ${release.tag_name}`);
83+
84+
// Delete the tag
85+
try {
86+
await github.rest.git.deleteRef({
87+
owner,
88+
repo,
89+
ref: `tags/${release.tag_name}`
90+
});
91+
console.log(`✓ Deleted tag ${release.tag_name}`);
92+
} catch (error) {
93+
console.log(`✗ Failed to delete tag ${release.tag_name}: ${error.message}`);
94+
}
95+
} catch (error) {
96+
console.log(`✗ Failed to delete release ${release.tag_name}: ${error.message}`);
97+
}
98+
}
99+
100+
console.log('\nCleanup completed');

0 commit comments

Comments
 (0)