Verwendung von GitHub als PyPi-Server

Ich suchte nach einem gehosteten privaten PyPi Python Package-Server, der Anmeldeinformationen verwendet, über die das Team bereits verfügt (z. B. GitHub).

Ich wollte keinen lokalen Server erstellen. Für uns würde es unmöglich machen, Cloud-basierte Build-Server zu verwenden, und es ist ein weiterer bewegender Teil, der schief gehen kann. Es gibt auch potenzielle Probleme mit feinkörniger Sicherheit und Geschwindigkeit. (Wir haben ein weltweites Team, daher wäre es hilfreich, den Inhalt über ein CDN bereitzustellen.)

Ich wollte das Team nicht zwingen, Konten bei einem anderen Anbieter zu erstellen. Sie haben bereits Active Directory- und GitHub-Konten. Es ist ein Ärger für sie und schafft eine Governance-Belastung für mich.

Leider konnte ich einen solchen Service nicht finden. GemFury ist ausgezeichnet, unterstützt jedoch keine GitHub-Autorisierung (auf Team- / Organisationsebene) und Packagr unterstützt überhaupt keine GitHub-Autorisierung. MyGet ist auch hervorragend, es erlaubt mir, die GitHub-Autorisierung zu verwenden, aber es werden keine Python-Pakete gehostet. Azure DevOps sieht vielversprechend aus, befindet sich jedoch derzeit in der privaten Beta.

Glücklicherweise ist dies mit Cloud-Git-Repositorys wie GitHub, GitLab und BitBucket möglich.

Pip kann Pakete von Git installieren

Ich habe ein Python-Paket auf GitHub (python_world) gehostet, das Sie mit dem folgenden Befehl installieren können (stellen Sie sicher, dass Sie mir vertrauen, bevor Sie diesen Befehl ausführen und meinen Code auf Ihrem Computer installieren).

pip install git+//github.com/ceddlyburge/python_world#egg=python_world

Pip bietet Optionen für die Installation von head, von einem Zweig, von einem Tag oder von einem Commit. Normalerweise tagge ich jede Version und installiere sie von diesen Tags. Ausführliche Informationen finden Sie in der Dokumentation zur Pip-Installation.

Dieses Repository ist öffentlich, funktioniert aber genauso mit einem privaten Repo, solange Sie die Berechtigung haben. Es gibt keine besondere Magie (es ist ein Vanille-Python-Paket) und Setup.py erledigt den größten Teil der Arbeit wie gewohnt.

Wenn Sie mit dem Erstellen von Python-Paketen noch nicht vertraut sind, ist das Lernprogramm zum Verpacken von Python-Projekten eine kurze Lektüre wert.

Setuptools können auch Abhängigkeiten von Git installieren

Mit Setuptools erstellen die meisten Benutzer Python-Pakete.

Ich habe ein anderes Paket auf GitHub python_hello gehostet, das von python_world abhängt. (Ich bin sicher, Sie können sehen, wohin das führt.)

Die relevanten Bits aus setup.py sind unten aufgeführt. Gibt an, install_requiresdass dies python_worldeine erforderliche Abhängigkeit ist, und teilt Setuptools mit, wo sie zu finden ist.

install_requires=[ '[email protected]+//github.com/ceddlyburge/python_world#egg=python_world-0.0.1', ]

Sie können dieses Paket mit dem folgenden Befehl installieren. Es wird auch das abhängige python_worldPaket heruntergeladen .

pip install git+//github.com/ceddlyburge/python_hello#egg=python_hello

Dies führt zu einer bestimmten Version von python_world, was schade ist, da pip kein Abhängigkeitsmanagement durchführen kann (z. B. eine akzeptable Version ausarbeiten, wenn mehrere Dinge davon abhängen). Am Ende dieses Artikels haben wir jedoch die Notwendigkeit für den spezifischen Link entfernt.

Python-Umgebungen

Wie jeder weiß, der Python ohne Umgebung verwendet hat, sparen Umgebungen viel Frust und Zeitverschwendung. Also müssen wir diese unterstützen.

