quentin.dufour.io/_posts/2023-04-17-automatiser-la-p...

4.4 KiB

layout title date status sitemap category description
post Automatiser la publication des artefacts 2023-04-17T07:45:22.402+02:00 draft true developpement 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 :

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 :

# 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 :

alba static push -t albatros:0.9 publish/ 's3://download.deuxfleurs.org?endpoint=garage.deuxfleurs.fr&region=garage'
alba container push -t albatros:0.9 publish/ 's3://registry.deuxfleurs.org?endpoint=garage.deuxfleurs.fr&region=garage'
alba docker push publish/ docker.io/dxflrs/albatros:0.9

On pourra imaginer d'avantage de commandes par la suite comme :

alba static ls -t albatros 's3://download.deuxfleurs.org?endpoint=garage.deuxfleurs.fr&region=garage'
alba static rm -t albatros:0.8 's3://download.deuxfleurs.org?endpoint=garage.deuxfleurs.fr&region=garage'
alba static gc -t albatros --keep 10 's3://download.deuxfleurs.org?endpoint=garage.deuxfleurs.fr&region=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&region=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&region=garage'