docker_clean.yml
1 name: Docker Clean 2 3 on: 4 # delete: 5 # schedule: 6 # - cron: "0 4 * * *" 7 workflow_dispatch: 8 9 env: 10 OWNER: "defelo" 11 NAME: "fastapi-template" 12 PLATFORMS: "linux/amd64 linux/arm/v7 linux/arm64/v8 linux/s390x linux/ppc64le" 13 14 jobs: 15 docker_clean: 16 name: Docker Clean 17 runs-on: ubuntu-latest 18 environment: docker-clean 19 concurrency: docker_clean 20 21 steps: 22 - name: Checkout 23 uses: actions/checkout@v3 24 with: 25 fetch-depth: 0 26 27 - name: Clean 28 env: 29 GITHUB_TOKEN: ${{ secrets.CR_PAT }} 30 OWNER: ${{ env.OWNER }} 31 NAME: ${{ env.NAME }} 32 PLATFORMS: ${{ env.PLATFORMS }} 33 run: | 34 set -ex 35 36 keep=() 37 add() { 38 keep+=("${1}") 39 for platform in ${PLATFORMS}; do 40 keep+=("${1}-${platform}") 41 done 42 } 43 44 add latest 45 add edge 46 47 for branch in $(git ls-remote --heads origin | cut -d/ -f3-); do 48 echo Found branch: $branch 49 add $branch 50 done 51 52 for tag in $(git tag); do 53 echo Found tag: $tag 54 add $tag 55 done 56 57 keep=$(printf '%s\n' "${keep[@]}" | tr / - | jq -R . | jq -cs .) 58 59 URL=/users/${OWNER}/packages/container/${NAME}/versions 60 page=1 61 versions=$(mktemp) 62 while true; do 63 gh api "${URL}?per_page=100&page=${page}" | jq -c '.[]' > page 64 if ! [[ -s page ]]; then break; fi 65 jq -c '.metadata.container.tags as $tags | select($tags-($tags-'"$keep"')==[])' page >> $versions 66 page=$((page+1)) 67 done 68 69 while read version; do 70 id=$(jq -r .id <<< "$version") 71 name=$(jq -r .name <<< "$version") 72 echo Pruning $id $name 73 curl -X DELETE -H "Authorization: Bearer $GITHUB_TOKEN" "https://api.github.com${URL}/${id}" 74 done < $versions 75 echo Pruned $(jq -rs length $versions) versions