Nous avions déjà écrit un article sur les fonctionnalités qu’offre Poetry sur le cycle de vie de votre code. Cette fois-ci nous allons nous concentrer sur la configuration d’un repository Python privé déployé sur GCP avec Artifact Registry.
Créer un repository Python privé sur GCP
Dans cet article nous allons créer notre repository Python sur GCP via le service managé Artifact Registry. Pour cela nous utiliserons Terraform :
<p> CODE:https://gist.github.com/franck-cussac/00075253719ba99e965e9985434659c2.js</p>
Configurer Poetry pour publier dans GCP Artifact Registry
Ajouter un repository privé GCP à Poetry
Pour publier un package Python avec Poetry, il existe la commande suivante :
<code class="code-element">poetry publish --build</code>
L’option <code class="inline-code-element">--build</code> indique à Poetry de construire le package avant de publier. Par défaut, Poetry publie dans Pypi, le repository public officiel de Python.
Pour pousser dans un repository privé, la configuration doit se faire sur Poetry au global et non pas dans un projet spécifique. Pour cela Poetry fourni une commande :
<code class="code-element">poetry config repositories.<repo-name><repo-url></code>
À la place de <code class="inline-code-element"><repo-name<</code> vous pouvez mettre ce que vous voulez. Cela sera le nom pour faire référence à votre repository privé dans Poetry. Dans notre exemple nous le remplacerons par <code class="inline-code-element">hymaia-repo</code>
Dans GCP, l’url du repository se construit comme suit :<code class="inline-code-element">https://<region>-python.pkg.dev/<project>/<repository_id>/</code>
Cela nous donne :
<code class="code-element">poetry config repositories.hymaia-repo https://europe-west1-python.pkg.dev/hymaia/hymaia-pypi/</code>
Nous pouvons maintenant reprendre notre commande de publish et ajouter un paramètre pour le repository :
<code class="code-element">poetry publish --build --repository hymaia-repo</code>
Sauf qu’à présent, on se retrouve avec une erreur :
<code class="code-element is-error">HTTP Error 401: Unauthorized | b'The request does not have valid authentication credentials.\n'</code>
Cette erreur indique que nous n’avons pas d’identifications valides pour GCP.
S’authentifier à un repository Python GCP
Lorsqu’on travaille avec GCP ou un Cloud Provider de manière générale, on a l’habitude d’utiliser un service managé IAM (ou GIA en français, merci wikipédia) pour s’authentifier. C’est pourquoi tous les outils fournis par GCP sont prévus pour fonctionner ainsi. La CLI gcloud, par exemple, nous permet de récupérer notre token d’authentification IAM via la commande suivante :
<code class="code-element">gcloud auth application-default login</code>
Cette commande récupère un token d’authentification qui devra être celui utilisé par défaut. Plus concrètement, si vous travaillez sur Linux, cela crée ou met à jour le fichier <code class="inline-code-element">~/.config/gcloud/application_default_credentials.json</code> Les autres applications fonctionnant avec le IAM de GCP savent donc par convention où récupérer le token pour s’authentifier.
Dans notre cas, l’application qui doit travailler avec GCP est Poetry. Mais Poetry n’a rien à voir avec GCP, alors comment peut-il savoir comment s’y authentifier ? Même chose si nous travaillons avec AWS ou Azure. Chaque Cloud Provider a sa méthode d’authentification IAM et ce n’est pas à Poetry de les gérer. Poetry étant un outil de l’écosystème Python, le seul mode d’authentification qu’il connait est celui du standard de repository Python : <code class="inline-code-element">password lookup</code>
S’authentifier à GCP avec Python
Une fonctionnalité récente
Avant mai 2023 et la version 1.5.x, il n’était pas possible de configurer Poetry pour qu’il utilise l’authentification IAM de GCP pour publier dans Artifact Registry.
En Python il existe une bibliothèque officiellement supportée par Google pour récupérer automatiquement les tokens d’authentifications IAM : <code class="inline-code-element">keyrings.google-artifactregistry-auth</code>
Côté Poetry, dans les version 1.1.x, la stratégie d’authentification à un repository est fixée sur le password lookup. Ce qui signifie qu’à l’époque, impossible d’utiliser la bibliothèque de Google pour son authentification IAM. Une issue github a donc été ouverte pour fallback en cas d’échec de ce mode d’authentification. Cette issue en a entraîné une autre côté GCP pour supporter Poetry dans google-artifactregistry-auth.
On s’est retrouvé avec une première évolution côté Poetry pour accepter d’autres modes d’authentification et une seconde côté GCP pour se conformer à la façon dont Poetry gère l’authentification. Un bel exemple de 2 projets open source qui collaborent.
Ajouter le mode d’authentification GCP IAM à Poetry
Pour prendre en compte un nouveau mode d’authentification, Poetry a juste besoin d’avoir la bibliothèque correspondante d’ajoutée à son environnement Python. C’est exactement la même chose quand vous ajoutez une dépendance à votre projet. Pour cela, vous pouvez utiliser la commande :
<code class="code-element">poetry self add keyrings.google-artifactregistry-auth</code>
Maintenant on peut relancer notre commande de publication :
<code class="code-element">poetry publish --build --repository hymaia-repo</code>
Et cette fois-ci c’est tout bon !
Récupérer un package Python dans GCP Artifact Registry
Lorsqu’on publie un package, c’est souvent pour le récupérer dans d’autres projets. Pour cela la procédure est encore plus simple :
1. Configurer un nouveau repository privé
<code class="code-element">poetry source add hymaia-repo https://europe-west1-python.pkg.dev/hymaia/hymaia-pypi/simple --priority=explicit</code>
2. Ajouter la dépendance en précisant le repository
<code class="code-element">poetry add my-package --source=hymaia-repo</code>
Évidemment il faut toujours être bien authentifié à GCP en mode <code class="inline-code-element">default-application</code> et avoir installé dans l’environnement virtuel de Poetry <code class="inline-code-element">keyrings.google-artifactregistry-auth</code> comme pour la publication d’une dépendance.
Et c’est fini !