Pertanyaan PyPI lambat. Bagaimana cara menjalankan server saya sendiri?


Ketika seorang pengembang baru bergabung dengan tim, atau Jenkins menjalankan build yang lengkap, saya perlu membuat virtualenv segar. Saya sering menemukan bahwa pengaturan virtualenv dengan Pip dan sejumlah besar (lebih dari 10) persyaratan membutuhkan waktu yang sangat lama untuk menginstal semuanya dari PyPI. Seringkali gagal sama sekali dengan:

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

Saya sadar tentang Pip --use-mirrors bendera, dan terkadang orang-orang di tim saya telah bekerja dengan menggunakan --index-url http://f.pypi.python.org/simple (atau cermin lain) sampai mereka memiliki cermin yang merespon secara tepat waktu. Kami berada di Inggris, tetapi ada cermin PyPI di Jerman, dan kami tidak memiliki masalah mengunduh data dari situs lain.

Jadi, saya sedang mencari cara untuk mencerminkan PyPI secara internal untuk tim kami.

Opsi yang saya lihat adalah:

  1. Menjalankan turunan PyPI saya sendiri. Ada implementasi resmi PyPI: CheeseShop serta beberapa implementasi pihak ketiga, seperti: djangopypi dan pypiserver (lihat catatan kaki)

    Masalah dengan pendekatan ini adalah saya tidak tertarik dengan fungsi PyPI lengkap dengan unggahan file, saya hanya ingin mencerminkan konten yang disediakan.

  2. Menjalankan cermin PyPI dengan pep381klien atau pypi-mirror.

    Sepertinya ini bisa berfungsi, tetapi membutuhkan mirror saya untuk mengunduh semuanya dari PyPI terlebih dahulu. Saya sudah menyiapkan contoh pengujian pep381client, tetapi kecepatan unduhan saya bervariasi antara 5 Kb / s dan 200 Kb / s (bit, bukan byte). Kecuali ada salinan arsip PyPI lengkap di suatu tempat, akan membutuhkan waktu berminggu-minggu untuk memiliki cermin yang berguna.

  3. Menggunakan proxy round-robin PyPI seperti yopypi.

    Ini tidak relevan sekarang http://pypi.python.org sendiri terdiri dari beberapa server yang berbeda secara geografis.

  4. Menyalin sekitar virtualenv antara pengembang, atau hosting folder dependensi proyek saat ini.

    Ini tidak skala: kami memiliki beberapa proyek Python yang berbeda yang dependensi berubah (perlahan) dari waktu ke waktu. Segera setelah dependensi perubahan proyek apa pun, folder pusat ini harus diperbarui untuk menambahkan dependensi baru. Menyalin virtualenv lebih buruk daripada menyalin paket-paketnya, karena setiap paket Python dengan modul C harus dikompilasi untuk sistem target. Tim kami memiliki pengguna Linux dan OS X.

    (Ini masih terlihat seperti pilihan terbaik dari kelompok yang buruk.)

  5. Menggunakan proxy caching PyPI cerdas: collective.eggproxy

    Sepertinya ini akan menjadi solusi yang sangat bagus, tapi versi terakhir pada PyPI adalah tanggal 2009 dan membahas mod_python.

Apa yang dilakukan tim Python besar lainnya? Apa solusi terbaik untuk segera menginstal paket python yang sama?

Catatan Kaki:


32
2018-03-21 19:11


asal


Jawaban:


Apakah Anda memiliki sistem file bersama?

Karena saya akan menggunakan pengaturan cache pip. Ini sangat sederhana. Buat folder bernama pip-cache di / mnt misalnya.

mkdir /mnt/pip-cache

Kemudian masing-masing pengembang akan menempatkan baris berikut ke dalam konfigurasi pip mereka (unix = $ HOME / .pip / pip.conf, win =% HOME% \ pip \ pip.ini)

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

Masih memeriksa PyPi, mencari versi terbaru. Kemudian periksa apakah versi itu ada di cache. Jika demikian menginstalnya dari sana. Jika tidak, unduh itu. Simpan di cache dan pasang. Jadi setiap paket hanya akan diunduh satu kali per versi baru.


27
2018-03-21 22:44



Meskipun itu tidak memecahkan masalah PyPI Anda, menyerahkan virtualenvs dibangun untuk pengembang (atau penyebaran) dapat dilakukan dengan Terrarium.

Menggunakan terarium untuk mengemas, mengompres, dan menyimpan virtualenvs. Anda dapat menyimpannya secara lokal atau bahkan simpan di S3. Dari dokumentasi di GitHub:

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

Setelah membangun lingkungan yang segar, terarium akan mengarsipkan dan mengompresi lingkungan, dan kemudian menyalinnya ke lokasi yang ditentukan oleh penyimpanan-dir.

Pada pemasangan berikutnya untuk set persyaratan yang sama yang menentukan penyimpanan-dir yang sama, terarium akan menyalin dan mengekstrak arsip yang dikompresi dari / mnt / penyimpanan.

Untuk menampilkan bagaimana tepatnya terarium akan memberi nama arsip, Anda dapat menjalankan perintah berikut:

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

9
2018-04-04 16:35



Saya baru saja menginstal devpi ke dalam konfigurasi Vagrant tim pengembangan saya sehingga cache paketnya hidup pada sistem file host. Ini memungkinkan setiap VM memiliki daemon devpi-servernya sendiri yang digunakan sebagai indeks-url untuk virtualenv / pip. Ketika VM dihancurkan dan dicabut kembali, paket tidak harus diunduh berulang kali. Setiap pengembang mengunduh mereka satu kali untuk membangun cache lokal mereka selama mereka tinggal di sistem file host.

Kami juga memiliki indeks PyPi internal untuk paket pribadi kami yang saat ini hanya sebuah direktori yang dilayani oleh Apache. Pada akhirnya, saya akan mengonversinya menjadi devpi proxy server juga jadi server build kami juga akan mempertahankan paket cache untuk dependensi Python kami selain untuk hosting perpustakaan pribadi kami. Ini akan membuat buffer tambahan antara lingkungan pengembangan kami, penyebaran produksi dan PyPi publik.

Ini tampaknya menjadi solusi paling kuat yang saya temukan untuk persyaratan ini hingga saat ini.


7
2018-01-28 20:51



Lihatlah David Wolever pip2pi. Anda hanya dapat mengatur tugas cron untuk menjaga cermin perusahaan atau tim dari paket yang Anda butuhkan, dan kemudian arahkan pips Anda ke arah cermin internal Anda.


3
2018-04-25 18:40



Setup server lokal Anda kemudian memodifikasi file host komputer lokal untuk menimpa URL yang sebenarnya untuk menunjuk ke server lokal sehingga melewatkan DNS standar. Kemudian hapus baris di file host jika Anda selesai.

Atau saya kira Anda bisa menemukan URL di pip dan mengubahnya.


-1
2018-03-21 22:29