Cleanup Pre-releases #279
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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'); |