2023-04-17 05:47:20 +00:00
---
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
---
2023-04-17 05:56:31 +00:00
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/ )
2023-04-17 05:57:01 +00:00
- [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/ )
2023-04-17 05:56:31 +00:00
- [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/ )
2023-04-17 06:07:03 +00:00
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 :
2023-04-17 06:00:34 +00:00
```bash
2023-04-17 06:04:00 +00:00
# static
2023-04-28 09:55:40 +00:00
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
2023-04-17 05:56:31 +00:00
2023-04-17 06:04:00 +00:00
# docker
2023-04-28 09:55:40 +00:00
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
2023-04-17 06:04:00 +00:00
```
2023-04-17 05:56:31 +00:00
2023-04-17 06:09:38 +00:00
Et maintenant imaginons les commandes de base :
2023-04-17 06:07:03 +00:00
2023-04-17 06:12:51 +00:00
```bash
2023-05-03 07:47:50 +00:00
alba static push -t albatros:0.9 publish/ 's3://download.deuxfleurs.org?endpoint=garage.deuxfleurs.fr& region=garage& s3ForcePathStyle=true'
alba container push -t albatros:0.9 publish/ 's3://registry.deuxfleurs.org?endpoint=garage.deuxfleurs.fr& region=garage& s3ForcePathStyle=true'
alba container push -t albatros:0.9 publish/ 'docker://docker.io/dxflrs/albatros:0.9'
2023-04-17 06:07:03 +00:00
```
2023-04-17 06:12:51 +00:00
On pourra imaginer d'avantage de commandes par la suite comme :
```bash
2023-04-17 13:49:00 +00:00
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'
2023-04-17 06:07:03 +00:00
```
2023-04-17 06:12:51 +00:00
Mais c'est en dehors du périmètre pour le moment !
2023-04-17 13:50:58 +00:00
## La glue
J'ai choisi d'utiliser un petit panel de bibliothèques pour faire la glue entre tout ça :
2023-04-17 13:51:42 +00:00
- Go CDK pour la publication des artefacts sur un object storage
- crane pour la publication d'images OCI sur un registre compatible
2023-04-17 13:50:58 +00:00
- Cobra comme framework CLI
2023-04-17 13:51:42 +00:00
- skopeo comme bibliothèque de manipulation des conteneurs
2023-04-17 13:50:58 +00:00
2023-04-28 09:50:00 +00:00
## Publier un binaire statique sur Garage
2023-04-28 09:49:06 +00:00
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
```
2023-04-28 09:50:00 +00:00
## Publier un conteneur sur Garage
2023-04-28 10:00:10 +00:00
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'
```
2023-04-28 09:50:00 +00:00