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 ).

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.

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-artifactEn 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.

Le script doit ensuite être modifié pour indiquer :
REPO: changerOWNER/REPOpar les valeurs issues de l’URL du dépôt (par exemple,https://github.com/**jimschubert/delete-artifacts-action**)GITHUB_USER: username GithubGITHUB_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