2013-03-21 17 views
31

Quando un nuovo sviluppatore si unisce al team o Jenkins esegue una build completa, ho bisogno di creare un nuovo virtualenv. Trovo spesso che impostare un virtualenv con Pip e un numero elevato (più di 10) di requisiti richieda molto tempo per installare tutto da PyPI. Spesso viene a mancare del tutto con:PyPI è lento. Come posso gestire il mio 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 

Sono consapevole di --use-mirrors la bandiera di Pip, ea volte la gente nella mia squadra ho lavorato intorno utilizzando --index-url http://f.pypi.python.org/simple (o un altro specchio) fino a quando non hanno uno specchio che risponde in modo tempestivo moda. Siamo nel Regno Unito, ma in Germania esiste uno specchio PyPI e non abbiamo problemi a scaricare dati da altri siti.

Quindi, sto cercando di rispecchiare PyPI internamente per il nostro team.

Le opzioni che ho guardato sono:

  1. esecuzione il mio esempio PyPI. C'è l'attuazione PyPI ufficiale: CheeseShop così come diverse implementazioni di terze parti, come ad esempio: djangopypi e pypiserver (vedi nota in calce)

    Il problema di questo approccio è che io non sono interessato a piena funzionalità PyPI con upload di file, ho voglio solo rispecchiare il contenuto che fornisce.

  2. Esecuzione di un mirror PyPI con pep381client o pypi-mirror.

    Sembra che funzioni, ma richiede che il mio mirror scarichi prima tutto da PyPI. Ho impostato un'istanza di prova di pep381client, ma la velocità di download varia tra 5 Kb/se 200 Kb/s (bit, non byte). A meno che non ci sia una copia dell'intero archivio PyPI da qualche parte, ci vorranno settimane per avere un utile mirror.

  3. Utilizzo di un proxy round-robin PyPI come yopypi.

    Questo è irrilevante ora che lo http://pypi.python.org è costituito da several geographically distinct servers.

  4. Copia su una virtualenv tra gli sviluppatori o l'hosting di folder of the current project's dependencies.

    Questo non è scalabile: abbiamo diversi diversi progetti Python le cui dipendenze cambiano (lentamente) nel tempo. Non appena le dipendenze di qualsiasi progetto cambiano, questa cartella centrale deve essere aggiornata per aggiungere le nuove dipendenze. Copiare virtualenv è peggio che copiare i pacchetti, dato che tutti i pacchetti Python con i moduli C devono essere compilati per il sistema di destinazione. Il nostro team ha utenti sia Linux che OS X.

    (Questo appare ancora come la migliore opzione di un cattivo gruppo.)

  5. L'utilizzo di un intelligente delega PyPI caching: collective.eggproxy

    Questo mi sembra che sarebbe una soluzione molto buona, ma the last version on PyPI is dated 2009 e discute mod_python.

Cosa fanno altri grandi team Python? Qual è la soluzione migliore per installare rapidamente lo stesso set di pacchetti Python?

Note:

+1

Personalmente, quando ero in una situazione in cui avevo bisogno di scrivere la creazione (ripetuta) di un virtualenv, ho appena creato file .egg per i pacchetti che volevo e li ho controllati nel repository insieme allo script per creare il virtualenv. Non pretendo di far parte del grande team Python, comunque. – FatalError

risposta

26

Hai un filesystem condiviso?

Perché vorrei utilizzare l'impostazione della cache di pip. È piuttosto semplice Ad esempio, crea una cartella chiamata pip-cache in/mnt.

mkdir /mnt/pip-cache 

Poi ogni sviluppatore avrebbe messo la seguente riga nella loro configurazione pip (unix = $ HOME/.pip/pip.conf, vincere =% HOME% \ pip \ pip.ini)

[global] 
download-cache = /mnt/pip-cache 

Controlla ancora PyPi, cerca l'ultima versione. Quindi controlla se quella versione è nella cache. Se è così, lo installa da lì. Se non lo scarica. Lo memorizza nella cache e lo installa. Quindi ogni pacchetto verrebbe scaricato solo una volta per ogni nuova versione.

+1

