Як використовувати GitHub як сервер PyPi

Я шукав розміщений приватний сервер PyPi Python Package, який використовував облікові дані, які команда вже має (наприклад, GitHub).

Я не хотів створювати локальний сервер. Для нас це унеможливить використання хмарних серверів збірки, і це ще одна рухлива частина, яка може піти не так. Існують також потенційні проблеми з дрібною безпекою та швидкістю. (У нас є команда по всьому світу, тому обслуговування вмісту через CDN було б корисним.)

Я не хотів змушувати команду створювати облікові записи у іншого постачальника. Вони вже мають облікові записи Active Directory та GitHub. Це дратує їх і створює для мене тягар управління.

На жаль, я не зміг знайти таку послугу. GemFury відмінний, але не підтримує авторизацію GitHub (на рівні команди / організації), а Packagr взагалі не підтримує авторизацію GitHub. MyGet також чудовий, він дозволяє мені використовувати авторизацію GitHub, але не розміщує пакети Python. У Azure DevOps є щось, що виглядає багатообіцяючим, але на даний момент це приватна бета-версія.

На щастя, це можливо за допомогою хмарних сховищ Git, таких як GitHub, GitLab та BitBucket.

Pip може встановлювати пакети з Git

Я розмістив на GitHub пакет Python (python_world), який ви можете встановити за допомогою наступної команди (переконайтеся, що довіряєте мені, перш ніж запускати цю команду та встановлювати мій код на свій комп’ютер).

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

Pip надає варіанти встановлення з голови, з гілки, з тегу або з коміту. Зазвичай я тегую кожен випуск і встановлюю з цих тегів. Для отримання детальної інформації див. Документацію щодо встановлення pip.

Це сховище є загальнодоступним, але воно працює однаково з приватним репозитарієм, якщо у вас є дозвіл. Немає особливої ​​магії (це ванільний пакет Python), і Setup.py виконує більшу частину роботи як зазвичай.

Якщо ви новачок у створенні пакетів Python, підручник з пакувань Python Projects вартий швидкого прочитання.

Налаштування також можуть встановлювати залежності від Git

Setuptools - це те, як більшість людей створюють пакети Python.

Я розмістив ще один пакет на GitHub python_hello, який залежить від python_world. (Я впевнений, ви бачите, куди це йде.)

Відповідні біти з setup.py наведені нижче. install_requiresвизначає python_worldнеобхідну залежність і повідомляє Setuptools, де її знайти.

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

Ви можете встановити цей пакет за допомогою команди нижче. Він також завантажить залежний python_worldпакет.

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

Це посилання на конкретну версію python_world, що є ганьбою, оскільки це означає, що pip не може керувати залежностями (наприклад, розробляти прийнятну версію, якщо на неї залежить багато речей). Однак до кінця цієї статті ми скасуємо необхідність в конкретному посиланні.

Середовища Python

Як відомо кожному, хто використовував Python без навколишнього середовища, середовища економить багато розчарувань і витрачають час. Тож нам потрібно їх підтримати.

Я створив репо (use-hello-world), яке визначається python_helloяк залежність в requirements.txt для Virtualenv та environment.yml для Conda.

Якщо ви завантажуєте репо, ви можете встановити залежності у virtualenv за допомогою наступної команди.

pip install -r requirements.txt

Якщо ви використовуєте conda, ви можете скористатися цією командою:

conda env create -n use-hello-world

Індекс PyPi

Поки що ми можемо встановлювати пакети з наших приватних сховищ Git. Ці пакети можуть, у свою чергу, визначати залежності до інших приватних сховищ. Досі немає сервера PyPi в полі зору.

На цьому ми могли б зупинитися. Однак синтаксис визначення залежностей трохи загадковий. Команді буде важко виявити, які пакети доступні, і ми посилаємося на конкретні версії залежних пакунків, замість того, щоб дозволити pip керувати нею.

Щоб це виправити, ми можемо встановити індекс PyPi, який відповідає Pep 503. Ця специфікація досить проста, і я щойно створив індекс вручну. Якщо це стає занадто громіздким, я можу згенерувати його з API GitHub.

Я створив цей індекс PyPi за допомогою сторінок GitHub. Для GitLab та BitBucket існують еквівалентні речі. Ви бачите, що вихідний код дуже простий. Сайти GitHub Pages завжди є загальнодоступними (і у вашому індексі, ймовірно, немає конфіденційної інформації). Однак якщо вам потрібно, щоб вони були приватними, ви можете скористатися такою послугою, як PrivateHub.

Одне, на що слід звернути увагу, це нормалізація назви специфікації. Це вимагає наявності python_helloінформації про пакет python-hello/index.html(зверніть увагу на зміну від підкреслення до тире).

Тепер, коли у нас є сервер PyPi, ми можемо встановлювати пакети, використовуючи команду нижче.

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

Щоб ви могли бачити, як це працює з середовищами, я створив ще одне репо (use_hello_world_from_server), яке визначає python_helloзалежність, використовуючи цей індекс PyPi замість прямих посилань GitHub. Якщо ви намагаєтеся з Conda, потрібна версія> 4.4.

На цьому етапі ми можемо повернутися назад і видалити пряме посилання Git у install_requires у setup.py python_hello (оскільки Setuptools зможе знайти його з нашого сервера).

Висновки

Використання хмарного провайдера Git як сервера PyPi є життєздатним варіантом. Якщо ви вже використовуєте його, це означає, що ви можете повторно використовувати облікові дані та дозволи, які у вас уже є. Він буде працювати з хмарними серверами збірки і, ймовірно, буде надаватися через CDN, тому буде швидким у всьому світі. Для налаштування потрібно більше знань, ніж розміщений сервер, але, можливо, такий самий або менше, ніж розміщення власного сервера в приміщенні.

Підказки та поради

Місцеве обслуговування індексу може допомогти усунути проблеми (наприклад, нормалізацію імен). Легко побачити, які запити надходять. Для цього ви можете використовувати вбудований HTTP-сервер python ( python -m Http.Server -8000). Це змусило мене з’ясувати, що pip searchвикористовує postзапити, тому не буде працювати зі сторінками GitHub.

Ви можете запустити python setup.py -installперевірку своїх піп-пакетів локально, перед тим як надсилати їх до Git.