Skip to content

Cleanup Pre-releases #271

Cleanup Pre-releases

Cleanup Pre-releases #271

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@60a0d83039c74a4aee543508d2ffcb1c3799cdea # 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');