Sur un projet Python l’année dernière, j’avais mis en place un pipeline Azure DevOps avec la logique de construire une image Docker d’une application web Python suivant la logique suivante :
- Lorsqu’une fonctionnalité était développée, je tirais une branche de
develop
et effectuais les développements. - Quand j’avais fini la fonctionnalité, je créais un PR (Pull Request ou Requête de tirage en Français) pour fusionner cette fonctionnalité dans
develop
. - Une fois la PR fusionnée, la politique de branche de
develop
déclenchait l’exécution du pipeline et la génération d’une image Docker taguéeready-qa
à déployer dans l’environnement de test dans Azure. - Après après tester l’application, je fusionnais
develop
versmain
, ce qui déclenchait un autre build et générait une nouvelle image Docker en lui assignant le taglatest
et$(buildId)
. Il s’agissait de l’image à déployer dans l’environnement de production sur Azure.
Cela a créé beaucoup d’images Docker car, en plus de ready-qa
ou latest
, la pipeline créait aussi un tag $(build_id)
pour chaque exécution sur la branche main
.
En conséquence, le Container Registry coûtait le plus cher dans l’ensemble des ressources fournies à Azure. Et la liste des images Docker s’accumulait de plus en plus.
Comment pouvais-je améliorer la situation en purgeant les images Docker anciennes et inutiles ?
Réflexion initiale
La première solution aurait consisté à mettre à niveau le Container Registry vers un registre premium afin de définir une politique de rétention.
Ce n’est pas ce que je voulais et je n’avais le budget pour.
Je savais que je voulais conserver tous les tags non numériques parce que je n’en avais qu’un seul de chaque.
Mais je pouvais supprimer toutes les images marquées numériquement, à l’exception des 10 dernières.
C’est alors que j’ai pensé à l’interface de commande Azure.
Le script
Je demande à Claude AI de m’aider.
Tout d’abord, je me suis demandé comment lister les tags numériques que je voulais :
|
|
Cela a bien fonctionné, mais comme j’avais des dizaines d’images à supprimer, j’ai voulu être efficace et automatiser un peu plus le processus.
Voici mes exigences :
- fournir le Container Registry comme entrée obligatoire.
- fournir une option pour exécuter en mode « dry run » le script.
A propos de 'dry run'
Cela signifie que le script est testé sans réellement exécuter les commandes, souvent pour vérifier les erreurs ou les résultats potentiels sans modifier le système.
- fournir la possibilité de configurer le nombre de balises numériques à conserver.
- ignorer la suppression des balises non numériques.
La première suggestion consistait à utiliser un script Python. Mais il fallait être connecté à Azure. Cela demandait plus de travail.
Cependant, je savais que je pouvais exécuter un script Bash dans la console CLI d’Azure, voici le script qui réalise cela :
|
|
L’IA a fait une erreur sur l’implémentation de --dry-run
lors de sa vérification. En Bash, vous vérifiez un booléen avec :
|
|
Au début, il m’a dit ce qui suit, ce qui ne correspondait pas une syntaxe Bash correcte :
|
|
Au-delà d’un script Bash
J’aimerais que cela fonctionne régulièrement sans que j’y pense. Le temps nécessaire pour construire cela vaut-il le coût ?
Le coût d’un registre de conteneurs Premium est-il plus élevé ?
Quelques semaines après ce script Bash initial, j’ai trouvé comment le faire. Je vous donne un indice : Runbook.
A suivre…
Suivez-moi !
Merci d’avoir lu cet article. Assurez-vous de me suivre sur X, de vous abonner à ma publication Substack et d’ajouter mon blog à vos favoris pour ne pas manquer les prochains articles.
Photo de Tom Fisk.