--- layout: post title: Automatiser la publication des artefacts date: 2023-04-17T07:45:22.402+02:00 status: draft sitemap: true category: developpement description: Nous avons précédémment défini un workflow de publication d'artefacts, maintenant on va chercher à l'automatiser un peu --- Cet article fait suite aux 3 articles précédents : - [Un registre statique Docker avec Garage](https://quentin.dufour.io/blog/2023-04-06/un-registre-statique-docker-avec-garage/) - [Construire et publier des conteneurs sans daemon Docker](https://quentin.dufour.io/blog/2023-04-11/fabriquer-des-conteneurs-l%C3%A9gers-depuis-une-ci-cd/) - [Spécifier un registre d'artefacts et l'intégrer dans un site web](https://quentin.dufour.io/blog/2023-04-12/un-outil-sans-daemon-pour-g%C3%A9rer-ses-artefacts-de-build/) Mainteant qu'on comprend mieux le problème, on aimerait définir un outil pour nous faciliter la vie à la publication. Il sera indépendant (standalone) mais développé au sein du dépôt albatros car il est prévu pour être utilisé de pair. Dans ce billet, son nom de code est `alba`. Commençons par les entrées de notre programme : un ensemble de fichiers qui doit être généré par nos outils Nix : ```bash # static nix build .#packages.x86_64-linux.albatros -o df/linux/amd64/albatros nix build .#packages.i686-linux.albatros -o df/linux/386/albatros nix build .#packages.aarch64-linux.albatros -o df/arm64/albatros nix build .#packages.armv6l-linux.albatros -o df/linux/arm/albatros # docker nix build .#packages.x86_64-linux.docker.albatros -o docker/linux.amd64.tar.gz nix build .#packages.armv6l-linux.docker.albatros -o docker/linux.arm.tar.gz nix build .#packages.aarch64-linux.docker.albatros -o docker/linux.arm64.tar.gz nix build .#packages.i686-linux.docker.albatros -o docker/linux.386.tar.gz ``` Et maintenant imaginons les commandes de base : ```bash alba static push -t albatros:0.9 publish/ 's3://download.deuxfleurs.org?endpoint=garage.deuxfleurs.fr®ion=garage' alba container push -t albatros:0.9 publish/ 's3://registry.deuxfleurs.org?endpoint=garage.deuxfleurs.fr®ion=garage' alba docker push publish/ docker.io/dxflrs/albatros:0.9 ``` On pourra imaginer d'avantage de commandes par la suite comme : ```bash alba static ls -t albatros 's3://download.deuxfleurs.org?endpoint=garage.deuxfleurs.fr®ion=garage' alba static rm -t albatros:0.8 's3://download.deuxfleurs.org?endpoint=garage.deuxfleurs.fr®ion=garage' alba static gc -t albatros --keep 10 's3://download.deuxfleurs.org?endpoint=garage.deuxfleurs.fr®ion=garage' ``` Mais c'est en dehors du périmètre pour le moment ! ## La glue J'ai choisi d'utiliser un petit panel de bibliothèques pour faire la glue entre tout ça : - Go CDK pour la publication des artefacts sur un object storage - crane pour la publication d'images OCI sur un registre compatible - Cobra comme framework CLI - skopeo comme bibliothèque de manipulation des conteneurs ## Publier un binaire statique sur Garage Après implémentation, voici la trace de la commande : ``` $ ./alba static push -t albatros:0.9 df/ 's3://download.deuxfleurs.org?endpoint=garage.deuxfleurs.fr&s3ForcePathStyle=true®ion=garage' df/linux/386/albatros -> df-dist-v1/albatros/0.9/linux/386/albatros df/linux/amd64/albatros -> df-dist-v1/albatros/0.9/linux/amd64/albatros df/linux/arm/albatros -> df-dist-v1/albatros/0.9/linux/arm/albatros df/linux/arm64/albatros -> df-dist-v1/albatros/0.9/linux/arm64/albatros tag -> df-dist-v1/albatros/0.9 manifest -> df-dist-v1/albatros ✅ push succeeded ``` On peut vérifier que tout fonctionne avec curl : ``` $ curl https://download.deuxfleurs.org/df-dist-v1/albatros {"name":"albatros","tags":["0.9"]} $ curl https://download.deuxfleurs.org/df-dist-v1/albatros/0.9 {"flavors":[{"resources":[{"path":"albatros"}],"platform":{"architecture":"386","os":"linux"}},{"resources":[{"path":"albatros"}],"platform":{"architecture":"amd64","os":"linux"}},{"resources":[{"path":"albatros"}],"platform":{"architecture":"arm","os":"linux"}},{"resources":[{"path":"albatros"}],"platform":{"architecture":"arm64","os":"linux"}}]} $ curl -I https://download.deuxfleurs.org/df-dist-v1/albatros/0.9/linux/amd64/albatros HTTP/2 200 content-type: application/octet-stream ``` ## Publier un conteneur sur Garage Après implémentation, voici la trace de la commande : ``` $ ./alba container push -t albatros:0.9 docker/ 's3://registry.deuxfleurs.org?endpoint=garage.deuxfleurs.fr&s3ForcePathStyle=true®ion=garage' ```