Ich habe ein Repo (use-hello-world) erstellt, das python_helloals Abhängigkeit in den Anforderungen.txt für Virtualenv und environment.yml für Conda definiert wird.

Wenn Sie das Repo herunterladen, können Sie die Abhängigkeiten mit dem folgenden Befehl in einer virtuellen Umgebung installieren.

pip install -r requirements.txt

Wenn Sie conda verwenden, können Sie diesen Befehl verwenden:

conda env create -n use-hello-world

PyPi-Index

Bisher können wir Pakete aus unseren privaten Git-Repositories installieren. Diese Pakete können wiederum Abhängigkeiten zu anderen privaten Repositorys definieren. Es ist noch kein PyPi-Server in Sicht.

Wir könnten an diesem Punkt aufhören. Die Syntax zum Definieren von Abhängigkeiten ist jedoch etwas mysteriös. Für das Team ist es schwierig herauszufinden, welche Pakete verfügbar sind, und wir verknüpfen sie mit bestimmten Versionen abhängiger Pakete, anstatt sie von Pip verwalten zu lassen.

Um dies zu beheben, können wir einen PyPi-Index einrichten, der Pep 503 entspricht. Diese Spezifikation ist recht einfach, und ich habe den Index gerade von Hand erstellt. Wenn dies zu umständlich wird, kann ich es über die GitHub-API generieren.

Ich habe diesen PyPi-Index mit GitHub-Seiten erstellt. Es gibt äquivalente Dinge für GitLab und BitBucket. Sie können sehen, dass der Quellcode sehr einfach ist. GitHub Pages-Websites sind immer öffentlich (und Ihr Index enthält wahrscheinlich keine vertraulichen Informationen). Wenn Sie jedoch möchten, dass sie privat sind, können Sie einen Dienst wie PrivateHub verwenden.

Eine Sache, auf die Sie achten müssen, ist die Namensnormalisierung der Spezifikation. Dies setzt python_hellovoraus, dass die Paketinformationen vorhanden sind python-hello/index.html(beachten Sie den Wechsel von einem Unterstrich zu einem Bindestrich).

Nachdem wir nun einen PyPi-Server haben, können wir Pakete mit dem folgenden Befehl installieren.

pip install python_hello --extra-index-url //ceddlyburge.github.io/python-package-server/

Damit Sie sehen können, dass dies mit Umgebungen funktioniert, habe ich ein weiteres Repo (use_hello_world_from_server) erstellt, das die python_helloAbhängigkeit mithilfe dieses PyPi-Index anstelle von direkten GitHub-Links definiert. Wenn Sie es mit Conda versuchen, ist Version> 4.4 erforderlich.

An diesem Punkt können wir zurückgehen und den direkten Git-Link in install_requires in setup.py von python_hello entfernen (da Setuptools ihn von unserem Server finden kann).

Schlussfolgerungen

Die Verwendung eines in der Cloud gehosteten Git-Anbieters als PyPi-Server ist eine praktikable Option. Wenn Sie bereits eine verwenden, können Sie die bereits vorhandenen Anmeldeinformationen und Berechtigungen wiederverwenden. Es funktioniert mit Cloud-Build-Servern und wird wahrscheinlich über ein CDN bereitgestellt, ist also weltweit schnell. Die Einrichtung erfordert mehr Wissen als ein gehosteter Server, aber wahrscheinlich das gleiche oder weniger als das Hosting Ihres eigenen Servers vor Ort.

Hinweise und Tipps

Das lokale Bereitstellen des Index kann zur Behebung von Problemen (z. B. Namensnormalisierung) beitragen. Es ist leicht zu erkennen, welche Anfragen gestellt werden. Sie können hierfür den eingebauten Python-HTTP-Server verwenden ( python -m Http.Server -8000). Dies führte mich zu erfahren, dass pip searchVerwendungen postAnfragen werden so nicht mit GitHub Seiten arbeiten.

Sie können python setup.py -installIhre Pip-Pakete lokal überprüfen, bevor Sie sie an Git senden.