Rendez tous vos forfaits privés accessibles en un seul endroit
avec cet indice PYPI hébergé par Github
Description • Essayez-le! • Commencez • Modifier les packages indexés • FAQ • Un mot sur les attaques de la chaîne d'approvisionnement • Contribuer • Références
Ce référentiel est une page GitHub utilisée comme indice PYPI, conforme à PEP503.
Vous pouvez l'utiliser pour regrouper tous vos packages en un seul endroit et y accéder facilement via pip , presque comme tout autre package accessible au public!
Bien que l'indice PYPI soit public, les packages privés indexés ici sont gardés privés: vous aurez besoin d'authentification GitHub pour pouvoir la récupérer.
Visitez astariul.github.io/github-hosted-pypi/ et essayez d'installer des packages indexés!
Essayez d'installer le package public-hello :
pip install public-hello --extra-index-url https://astariul.github.io/github-hosted-pypi/ Il installera également le package mydependency , automatiquement!
Essayez-le avec:
from public_hello import hi
print ( hi ())Vous pouvez également installer une version spécifique:
pip install public-hello==0.1 --extra-index-url https://astariul.github.io/github-hosted-pypi/ Essayez maintenant d'installer le package private-hello :
pip install private-hello --extra-index-url https://astariul.github.io/github-hosted-pypi/Cela ne fonctionnera pas, car c'est privé et seul moi peut y accéder!
Settings de votre référentiel et activez la page GitHubindex.html et pkg_template.html à votre goût<user>.github.io/<repo_name> pour voir votre index PYPI Maintenant que votre index PYPI est configuré, vous pouvez enregistrer / mettre à jour / supprimer les packages indexés.
Les actions GitHub sont configurées pour le faire automatiquement pour vous.
Il suffit de:
Actions de votre référentielregister / update / delete ) et déclenchez-le manuellement Comme vous le savez peut-être, pip peut installer le package hosté par GitHub s'il est donné dans le formulaire pip install git+<repo_link> . Cet index PYPI n'est qu'un index des liens vers un autre référentiel GitHub.
Les pages GitHub sont publiques, donc cet indice PYPI est public. Mais il contient simplement des liens vers d'autres référentiels GitHub, aucun code n'est hébergé sur cet index PYPI!
Si le code d'hébergement du référentiel est privé, vous devrez vous authentifier avec GitHub pour pouvoir le cloner, le rendant efficacement privé.
Si vous vous demandez plus spécifiquement sur les attaques de chaîne d'approvisionnement, vérifiez la section à ce sujet!
Lors de l'exécution pip install <package_name> --extra-index-url https://astariul.github.io/github-hosted-pypi/ , les éléments suivants se produisent:
pip examinera https://pypi.org/ , par défaut, index public, essayant de trouver un package avec le nom spécifié.https://astariul.github.io/github-hosted-pypi/ .pip ( git+<repo_link>@<tag> ).pip comprend qu'il s'agit d'un référentiel GitHub et clonera localement le référentiel (sur la balise spécifique).pip installe le package.pip installe toute dépendance manquante avec les mêmes étapes.L'authentification se produit à l'étape 4, lors du clonage du référentiel.
La meilleure pratique consiste à utiliser les sorties GitHub. Cela permet à votre package d'avoir une version référée par une balise spécifique.
Pour faire ceci:
pip install git+<repo_link>@<tag>git+<repo_link>@<tag> ). Vous pouvez simplement spécifier un nom différent pour votre package indexé. Donnez-lui simplement un nom différent dans le formulaire lors de l'enregistrement.
Par exemple, si vous avez un package privé nommé tensorflow , lorsque vous l'enregistrez dans cet index, vous pouvez le nommer my_cool_tensorflow , il n'y a donc pas de collision de nom avec le package public tensorflow .
Ensuite, vous pouvez l'installer avec pip install my_cool_tensorflow --extra-index-url https://astariul.github.io/github-hosted-pypi/ .
Ensuite, à partir de python , vous pouvez simplement faire:
import tensorflowMais faites attention à cela! Bien qu'il soit possible de le gérer comme ça, il est toujours préférable d'avoir un nom unique pour votre package, pour éviter la confusion mais aussi pour la sécurité!
La construction d'une image Docker n'est pas interactive, il n'y a donc pas d'invite pour taper le nom d'utilisateur et le mot de passe.
Au lieu de cela, vous devez mettre vos informations d'identification GitHub dans un fichier .netrc , donc pip peut s'authentifier lors du clonage de GitHub.
Pour ce faire en toute sécurité sur Docker, vous devez utiliser Docker Secrets. Voici un tutoriel rapide sur la façon de faire:
Étape 1 : Enregistrez vos informations d'identification dans un fichier secret. Suivez cet exemple:
machine github.com
login <gh_user>
password <gh_pass>
n .
Tellement prudent si vous utilisez un IDE qui remplace les onglets par des espaces ou si vous êtes sous Windows (où les fins de ligne sont rn )!
Nommez ce fichier gh_auth.txt .
Étape 2 : Créez votre fichier docker. Dans le fichier docker, vous devez monter le fichier secret dans .netrc et exécuter la commande où vous avez besoin d'authentification. Par exemple :
# syntax=docker/dockerfile:experimental
FROM python:3
RUN --mount=type=secret,id=gh_auth,dst=/root/.netrc pip install <package_name> --extra-index-url https://astariul.github.io/github-hosted-pypi/Étape 3 : Créez votre image Docker, en spécifiant l'emplacement du secret créé à l'étape 1:
sudo DOCKER_BUILDKIT=1 docker build --secret id=gh_auth,src=./gh_auth.txt .
Si vous avez des questions ou des idées pour améliorer cette FAQ, veuillez ouvrir un problème PR / blanc!
Comme vous l'avez vu plus tôt, cet indice PYPI hébergé GitHub reposait sur la fonction pip --extra-index-url . En raison du fonctionnement de cette fonctionnalité, il est vulnérable aux attaques de chaîne d'approvisionnement.
Par exemple, disons que vous avez un package nommé fbi_package version 2.8.3 hébergée sur votre index PYPI privé.
Un attaquant pourrait créer un package malveillant avec le même nom et une version supérieure (par exemple 99.0.0 ).
Lorsque vous exécutez pip install fbi_package --extra-index-url my_pypi_index.com , sous le Hood pip téléchargera la dernière version du package, qui est le package malveillant!
Bien que ce référentiel soit très pratique d'avoir votre propre index PYPI, sachez que la page est publique, donc tout le monde peut voir quel nom de package vous utilisez et créer un package malveillant avec ce même nom ...
C'est pourquoi nous avons inclus des vérifications automatisées dans cet index PYPI privé. Chaque fois que vous accédez à la page de votre package, l'API PYPI est appelée, et si un package avec le même nom et une version supérieure sont trouvés, la commande d'installation est remplacée par un avertissement.
Vous pouvez voir une démo d'un tel avertissement sur https://astariul.github.io/github-hosted-pypi/transformers/.
Si vous voyez cet avertissement, n'installez pas le package! Au lieu de cela, modifiez le nom de votre package ou améliorez la version au-dessus de son homologue public.
Soyez prudent là-bas!
Les problèmes et les relations publiques sont les bienvenus!
Si vous rencontrez quelque chose de bizarre / qui peut être amélioré, veuillez nous contacter!
Ceci est grandement inspiré de ce référentiel.
C'est juste une version glorifiée, avec des pages plus propres et des actions GitHub pour ajouter, mettre à jour et supprimer facilement les packages de votre index.
Consultez également le blog de l'auteur original!
L'icône utilisée dans la page a été fabriquée par Freepik depuis Flaticon