Gitlab - Suppression de jobs et d'artefacts de projet
The snippet can be accessed without any authentication.
Authored by
erwan.salmon
Suppression via API v2 des artefacts ou jobs d'un projet pour libérer de l'espace de stockage.
Syntaxe
$ gitlab-jobs-cleaner [ID_PROJET] (jobs)
Arguments :
- [ID_PROJET] : identifiant numérique du projet Gitlab (obligatoire)
- jobs : si le 2ème argument vaut 'jobs' alors les jobs seront supprimés, uniquement les artefacts sinon
Authentification : un jeton d'accès au projet d'autorisation suffisante doit être renseigné dans la variable d'environnement PRIVATE_TOKEN
(obligatoire)
#!/bin/bash
# Suppression d'artefacts ou de jobs Gitlab
#
# Ce script a été conçu pour libérer de l'espace de stockage sur un serveur Gitlanb en supprimant les jobs ou artéfacts d'un projet.
# AVERTISSEMENT : la suppression n'est pas sélective, tous les artefacts ou jobs seront supprimés".
#
# Ce script repose sur les API Rest V4 de Gitlab :
# - jobs : https://docs.gitlab.com/ee/api/jobs.html
# - artefacts : https://docs.gitlab.com/ee/api/job_artifacts.html
# - Statistiques de projet : https://docs.gitlab.com/ee/api/projects.html
# Cf. les descriptions de ces API pour interprétation des codes retounés
# Syntaxe du script
usage () {
echo "Usage : $0 [ID_PROJET] (jobs)"
echo " - [ID_PROJET] : identifiant numérique du projet Gitlab"
echo " - jobs : si 2ème argument='jobs' alors suppression des jobs, uniquement les artefacts sinon"
exit 10
}
# L'identifiant du projet est obligatoire
PROJECT_ID=$1 && [ -z "$PROJECT_ID" ] && usage
# Le jeton d'authentication doit être passé par variable d'environnment
[ -z "$PRIVATE_TOKEN" ] && echo "Variable PRIVATE_TOKEN absente" && exit 11
# Par défaut 100 résultats par pages (au max)
[ -z "$PER_PAGE" ] && PER_PAGE=100
# Par défaut Gitlab interne
[ -z "$GITLAB_URL" ] && GITLAB_URL=https://gitlab-forge.din.developpement-durable.gouv.fr
# Lire que supprimer : artefacts (par défaut) ou jobs (explicite)
ACTION=$2
# Calcul de la taille des artefacts
which jq 1>/dev/null 2>&1
if [ $? -eq 0 ]; then
arts_size=$(curl -s --header "PRIVATE-TOKEN: $PRIVATE_TOKEN" "$GITLAB_URL/api/v4/projects/$PROJECT_ID?statistics=true" \
| jq -r '.statistics.job_artifacts_size' | numfmt --to=iec --invalid=ignore)
fi
# Affichage des principaux paramètres
echo "Suppression des artefacts/jobs Gitlab"
echo "Serveur Gitlab : $GITLAB_URL"
echo "Projet : $PROJECT_ID"
echo "Taille des artefacts des jobs : ${arts_size:-Non déterminé}"
echo "Taille des blocs de traitement (pages) : $PER_PAGE"
echo "------------------------------------------------"
nump=$(curl -sI --header "PRIVATE-TOKEN: $PRIVATE_TOKEN" "$GITLAB_URL/api/v4/projects/$PROJECT_ID/jobs?per_page=100" \
| grep X-Total-Pages | grep -oe "[0-9]*")
echo "Nombre de pages : $nump"
# Annulation si pas de jobs, demande de confirmation sinon
[ -z "$nump" ] && echo "Aucun job trouvé, fin d'opérations" && exit 1
echo -n "Jobs trouvés, entre $((PER_PAGE*(nump-1))) et $((PER_PAGE*(nump))), confirmez vous la suppression (O/n) ?" && read
[ "$REPLY" != "O" ] && echo "Demande annulée" && exit 2
# Itération sur les jobs
for p in $(seq $nump); do
for jobid in $(curl -s --header "PRIVATE-TOKEN: $PRIVATE_TOKEN" "$GITLAB_URL/api/v4/projects/$PROJECT_ID/jobs?per_page=100&page=$p" \
| jq '.[].id'); do
if [ "$ACTION" = "jobs" ]; then
echo -n "Suppression du job $jobid : "
curl -sI --request POST --header "PRIVATE-TOKEN: $PRIVATE_TOKEN" "$GITLAB_URL/api/v4/projects/$PROJECT_ID/jobs/$jobid/erase" | head -1
else
echo -n "Suppression des artefacts du job $jobid : "
curl -sI --request DELETE --header "PRIVATE-TOKEN: $PRIVATE_TOKEN" "$GITLAB_URL/api/v4/projects/$PROJECT_ID/jobs/$jobid/artifacts" | head -1
fi
done
done
Please register or sign in to comment