1+ name : Delete Old Releases
2+
3+ on :
4+ release :
5+ types : [created]
6+ workflow_dispatch :
7+
8+ jobs :
9+ delete-old-releases :
10+ runs-on : ubuntu-latest
11+ permissions :
12+ contents : write # Required to delete releases
13+
14+ steps :
15+ - name : Checkout repository
16+ uses : actions/checkout@v4
17+
18+ - name : Delete all but the most recent release
19+ uses : actions/github-script@v7
20+ with :
21+ script : |
22+ const { owner, repo } = context.repo;
23+
24+ // Get all releases
25+ const releases = await github.rest.repos.listReleases({
26+ owner,
27+ repo,
28+ per_page: 100, // Adjust as needed, max 100 per page
29+ });
30+
31+ if (releases.data.length <= 1) {
32+ console.log('Fewer than two releases found. No old releases to delete.');
33+ return;
34+ }
35+
36+ // Sort releases by creation date in descending order
37+ // The first element will be the most recent release
38+ const sortedReleases = releases.data.sort((a, b) => new Date(b.created_at) - new Date(a.created_at));
39+
40+ console.log(`Found ${sortedReleases.length} releases. The most recent release is: ${sortedReleases[0].tag_name}`);
41+
42+ // Iterate through releases starting from the second one (index 1)
43+ // and delete them. The first release (index 0) is the most recent and should be kept.
44+ for (let i = 1; i < sortedReleases.length; i++) {
45+ const releaseToDelete = sortedReleases[i];
46+ console.log(`Attempting to delete release: ${releaseToDelete.tag_name} (ID: ${releaseToDelete.id})`);
47+ try {
48+ await github.rest.repos.deleteRelease({
49+ owner,
50+ repo,
51+ release_id: releaseToDelete.id,
52+ });
53+ console.log(`Successfully deleted release: ${releaseToDelete.tag_name}`);
54+ } catch (error) {
55+ console.error(`Failed to delete release ${releaseToDelete.tag_name}: ${error.message}`);
56+ // Continue to try deleting other releases even if one fails
57+ }
58+ }
59+ console.log('Finished processing old releases.');
0 commit comments