2013-03-21 12 views
31

Wenn ein neuer Entwickler dem Team beitritt oder Jenkins einen kompletten Build ausführt, muss ich einen neuen virtualenv erstellen. Ich finde oft, dass die Einrichtung eines virtualenv mit Pip und einer großen Anzahl (mehr als 10) von Anforderungen sehr lange dauert, um alles von PyPI zu installieren. Oft scheitert es zusammen mit:PyPI ist langsam. Wie betreibe ich meinen eigenen Server?

Downloading/unpacking Django==1.4.5 (from -r requirements.pip (line 1)) 
Exception: 
Traceback (most recent call last): 
    File "/var/lib/jenkins/jobs/hermes-web/workspace/web/.venv/lib/python2.6/site-packages/pip-1.2.1-py2.6.egg/pip/basecommand.py", line 107, in main 
    status = self.run(options, args) 
    File "/var/lib/jenkins/jobs/hermes-web/workspace/web/.venv/lib/python2.6/site-packages/pip-1.2.1-py2.6.egg/pip/commands/install.py", line 256, in run 
    requirement_set.prepare_files(finder, force_root_egg_info=self.bundle, bundle=self.bundle) 
    File "/var/lib/jenkins/jobs/hermes-web/workspace/web/.venv/lib/python2.6/site-packages/pip-1.2.1-py2.6.egg/pip/req.py", line 1018, in prepare_files 
    self.unpack_url(url, location, self.is_download) 
    File "/var/lib/jenkins/jobs/hermes-web/workspace/web/.venv/lib/python2.6/site-packages/pip-1.2.1-py2.6.egg/pip/req.py", line 1142, in unpack_url 
    retval = unpack_http_url(link, location, self.download_cache, self.download_dir) 
    File "/var/lib/jenkins/jobs/hermes-web/workspace/web/.venv/lib/python2.6/site-packages/pip-1.2.1-py2.6.egg/pip/download.py", line 463, in unpack_http_url 
    download_hash = _download_url(resp, link, temp_location) 
    File "/var/lib/jenkins/jobs/hermes-web/workspace/web/.venv/lib/python2.6/site-packages/pip-1.2.1-py2.6.egg/pip/download.py", line 380, in _download_url 
    chunk = resp.read(4096) 
    File "/usr/lib64/python2.6/socket.py", line 353, in read 
    data = self._sock.recv(left) 
    File "/usr/lib64/python2.6/httplib.py", line 538, in read 
    s = self.fp.read(amt) 
    File "/usr/lib64/python2.6/socket.py", line 353, in read 
    data = self._sock.recv(left) 
timeout: timed out 

Ich bin mir dessen bewusst --use-mirrors Flagge Pip, und manchmal Leute in meinem Team haben um unter Verwendung --index-url http://f.pypi.python.org/simple (oder einen anderen Spiegel) gearbeitet, bis sie einen Spiegel haben, die in angemessener Zeit reagiert Mode. Wir sind in Großbritannien, aber in Deutschland gibt es einen PyPI-Spiegel, und wir haben keine Probleme, Daten von anderen Seiten herunterzuladen.

Also, ich suche nach Möglichkeiten, PyPI intern für unser Team zu spiegeln.

