diff --git a/.github/workflows/clean-main-images.yml b/.github/workflows/clean-main-images.yml index 20e1f21e..128b235c 100644 --- a/.github/workflows/clean-main-images.yml +++ b/.github/workflows/clean-main-images.yml @@ -6,9 +6,11 @@ on: workflow_dispatch: env: - REGISTRY: ghcr.io/openmcp-project + REGISTRY: ghcr.io + ORG: openmcp-project IMAGE_NAME: mcp-ui-frontend KEEP_X_IMAGES: 5 + TAG_PREFIX: 'main-' jobs: clean: @@ -16,12 +18,57 @@ jobs: runs-on: ubuntu-latest permissions: packages: write + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} steps: - - name: Delete old main branch images - uses: actions/delete-package-versions@e5bc658cc4c965c472efe991f8beea3981499c55 # v5 - with: - package-name: ${{ env.IMAGE_NAME }} - package-type: 'container' - min-versions-to-keep: ${{ env.KEEP_X_IMAGES }} - # Ignore any version that does NOT start with 'main-' - ignore-versions: '^(?!main-).*$' + - name: List all ${{ env.TAG_PREFIX }} tags and their version IDs (debug) + run: | + gh api -H "Accept: application/vnd.github+json" \ + /orgs/${{ env.ORG }}/packages/container/${{ env.IMAGE_NAME }}/versions \ + --paginate | jq -r '.[] | select(.metadata.container.tags[] | startswith("${{ env.TAG_PREFIX }}")) | "\(.id) \(.metadata.container.tags[])"' | grep '^.* ${{ env.TAG_PREFIX }}' | sort -k2 -r + + - name: Delete old ${{ env.TAG_PREFIX }}* tags using GitHub API, keep ${{ env.KEEP_X_IMAGES }} + run: | + set -e + set -o pipefail + + # Get all ${{ env.TAG_PREFIX }}* tags and their version IDs, sorted by tag (descending) + VERSIONS=$(gh api -H "Accept: application/vnd.github+json" \ + /orgs/${{ env.ORG }}/packages/container/${{ env.IMAGE_NAME }}/versions \ + --paginate | jq -r '.[] | select(.metadata.container.tags[] | startswith("${{ env.TAG_PREFIX }}")) | "\(.id) \(.metadata.container.tags[])"' | grep '^.* ${{ env.TAG_PREFIX }}' | sort -k2 -r) + + # Get the lines to delete (skip the first ${{ env.KEEP_X_IMAGES }} versions) + TO_DELETE=$(echo "$VERSIONS" | sed "1,${{ env.KEEP_X_IMAGES }}d") + + echo "Deleting the following tags:" + echo "$TO_DELETE" | awk '{print $2}' + + if [ -z "$TO_DELETE" ]; then + echo "No tags to delete." + exit 0 + fi + + FAILED_DELETIONS="" + while read -r line; do + id=$(echo "$line" | awk '{print $1}') + tag=$(echo "$line" | awk '{print $2}') + echo "Deleting tag $tag (version ID $id)" + if ! gh api -X DELETE -H "Accept: application/vnd.github+json" \ + /orgs/${{ env.ORG }}/packages/container/${{ env.IMAGE_NAME }}/versions/$id; then + echo "Failed to delete version $id ($tag)" + FAILED_DELETIONS="${FAILED_DELETIONS}\n$id ($tag)" + fi + echo "Failed to delete version $id ($tag)" + FAILED_DELETIONS="${FAILED_DELETIONS}\n$id ($tag)" + fi + done <<< "$TO_DELETE" + + if [ -n "$FAILED_DELETIONS" ]; then + echo -e "The following deletions failed:\n$FAILED_DELETIONS" + exit 1 + fi + - name: List remaining ${{ env.TAG_PREFIX }}* tags and their version IDs (debug) + run: | + gh api -H "Accept: application/vnd.github+json" \ + /orgs/${{ env.ORG }}/packages/container/${{ env.IMAGE_NAME }}/versions \ + --paginate | jq -r '.[] | select(.metadata.container.tags[] | startswith("${{ env.TAG_PREFIX }}")) | "\(.id) \(.metadata.container.tags[])"' | grep '^.* ${{ env.TAG_PREFIX }}' | sort -k2 -r