/ fastapi-template-users / .github / workflows / docker_clean.yml
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