-
Notifications
You must be signed in to change notification settings - Fork 5
100 lines (85 loc) · 3.23 KB
/
cleanup-prereleases.yml
File metadata and controls
100 lines (85 loc) · 3.23 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
name: Cleanup Pre-releases
on:
schedule:
# Run daily at 2 AM UTC
- cron: "0 2 * * *"
workflow_dispatch:
inputs:
keep_count:
description: "Number of pre-releases to keep"
required: false
default: "5"
type: string
dry_run:
description: "Dry run - only show what would be deleted"
required: false
default: "false"
type: boolean
permissions:
contents: write
jobs:
cleanup:
name: Cleanup Old Pre-releases
runs-on: ubuntu-latest
steps:
- name: Cleanup pre-releases
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v7
with:
script: |
const { owner, repo } = context.repo;
const keepCount = parseInt(context.payload.inputs?.keep_count || '5');
const dryRun = context.payload.inputs?.dry_run === 'true';
console.log(`Configuration: Keep ${keepCount} pre-releases, Dry run: ${dryRun}`);
// Get all releases
const releases = await github.rest.repos.listReleases({
owner,
repo,
per_page: 100
});
// Filter pre-releases with dev versions
const preReleases = releases.data
.filter(release => release.prerelease && release.tag_name.includes('-dev.'))
.sort((a, b) => new Date(b.created_at) - new Date(a.created_at));
// Keep the specified number of latest pre-releases
const toDelete = preReleases.slice(keepCount);
console.log(`Found ${preReleases.length} pre-releases, will delete ${toDelete.length}`);
if (toDelete.length === 0) {
console.log('No pre-releases to delete');
return;
}
// List releases to be deleted
console.log('\nPre-releases to delete:');
for (const release of toDelete) {
console.log(`- ${release.tag_name} (created: ${release.created_at})`);
}
if (dryRun) {
console.log('\nDry run mode - no deletions performed');
return;
}
// Delete old pre-releases
for (const release of toDelete) {
console.log(`\nDeleting pre-release: ${release.tag_name}`);
try {
// Delete the release
await github.rest.repos.deleteRelease({
owner,
repo,
release_id: release.id
});
console.log(`✓ Deleted release ${release.tag_name}`);
// Delete the tag
try {
await github.rest.git.deleteRef({
owner,
repo,
ref: `tags/${release.tag_name}`
});
console.log(`✓ Deleted tag ${release.tag_name}`);
} catch (error) {
console.log(`✗ Failed to delete tag ${release.tag_name}: ${error.message}`);
}
} catch (error) {
console.log(`✗ Failed to delete release ${release.tag_name}: ${error.message}`);
}
}
console.log('\nCleanup completed');