Machen Sie alle Ihre privaten Pakete an einem Ort zugänglich
mit diesem Github-veranstalteten PYPI-Index
Beschreibung • Versuchen Sie es! • Erste Schritte • Ändern Sie indizierte Pakete • FAQ • Ein Wort zu Angriffen der Lieferkette • Beitrag • Referenzen
Dieses Repository ist eine Github -Seite, die als PYPI -Index verwendet wird, der PEP503 entspricht.
Sie können es verwenden, um alle Ihre Pakete an einem Ort zu gruppieren und über pip problemlos darauf zugreifen zu können, fast wie jedes andere öffentlich verfügbare Paket!
Während der PYPI -Index öffentlich ist, werden private Pakete privat gehalten: Sie benötigen eine GitHub -Authentifizierung, um sie abzurufen.
Besuchen Sie astariul.github.io/github-hosted-pypi/ und versuchen Sie, dort indizierte Pakete zu installieren!
Versuchen Sie, das Paket public-hello zu installieren:
pip install public-hello --extra-index-url https://astariul.github.io/github-hosted-pypi/ Es wird auch das Paket mydependency automatisch installiert!
Versuchen Sie es mit:
from public_hello import hi
print ( hi ())Sie können auch eine bestimmte Version installieren:
pip install public-hello==0.1 --extra-index-url https://astariul.github.io/github-hosted-pypi/ Versuchen Sie nun, das Paket private-hello zu installieren:
pip install private-hello --extra-index-url https://astariul.github.io/github-hosted-pypi/Es wird nicht funktionieren, denn es ist privat und nur ich kann darauf zugreifen!
Settings Ihres Repositorys und aktivieren Sie die GitHub -Seiteindex.html und pkg_template.html nach Ihren Wünschen an<user>.github.io/<repo_name> Nachdem Ihr PYPI -Index eingerichtet ist, können Sie Pakete registrieren / aktualisieren / löschen.
GitHub -Aktionen werden so eingerichtet, dass dies automatisch für Sie durchgeführt wird.
Sie müssen nur:
Actions Ihres Repositorysregister / update / delete ) und lösen Sie ihn manuell aus Wie Sie vielleicht wissen, kann pip ein GitHub-verabreichtes Paket installieren, wenn in der Form pip install git+<repo_link> angegeben ist. Dieser PYPI -Index ist nur ein Index von Links zu einem anderen Github -Repository.
GitHub -Seiten sind öffentlich, daher ist dieser pypi -Index öffentlich. Aber es enthält nur Links zu anderen Github -Repositories, kein Code wird auf diesem PYPI -Index gehostet!
Wenn der Repository -Hosting -Code privat ist, müssen Sie sich mit GitHub authentifizieren, um ihn zu klonen und ihn effektiv privat zu machen.
Wenn Sie sich genauer über die Angriffe von Lieferketten wundern, überprüfen Sie den Abschnitt darüber!
Beim Ausführen pip install <package_name> --extra-index-url https://astariul.github.io/github-hosted-pypi/ folgen:
pip wird sich https://pypi.org/ ansehen, den Standard, den öffentlichen Index, der versucht, ein Paket mit dem angegebenen Namen zu finden.https://astariul.github.io/github-hosted-pypi/ betrachtet.pip zurückgegeben ( git+<repo_link>@<tag> ).pip , dass es sich um ein Github -Repository handelt und das Repository (am spezifischen Tag) lokal klonen wird.pip aus dem geklonten Repository das Paket.pip installieren Sie eine fehlende Abhängigkeit mit den gleichen Schritten.Die Authentifizierung erfolgt in Schritt 4, wenn das Repository kloniert.
Die beste Praxis ist die Verwendung von Github -Releases. Dadurch kann Ihr Paket eine Version von einem bestimmten Tag verwiesen.
Um dies zu tun:
pip install git+<repo_link>@<tag>git+<repo_link>@<tag> ). Sie können einfach einen anderen Namen für Ihr indiziertes Paket angeben. Geben Sie ihm beim Registrieren einfach einen anderen Namen in der Form.
Wenn Sie beispielsweise ein privates Paket namens tensorflow haben, können Sie es bei diesem Index my_cool_tensorflow benennen, sodass mit dem öffentlichen Paket tensorflow keine Namenskollision vorliegt.
Dann können Sie es mit pip install my_cool_tensorflow --extra-index-url https://astariul.github.io/github-hosted-pypi/ .
Dann können Sie von python einfach:
import tensorflowAber sei vorsichtig dabei! Es ist zwar möglich, es so zu behandeln, aber es ist immer besser, einen einzigartigen Namen für Ihr Paket zu haben, um Verwirrung, aber auch für Sicherheit zu vermeiden!
Das Erstellen eines Docker -Images ist nicht interaktiv, sodass keine Aufforderung zum Eingeben von Benutzernamen und Passwort besteht.
Stattdessen sollten Sie Ihre GitHub -Anmeldeinformationen in eine .netrc -Datei einfügen, damit pip beim Klonen aus GitHub authentifizieren kann.
Um dies sicher auf Docker zu tun, sollten Sie Docker Secrets verwenden. Hier ist ein kurzes Tutorial, wie es geht:
Schritt 1 : Speichern Sie Ihre Anmeldeinformationen in einer geheimen Datei. Folgen Sie diesem Beispiel:
machine github.com
login <gh_user>
password <gh_pass>
n .
Also vorsichtig, wenn Sie eine IDE verwenden, die Registerkarten durch Leerzeichen ersetzt oder wenn Sie unter Windows sind (wo die Zeilenende rn )!
Nennen wir diese Datei gh_auth.txt .
Schritt 2 : Erstellen Sie Ihre Docker -Datei. In der Docker -Datei sollten Sie die geheime Datei in .netrc montieren und den Befehl ausführen, in dem Sie Authentifizierung benötigen. Zum Beispiel :
# 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/Schritt 3 : Erstellen Sie Ihr Docker -Bild und geben Sie den Ort des in Schritt 1 erstellten Geheimnisses an:
sudo DOCKER_BUILDKIT=1 docker build --secret id=gh_auth,src=./gh_auth.txt .
Wenn Sie Fragen oder Ideen haben, um diese FAQ zu verbessern, öffnen Sie bitte ein PR / leerer Problem!
Wie Sie bereits gesehen haben, stützt sich dieser Github-veranstaltete PYPI-Index auf die pip -Funktion --extra-index-url . Aufgrund der Funktionsweise dieser Funktion ist es anfällig für Lieferkettenangriffe.
Angenommen, Sie haben ein Paket mit dem Namen fbi_package Version 2.8.3 , das auf Ihrem privaten PYPI -Index gehostet wird.
Ein Angreifer könnte ein böswilliges Paket mit demselben Namen und einer höheren Version erstellen (z. B. 99.0.0 ).
Wenn Sie pip install fbi_package --extra-index-url my_pypi_index.com ausführen, lädt sie unter der Hood pip die neueste Version des Pakets herunter, das das böswillige Paket ist!
Während dieses Repository es sehr bequem macht, einen eigenen PYPI -Index zu haben, beachten Sie, dass die Seite öffentlich ist. Daher kann jeder sehen, welcher Paketname Sie verwenden, und ein bösartiges Paket mit demselben Namen erstellen ...
Aus diesem Grund haben wir automatisierte Schecks in diesen privaten PYPI -Index aufgenommen. Wenn Sie auf die Seite Ihres Pakets zugreifen, wird die PYPI -API aufgerufen, und wenn ein Paket mit demselben Namen und einer höheren Version gefunden wird, wird der Befehl Install durch eine Warnung ersetzt.
Sie können eine Demo einer solchen Warnung unter https://astariul.github.io/github-hosted-pypi/transformers/ sehen.
Wenn Sie diese Warnung sehen, installieren Sie das Paket nicht! Ändern Sie stattdessen den Namen Ihres Pakets oder aktualisieren Sie die Version über ihrem öffentlichen Gegenstück.
Sei vorsichtig da draußen!
Probleme und PR sind willkommen!
Wenn Sie auf etwas Seltsames stoßen / das verbessert werden kann, wenden Sie sich bitte an uns!
Dies ist stark von diesem Repository inspiriert.
Es handelt sich nur um eine verherrlichte Version mit saubereren Seiten und GitHub -Aktionen zum einfachen Hinzufügen, Aktualisieren und Entfernen von Paketen aus Ihrem Index.
Überprüfen Sie auch den Blogpost des ursprünglichen Autors!
Das in der Seite verwendete Symbol wurde von Freepik von Flaticon hergestellt