Publié le: 2022-01-12

Supprimer d'anciens logs de jobs Gitlab CI

Gitlab stocke 1 fichier de log par job dans la CI/CD. Ceux-ci sont stockés sous forme de fichiers et considérés comme artefact du job.

Artefacts sur un système de fichiers

Sur un système de fichiers standard, une simple commande find suffit pour supprimer tous les logs plus anciens qu’un nombre de jours donnés:

find <gitlab-artifact-dir> -mtime +365 -name job.log -delete

Artefacts sur un S3-like

Ici c’est un poil plus complexe, pas de commande find, on va utiliser s3cmd et un peu de bash pour processer les fichiers.

L’extrait de code étant commenté je vous invite à le lire directement pour comprendre le processing :)

#! /bin/bash

# List only root folder for memory efficience
s3cmd -c .s3cfg ls s3://<bucket-name>/  | while read -r line; do

  # Retrieve folder name
  subFolder=$(echo "${line}" | awk '{print $2}')
  echo "Working on: ${subFolder}"

  # List all files in the folder
  s3cmd -c .s3cfg ls --recursive "${subFolder}" | while read -r lineS3File; do

    createDate=$(echo "${lineS3File}" | awk '{print $1" "$2}')
    createDate=$(date -d"${createDate}" +%s)
    olderThan=$(date -d"-365days" +%s)

    # Process only files older than 365 days
    if [[ $createDate -lt $olderThan ]]; then

      fileName=$(echo "${lineS3File}" | awk '{print $4}')

      # Retrieve file name from full path and ensure it's a job.log file
      if [[ "${fileName##*/}" == "job.log" ]]; then

        echo "Removing more than 1 year job.log file: $fileName"
        s3cmd -c .s3cfg rm "${fileName}" && echo "Removed."

      fi
    fi
  done
done