From a46053de621540e537468b0836b2e474eed33349 Mon Sep 17 00:00:00 2001 From: tooomm Date: Sun, 26 Apr 2026 16:34:18 +0200 Subject: [PATCH 1/2] Create release cleanup workflow --- .github/workflows/release-cleanup.yml | 136 ++++++++++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 .github/workflows/release-cleanup.yml diff --git a/.github/workflows/release-cleanup.yml b/.github/workflows/release-cleanup.yml new file mode 100644 index 000000000..83a0d6184 --- /dev/null +++ b/.github/workflows/release-cleanup.yml @@ -0,0 +1,136 @@ +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 and tags + + 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 deleteReleasesTags = 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 & related tags...'); + console.log(`${prereleases.length} pre-release(s) marked for deletion:`); + + let deletedReleasesCount = 0; + let deletedTagsCount = 0; + + for (const rel of [...prereleases].reverse()) { + + // Delete release + console.log(`Processing release: ${rel.name}`); + if (deleteReleasesTags) { + 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.`); + } + + // Delete tag + console.log(` Processing related tag: ${rel.tag_name}`); + if (deleteReleasesTags) { + try { + await github.rest.git.deleteRef({ + owner: context.repo.owner, + repo: context.repo.repo, + ref: `tags/${rel.tag_name}`, + }); + console.log(` Tag deleted.`); + deletedTagsCount++; + } catch (err) { + console.log(` Tag deletion failed: ${err.message}`); + } + } else { + console.log(` [DRY RUN] Tag would be deleted.`); + } + } + + console.log(); + console.log(`Total releases deleted: ${deletedReleasesCount}`); + console.log(`Total tags deleted: ${deletedTagsCount}`); + core.endGroup(); + + await core.summary + .addRaw (`${prereleases.length} pre-release(s) marked for deletion:`) + .addCodeBlock( + `Total releases deleted: ${deletedReleasesCount}\n` + + `Total tags deleted: ${deletedTagsCount}` + ) + .write(); From f14c2481be5cbbf05935af8e7a55ddf42c945885 Mon Sep 17 00:00:00 2001 From: tooomm Date: Sun, 3 May 2026 18:41:09 +0200 Subject: [PATCH 2/2] Do not delete tags --- .github/workflows/release-cleanup.yml | 36 +++++---------------------- 1 file changed, 6 insertions(+), 30 deletions(-) diff --git a/.github/workflows/release-cleanup.yml b/.github/workflows/release-cleanup.yml index 83a0d6184..5f39a559d 100644 --- a/.github/workflows/release-cleanup.yml +++ b/.github/workflows/release-cleanup.yml @@ -31,7 +31,7 @@ jobs: runs-on: ubuntu-slim permissions: - contents: write # required to delete releases and tags + contents: write # required to delete releases concurrency: group: cleanup-beta-releases @ ${{ github.ref_name }} @@ -53,7 +53,7 @@ jobs: uses: actions/github-script@v9 with: script: | - const deleteReleasesTags = process.env.DRY_RUN === 'false'; + const deleteReleases = process.env.DRY_RUN === 'false'; core.startGroup('Fetching all releases...'); const releases = await github.paginate( @@ -77,17 +77,15 @@ jobs: prereleases.forEach(r => console.log(`${r.published_at.split('T')[0]}: ${r.tag_name}`)); core.endGroup(); - core.startGroup('Deleting pre-releases & related tags...'); + core.startGroup('Deleting pre-releases...'); console.log(`${prereleases.length} pre-release(s) marked for deletion:`); let deletedReleasesCount = 0; - let deletedTagsCount = 0; for (const rel of [...prereleases].reverse()) { - // Delete release console.log(`Processing release: ${rel.name}`); - if (deleteReleasesTags) { + if (deleteReleases) { try { await github.rest.repos.deleteRelease({ owner: context.repo.owner, @@ -102,35 +100,13 @@ jobs: } else { console.log(` [DRY RUN] Release would be deleted.`); } - - // Delete tag - console.log(` Processing related tag: ${rel.tag_name}`); - if (deleteReleasesTags) { - try { - await github.rest.git.deleteRef({ - owner: context.repo.owner, - repo: context.repo.repo, - ref: `tags/${rel.tag_name}`, - }); - console.log(` Tag deleted.`); - deletedTagsCount++; - } catch (err) { - console.log(` Tag deletion failed: ${err.message}`); - } - } else { - console.log(` [DRY RUN] Tag would be deleted.`); - } } console.log(); console.log(`Total releases deleted: ${deletedReleasesCount}`); - console.log(`Total tags deleted: ${deletedTagsCount}`); core.endGroup(); await core.summary - .addRaw (`${prereleases.length} pre-release(s) marked for deletion:`) - .addCodeBlock( - `Total releases deleted: ${deletedReleasesCount}\n` + - `Total tags deleted: ${deletedTagsCount}` - ) + .addRaw(`${prereleases.length} pre-release(s) marked for deletion:`) + .addCodeBlock(`Total releases deleted: ${deletedReleasesCount}`) .write();