Die Optionen, die ich angeschaut habe, sind:

  1. Laufen meine eigene PyPI Instanz. Es ist die offizielle PyPI Umsetzung: CheeseShop sowie mehrere Drittanbieter-Implementierungen, wie zB: djangopypi und pypiserver (siehe Fußnote)

    Das Problem bei diesem Ansatz ist, dass ich mit Datei-Upload in voller PyPI Funktionalität interessiert mich nicht, ich Ich möchte nur den Inhalt spiegeln, den es bietet.

  2. Ausführen eines PyPI-Spiegels mit pep381client oder pypi-mirror.

    Das sieht so aus, als könnte es funktionieren, aber es erfordert, dass mein Spiegel zuerst alles von PyPI herunterlädt. Ich habe eine Testinstanz von pep381client eingerichtet, aber meine Downloadgeschwindigkeit variiert zwischen 5 Kb/s und 200 Kb/s (Bits, nicht Bytes). Wenn es nicht irgendwo eine Kopie des vollständigen PyPI-Archivs gibt, brauche ich wochenlang einen nützlichen Spiegel.

  3. Verwenden eines PyPI Round-Robin-Proxys wie yopypi.

    Dies ist jetzt irrelevant, dass http://pypi.python.org selbst besteht aus several geographically distinct servers.

  4. Copying um eine virtualenv zwischen den Entwicklern oder Hosting folder of the current project's dependencies.

    Dies skaliert nicht: Wir haben verschiedene Python-Projekte, deren Abhängigkeiten sich (langsam) im Laufe der Zeit ändern. Sobald sich die Abhängigkeiten eines Projekts ändern, muss dieser zentrale Ordner aktualisiert werden, um die neuen Abhängigkeiten hinzuzufügen. Das Kopieren des Virtualenv ist schlimmer als das Kopieren der Pakete, da alle Python-Pakete mit C-Modulen für das Zielsystem kompiliert werden müssen. Unser Team hat sowohl Linux- als auch OS X-Benutzer.

    (Das sieht immer noch wie die beste Wahl eines schlechten Haufen.)

  5. ein intelligentes PyPI Caching Proxy mit: collective.eggproxy

    Dies scheint, wie es eine sehr gute Lösung sein würde, aber the last version on PyPI is dated 2009 und diskutiert mod_python.

Was machen andere große Python-Teams? Was ist die beste Lösung, um den gleichen Satz von Python-Paketen schnell zu installieren?

Fußnoten:

+1

Persönlich, als ich in einer Situation war, in der ich die (wiederholte) Erstellung eines virtualenv skripten musste, baute ich einfach .egg-Dateien für die Pakete, die ich wollte, und überprüfte sie zusammen mit dem Skript, um den virtualenv zu erstellen. Ich behaupte jedoch nicht, Teil eines großen Python-Teams zu sein. – FatalError

Antwort

26

Haben Sie ein freigegebenes Dateisystem?

Weil ich pips Cache-Einstellung verwenden würde. Es ist ziemlich einfach. Erstellen Sie zum Beispiel einen Ordner namens pip-cache in/mnt.

mkdir /mnt/pip-cache 

Dann wird jeder Entwickler die folgende Zeile in ihre pip config (Unix = $ HOME/.pip/pip.conf gewinnen =% HOME% \ pip \ pip.ini)

[global] 
download-cache = /mnt/pip-cache 
setzen würde

Es prüft immer noch PyPi, sucht nach der neuesten Version. Dann überprüft, ob diese Version im Cache ist. Wenn ja, installiert es von dort. Wenn nicht, lädt es es herunter. Speichert es im Cache und installiert es. So würde jedes Paket nur einmal pro neue Version heruntergeladen werden.

+1

Das sieht nach einer fantastischen Option aus. Ihr Beispiel pip.conf ist jedoch falsch - es sollte keinen Einzug geben oder Pip stirbt mit 'ConfigParser.ParsingError: Datei enthält Parsing-Fehler'. Ich würde es selbst bearbeiten, aber SO lässt mich nicht kleine Änderungen vornehmen. –

+0

Behoben! Danke Wilfred. – aychedee

+0

Ich habe das getestet und es funktioniert perfekt. Ich wünschte, ich könnte dir mehr danken, danke. Ein großes Lob für den besten Weg, einen Server zu betreiben. –

-1

Richten Sie Ihre lokalen Server die Hosts-Datei des lokalen Computers wird nicht helfen, die Überwachung der tatsächlichen URL ändern Sie dann zu überschreiben, um die anstelle zu Punkt lokaler Server und überspringt so den Standard-DNS. Löschen Sie anschließend die Zeile in der Host-Datei, wenn Sie fertig sind.

Oder ich nehme an, Sie könnten die URL in pip finden und diese ändern.

9

Während es Ihr PyPI-Problem nicht löst, kann die Übergabe von eingebauten virtualenvs an Entwickler (oder Bereitstellungen) mit Terrarium erfolgen.

Verwenden Sie terrarium zum Packen, Komprimieren und Speichern von Virtualenvs. Sie können sie lokal oder sogar store them on S3 speichern. Aus der Dokumentation auf GitHub:

