Suppression des artifacts des Github Actions

Suppression des artifacts des Github Actions

Les artifacts générés lors des intégrations continues de Github (les Actions configurables sur les dépôts) ne sont pas supprimés automatiquement après chaque exécution.

Cela peut occasionner un remplissage du quota de stockage des comptes gratuits (visible ici ).

Quota des Github Actions

Supprimer les artifacts manuellement

On peut supprimer les artifacts dans chaque exécution d’une Action.

Aller dans les Actions du dépôt, ouvrir chaque exécution. Les artifacts sont listés et peuvent être supprimés manuellement.

Suppression manuelle

Supprimer les artifacts à chaque exécution

Pour supprimer les artifacts générés après chaque exécution, j’ai ajouté à la fin de mon fichier de configuration, en dernier job, un appel au module geekyeggo/delete-artifact@v5 .

      - name: 🚮 Delete artifacts
        uses: geekyeggo/delete-artifact@v5
        with:
          name: release-artifact

En complément, même si cela semble inutile, j’ai ajouté un appel en tout premier job au module jimschubert/delete-artifacts-action@v1 , pour supprimer tous les artifacts du dépôt.

Cet ajout a peu d’intérêt, car en cas de dépassement du quota, le reset de la limite d’utilisation n’est effectué qu’au bout de quelques jours.

      - name: Artifact Cleanup
        uses: jimschubert/delete-artifacts-action@v1
        with:
          log_level: 'info'
          min_bytes: '0'

Supprimer tous les artifacts

Pour supprimer manuellement tous les artifacts d’un dépôt, j’ai utilisé ce script , qui fonctionne parfaitement (repris plus bas, pour archivage).

Pour pouvoir l’utiliser, il faut générer un Fine-grain token depuis les Developer Settings de votre compte Github.

Le token généré doit avoir les accès read/write sur la permission Actions.

Suppression manuelle

Le script doit ensuite être modifié pour indiquer :

  • REPO : changer OWNER/REPO par les valeurs issues de l’URL du dépôt (par exemple, https://github.com/**jimschubert/delete-artifacts-action**)
  • GITHUB_USER : username Github
  • GITHUB_TOKEN : token généré sur le compte Github.com

A l’exécution, le script affichera les id des artifacts supprimés. J’ai dû lancer plusieurs fois le script, pour qu’il supprime tout. Dans tous les cas, il skip les 5 derniers artifacts.

Ce script utilise l’API REST de Github, qui est plutôt bien faite et bien documentée.

#!/usr/bin/env bash

# Customize those three lines with your repository and credentials:
REPO=https://api.github.com/repos/OWNER/REPO
GITHUB_USER=your-github-user-name
GITHUB_TOKEN=token-with-workflow-rights-on-repo

# Number of most recent versions to keep for each artifact:
KEEP=5

# A shortcut to call GitHub API.
ghapi() { curl --silent --location --user $GITHUB_USER:$GITHUB_TOKEN "$@"; }

# A temporary file which receives HTTP response headers.
TMPFILE=/tmp/tmp.$$

# An associative array, key: artifact name, value: number of artifacts of that name.
declare -A ARTCOUNT

# Process all artifacts on this repository, loop on returned "pages".
URL=$REPO/actions/artifacts
while [[ -n "$URL" ]]; do

    # Get current page, get response headers in a temporary file.
    JSON=$(ghapi --dump-header $TMPFILE "$URL")

    # Get URL of next page. Will be empty if we are at the last page.
    URL=$(grep '^Link:' "$TMPFILE" | tr ',' '\n' | grep 'rel="next"' | head -1 | sed -e 's/.*<//' -e 's/>.*//')
    rm -f $TMPFILE

    # Number of artifacts on this page:
    COUNT=$(( $(jq <<<$JSON -r '.artifacts | length') ))

    # Loop on all artifacts on this page.
    for ((i=0; $i < $COUNT; i++)); do

        # Get name of artifact and count instances of this name.
        name=$(jq <<<$JSON -r ".artifacts[$i].name?")
        ARTCOUNT[$name]=$(( $(( ${ARTCOUNT[$name]} )) + 1))
        #printf "#%d %s - %d\n" $i "$name" ${ARTCOUNT[$name]}
        # Check if we must delete this one.
        if [[ ${ARTCOUNT[$name]} -gt $KEEP ]]; then
            id=$(jq <<<$JSON -r ".artifacts[$i].id?")
            size=$(( $(jq <<<$JSON -r ".artifacts[$i].size_in_bytes?") ))
            printf "Deleting %s #%d, %d bytes\n" "$name" ${ARTCOUNT[$name]} $size
            ghapi -X DELETE $REPO/actions/artifacts/$id
        fi
    done
done
Last updated on