diff --git a/.github/workflows/release-cleanup.yml b/.github/workflows/release-cleanup.yml deleted file mode 100644 index 5f39a559d..000000000 --- a/.github/workflows/release-cleanup.yml +++ /dev/null @@ -1,112 +0,0 @@ -name: Cleanup Beta Releases - -on: - release: - types: [released] # triggers only on published stable releases - pull_request: - branches: - - master - paths: - - '.github/workflows/release-cleanup.yml' - workflow_dispatch: - inputs: - dry_run: - description: "Run in dry mode" - required: true - type: choice - options: - - true - - false - default: 'true' - -jobs: - Deletion: - if: > - github.repository_owner == 'Cockatrice' && - ( - (github.event_name == 'release' && github.event.release.target_commitish == 'master') || - (github.event_name == 'pull_request') || - (github.event_name == 'workflow_dispatch' && startsWith(github.ref, 'refs/tags/')) - ) - runs-on: ubuntu-slim - - permissions: - contents: write # required to delete releases - - concurrency: - group: cleanup-beta-releases @ ${{ github.ref_name }} - cancel-in-progress: false - - env: - DRY_RUN: ${{ inputs.dry_run || 'true' }} - - steps: - - name: Print release information - run: | - echo "Release Tag: ${{ github.event.release.tag_name }}" - echo "Release Name: ${{ github.event.release.name }}" - echo "Target Branch: ${{ github.event.release.target_commitish }}${{ github.base_ref }}" - echo "" - echo "Dry Run: ${{ env.DRY_RUN }}" - - - name: Delete pre-releases - uses: actions/github-script@v9 - with: - script: | - const deleteReleases = process.env.DRY_RUN === 'false'; - - core.startGroup('Fetching all releases...'); - const releases = await github.paginate( - github.rest.repos.listReleases, - { - owner: context.repo.owner, - repo: context.repo.repo, - } - ); - - console.log(`Fetched ${releases.length} release(s):`); - releases.forEach(r => console.log(r.prerelease ? `${r.tag_name}` : `${r.tag_name} (${r.name})`)); - core.endGroup(); - - core.startGroup('Filtering for published pre-releases...'); - const prereleases = releases - .filter(r => r.published_at && r.prerelease && r.tag_name.includes('-beta')) - .sort((a, b) => new Date(b.published_at) - new Date(a.published_at)); - - console.log(`Filtered ${prereleases.length} pre-release(s):`); - prereleases.forEach(r => console.log(`${r.published_at.split('T')[0]}: ${r.tag_name}`)); - core.endGroup(); - - core.startGroup('Deleting pre-releases...'); - console.log(`${prereleases.length} pre-release(s) marked for deletion:`); - - let deletedReleasesCount = 0; - - for (const rel of [...prereleases].reverse()) { - - console.log(`Processing release: ${rel.name}`); - if (deleteReleases) { - try { - await github.rest.repos.deleteRelease({ - owner: context.repo.owner, - repo: context.repo.repo, - release_id: rel.id, - }); - console.log(` Release deleted.`); - deletedReleasesCount++; - } catch (err) { - console.log(` Release deletion failed: ${err.message}`); - } - } else { - console.log(` [DRY RUN] Release would be deleted.`); - } - } - - console.log(); - console.log(`Total releases deleted: ${deletedReleasesCount}`); - core.endGroup(); - - await core.summary - .addRaw(`${prereleases.length} pre-release(s) marked for deletion:`) - .addCodeBlock(`Total releases deleted: ${deletedReleasesCount}`) - .write(); diff --git a/.github/workflows/releases-cleanup.yml b/.github/workflows/releases-cleanup.yml new file mode 100644 index 000000000..01aec9e70 --- /dev/null +++ b/.github/workflows/releases-cleanup.yml @@ -0,0 +1,112 @@ +name: Delete Beta Releases + +on: + release: + types: [published] + +jobs: + cleanup: + if: ${{ github.event.release.prerelease == false && github.event.release.target_commitish == 'master' }} + runs-on: ubuntu-slim + + permissions: + contents: write # required to delete releases and tags + + env: + DELETE_RELEASES: false + DELETE_TAGS: false + KEEP_COUNT: 2 # number of newest pre-releases/tags to keep + + steps: + - name: Print release info + run: | + echo "Workflow triggered by" + echo "Release tag: ${{ github.event.release.tag_name }}" + echo "Release name: ${{ github.event.release.name }}" + echo "Target branch: ${{ github.event.release.target_commitish }}" + + - name: Delete old pre-releases + uses: actions/github-script@v9 + with: + script: | + const core = require('@actions/core'); + + const deleteReleases = process.env.DELETE_RELEASES === 'true'; + const deleteTags = process.env.DELETE_TAGS === 'true'; + const keep = parseInt(process.env.KEEP_COUNT, 10); + + core.startGroup('Fetch all releases'); + const releases = await github.paginate( + github.rest.repos.listReleases, + { + owner: context.repo.owner, + repo: context.repo.repo, + } + ); + + console.log(`Fetched ${releases.length} release(s):`); + releases.forEach(r => console.log(`${r.tag_name} (prerelease: ${r.prerelease}, published at: ${r.published_at})`)); + core.endGroup(); + + core.startGroup('Filter pre-releases'); + const prereleases = releases + .filter(r => r.prerelease && r.tag_name.toLowerCase().includes('-beta'))) + .sort((a, b) => new Date(b.published_at) - new Date(a.published_at)); + + console.log(`Found ${prereleases.length} pre-release(s):`); + prereleases.forEach(r => console.log(`Pre-release: ${r.tag_name}, published at ${r.published_at}`)); + core.endGroup(); + + core.startGroup('Delete pre-releases and tags'); + // Determine releases to delete (keep newest N pre-releases) + const toDelete = prereleases.slice(keep); + + if (toDelete.length === 0) { + console.log('No releases marked for deletion.'); + return; + } + + let deletedReleasesCount = 0; + let deletedTagsCount = 0; + + for (const rel of toDelete) { + console.log(`Processing pre-release: ${rel.tag_name}`); + + // Delete release + if (deleteReleases) { + try { + await github.rest.repos.deleteRelease({ + owner: context.repo.owner, + repo: context.repo.repo, + release_id: rel.id, + }); + console.log(`Deleted release: ${rel.tag_name}`); + deletedReleasesCount++; + } catch (err) { + console.log(`Failed to delete release ${rel.tag_name}: ${err.message}`); + } + } else { + console.log(`[DRY RUN] Would delete release: ${rel.tag_name}`); + } + + // Delete tag + if (deleteTags) { + try { + await github.rest.git.deleteRef({ + owner: context.repo.owner, + repo: context.repo.repo, + ref: `tags/${rel.tag_name}`, + }); + console.log(`Deleted tag: ${rel.tag_name}`); + deletedTagsCount++; + } catch (err) { + console.log(`Tag deletion failed or not found: ${rel.tag_name}`); + } + } else { + console.log(`[DRY RUN] Would delete tag: ${rel.tag_name}`); + } + } + + console.log(`Total releases deleted: ${deletedReleasesCount}`); + console.log(`Total tags deleted: ${deletedTagsCount}`); + core.endGroup();