Create release cleanup workflow

This commit is contained in:
tooomm 2026-04-26 16:34:18 +02:00
parent b1fe4c85d3
commit a46053de62

136
.github/workflows/release-cleanup.yml vendored Normal file
View file

@ -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();