Questa sembra una fantastica opzione. Il tuo esempio pip.conf non è corretto però - non ci dovrebbe essere un rientro o Pip muore con "ConfigParser.ParsingError: File contiene errori di analisi". Lo modificherei da solo, ma SO non mi consente di apportare piccole modifiche. –

+0

corretto! Grazie Wilfred. – aychedee

+0

L'ho provato e funziona perfettamente. Vorrei poterti invogliare di più, grazie. Complimenti per non considerare solo il modo migliore per eseguire un server. –

-1

Setup server locale quindi modificare file host del computer locale per sovrascrivere l'URL reale per puntare invece al server locale saltando così il DNS standard. Quindi elimina la riga nel file host se hai finito.

O suppongo che potresti trovare l'URL in pip e modificarlo.

9

Mentre non risolve il problema di PyPI, la gestione di virtualenv creati per sviluppatori (o distribuzioni) può essere eseguita con Terrarium.

Utilizzare terrarium per comprimere, comprimere e salvare virtualenvs. È possibile memorizzarli localmente o anche store them on S3. Dalla documentazione su GitHub:

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

Dopo la costruzione di un ambiente fresco, terrario archivierà e comprimere l'ambiente, e quindi copiarlo nella posizione specificata dallo storage-dir.

Nelle installazioni successive per lo stesso set di requisiti che specifica la stessa directory di archiviazione, terrarium copia ed estrae l'archivio compresso da/mnt/storage.

Per visualizzare esattamente come terrario nominerà l'archivio, è possibile eseguire il seguente comando:

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

Grazie, non sapevo di Terrarium. Gestisce il caso della condivisione tra gli utenti di OS X e Linux? Abbiamo entrambi i moduli pure-python e C quindi dubito che i pacchetti compilati saranno multipiattaforma. –

+0

Vorrei davvero saperlo. :(Non ho un Mac (anche se mi piacerebbe averne uno ...) Se avrò la possibilità, vedrò cosa riesco a capire. Ho solo iniziato a usare questo pacchetto da PyCon 2013 (sentito –

+3

Autore del terrario qui I pacchetti compilati non saranno multipiattaforma, il terrario non risolve questo problema Se i tuoi requisiti non cambiano così spesso, significa solo che il primo utente di ciascun tipo di piattaforma che esegue il comando sarà il builder.Tutti i successivi corridori di comando (prima di cambiare un altro requisito) tireranno giù la versione preinstallata Sembra che terrarium sia un'interfaccia di comando di facile utilizzo per quello che già proverai a fare manualmente.Se trovi problemi che ti impediscono di usarlo in questo modo, fammi sapere. –

3

Date un'occhiata a David Wolever di pip2pi. Puoi semplicemente impostare un cron job per mantenere uno specchio della società o del gruppo dei pacchetti di cui hai bisogno, quindi puntare i tuoi pip verso il tuo mirror interno.

7

Ho installato di recente devpi nella configurazione di Vagrant del mio team di sviluppo in modo che la cache del pacchetto risieda nel file system dell'host. Ciò consente a ciascuna VM di disporre del proprio daemon devpi-server che utilizza come indice-url per virtualenv/pip. Quando le macchine virtuali vengono distrutte e rimasterizzate, i pacchetti non devono essere scaricati più e più volte. Ogni sviluppatore li scarica una volta per creare la cache locale per tutto il tempo in cui vive sul file system dell'host.

Abbiamo anche un indice PyPi interno per i nostri pacchetti privati ​​che al momento è solo una directory servita da Apache. In definitiva, lo convertirò anche in un server proxy devpi, così il nostro server di compilazione manterrà anche una cache di pacchetti per le nostre dipendenze Python oltre ad ospitare le nostre librerie private. Ciò creerà un ulteriore buffer tra il nostro ambiente di sviluppo, le distribuzioni di produzione e il PyPi pubblico.

Questa sembra essere la soluzione più robusta che ho trovato finora per questi requisiti.

+2

Ho cercato personale/server Pypi privati ​​un po 'e deve confermare, devpi sembra essere il migliore di loro. L'autore di devpi è anche autore di pytest e tox e quindi si aspetta di trovare un ottimo supporto per lo sviluppo e il test. –

Problemi correlati