Poetry : Configurer des repositories privées GCP

Partager l'article

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.&lt;repo-name&gt;&lt;repo-url&gt;</code>

À la place de <code  class="inline-code-element">&lt;repo-name&lt;</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://&lt;region&gt;-python.pkg.dev/&lt;project&gt;/&lt;repository_id&gt;/</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 !

Les prochains événements Hymaïa

LUN 25 NOV.
en savoir plus
Fondation Biermans-Lapôtre, Paris

Forward Data Conference

Our mission is to build a conference that serves as a dynamic knowledge-sharing hub, where every participant can find their place and thrive.
MER. 11 DEC. - 18:00
en savoir plus
chez Hymaïa

Hymanight : La Data 360 : Explorer, Visualiser, Décider

Un événement où la data rencontre l'expertise et la créativité.

Appuyez-vous sur les bonnes compétences Data

Nous vous apporterons une réponse sur mesure en vous délivrant notre savoir technologique et méthodologique.