$ pip install terrarium 
$ terrarium --target testenv --storage-dir /mnt/storage install requirements.txt 

Nach einer frischen Umgebung baut, wird Terrarium archiviert und die Umwelt komprimieren, und kopieren Sie sie dann an die Stelle von Speicherverzeichnis angegeben.

Bei nachfolgenden Installationen für den gleichen Anforderungssatz, der dasselbe Speicherverzeichnis angibt, kopiert Terrarium das komprimierte Archiv aus/mnt/storage und extrahiert es.

genau anzuzeigen, wie Terrarium den Namen des Archivs wird, können Sie den folgenden Befehl ausführen:

$ terrarium key requirements.txt more_requirements.txt 
x86_64-2.6-c33a239222ddb1f47fcff08f3ea1b5e1 
+0

Danke, ich wusste nicht über Terrarium. Handelt es sich um den Austausch zwischen OS X- und Linux-Benutzern? Wir haben sowohl pure-python als auch C-Module, daher bezweifle ich, dass kompilierte Pakete plattformübergreifend sind. –

+0

Ich wünschte wirklich, ich wüsste es. :(Ich habe keinen Mac (obwohl ich gerne einen haben würde ...) Wenn ich eine Chance bekomme, werde ich sehen, was ich herausfinden kann. Ich habe dieses Paket erst seit PyCon 2013 benutzt (gehört darüber und traf den Entwickler dort. –

+3

Autor von Terrarium hier Kompilierte Pakete werden nicht plattformübergreifend sein, Terrarium löst dieses Problem nicht.Wenn Ihre Anforderungen nicht so häufig ändern, bedeutet es nur, dass der erste Benutzer jedes Plattformtyps, der den Befehl ausführt, ist der Builder. Alle nachfolgenden Befehlslaufwerke (vor einer anderen Anforderungsänderung) ziehen die vorgefertigte Version herunter. Es klingt, als wäre Terrarium eine einfach zu verwendende Befehlsschnittstelle für das, was Sie bereits manuell versuchen werden. Wenn Sie auf irgendwelche Probleme stossen, die Sie davon abhalten, es auf diese Weise zu benutzen, lassen Sie mich wissen. –

3

pip2pi einen Blick auf David Wolever Take. Sie können einfach einen Cron-Job einrichten, um einen unternehmens- oder teamweiten Spiegel der benötigten Pakete zu behalten, und dann Ihre Pips auf Ihren internen Spiegel richten.

7

Ich habe kürzlich devpi in die Vagrant-Konfiguration meines Entwicklungsteams so installiert, dass sein Paket-Cache auf dem Dateisystem des Hosts lebt. Auf diese Weise erhält jede VM ihren eigenen devpi-server-Daemon, den sie als Index-URL für virtualenv/pip verwendet. Wenn die VMs zerstört und neu bereitgestellt werden, müssen die Pakete nicht immer wieder heruntergeladen werden. Jeder Entwickler lädt sie einmal herunter, um ihren lokalen Cache so lange zu erstellen, wie sie sich auf dem Dateisystem des Hosts befinden.

Wir haben auch einen internen PyPi-Index für unsere privaten Pakete, der momentan nur ein Verzeichnis ist, das von Apache bedient wird. Letztendlich werde ich das auch auf einen devpi-Proxy-Server umwandeln, so dass unser Build-Server neben unseren privaten Bibliotheken auch einen Paket-Cache für unsere Python-Abhängigkeiten verwalten wird. Dies schafft einen zusätzlichen Puffer zwischen unserer Entwicklungsumgebung, Produktionsbereitstellungen und dem öffentlichen PyPi.

Dies scheint die robusteste Lösung zu sein, die ich für diese Anforderungen bis heute gefunden habe.

+2

Ich habe nach persönlich gesucht/Private Pypi-Server eine Weile und muss bestätigen, Devipi scheint der beste von ihnen zu sein. Der Autor von devpi hat auch pytest und tox geschrieben und erwartet daher sehr gute Unterstützung für Entwicklung und Tests. –

Verwandte Themen