-
Notifications
You must be signed in to change notification settings - Fork 1
104 lines (91 loc) · 3.67 KB
/
Copy pathcleanup-packages.yml
File metadata and controls
104 lines (91 loc) · 3.67 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
# ============================================
# Cleanup Untagged Package Versions
# Removes ONLY untagged images (orphan digests)
# Keeps ALL versioned/tagged images
# Runs weekly on Sunday at 3 AM UTC
# ============================================
name: Cleanup Packages
on:
schedule:
# Run every Sunday at 3 AM UTC
- cron: '0 3 * * 0'
workflow_dispatch:
inputs:
dry_run:
description: 'Dry run (no deletion)'
required: false
default: false
type: boolean
env:
REGISTRY: ghcr.io
IMAGE_NAME: jigsawfr/aiometadata-docker
permissions:
packages: write
jobs:
cleanup:
name: Cleanup Untagged Images
runs-on: ubuntu-latest
steps:
# Delete ONLY untagged images (orphan digests/manifests)
- name: Delete untagged images
if: inputs.dry_run != true
uses: actions/delete-package-versions@v5
with:
package-name: aiometadata-docker
package-type: container
delete-only-untagged-versions: true
min-versions-to-keep: 0
- name: Get cleanup stats
id: stats
uses: actions/github-script@v7
with:
script: |
try {
// Get all package versions to count
const { data: versions } = await github.rest.packages.getAllPackageVersionsForPackageOwnedByUser({
package_type: 'container',
package_name: 'aiometadata-docker',
username: context.repo.owner,
per_page: 100
});
let taggedCount = 0;
let untaggedCount = 0;
const taggedVersions = [];
for (const version of versions) {
const tags = version.metadata?.container?.tags || [];
if (tags.length === 0) {
untaggedCount++;
} else {
taggedCount++;
taggedVersions.push(tags.join(', '));
}
}
console.log(`Total versions: ${versions.length}`);
console.log(`Tagged versions (kept): ${taggedCount}`);
console.log(`Untagged versions: ${untaggedCount}`);
console.log(`Tagged: ${taggedVersions.slice(0, 10).join(' | ')}...`);
core.setOutput('total', versions.length);
core.setOutput('tagged', taggedCount);
core.setOutput('untagged', untaggedCount);
} catch (error) {
console.log(`Error getting stats: ${error.message}`);
core.setOutput('total', 0);
core.setOutput('tagged', 0);
core.setOutput('untagged', 0);
}
- name: Summary
run: |
echo "## 🧹 Cleanup Summary" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "### Package Statistics" >> $GITHUB_STEP_SUMMARY
echo "- **Total versions**: ${{ steps.stats.outputs.total }}" >> $GITHUB_STEP_SUMMARY
echo "- **Tagged versions**: ${{ steps.stats.outputs.tagged }} ✅ (all kept)" >> $GITHUB_STEP_SUMMARY
echo "- **Untagged versions**: ${{ steps.stats.outputs.untagged }}" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "ℹ️ **Policy**: Only untagged/orphan digests are deleted. All versioned images are preserved indefinitely." >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
if [ "${{ inputs.dry_run }}" = "true" ]; then
echo "⚠️ **Dry run** - no versions were deleted." >> $GITHUB_STEP_SUMMARY
else
echo "✅ Cleanup completed!" >> $GITHUB_STEP_SUMMARY
fi