Hogyan kell használni a GitHub-ot PyPi-kiszolgálóként

Olyan hosztolt privát PyPi Python Package kiszolgálót kerestem, amely a csapat már rendelkezik hitelesítő adatokkal (például GitHub).

Nem akartam helyszíni szervert létrehozni. Számunkra ez lehetetlenné tenné a felhőalapú build szerverek használatát, és ez egy másik mozgó rész, amely hibás lehet. A finom szemcsés biztonsággal és a sebességgel is vannak potenciális problémák. (Világméretű csapatunk van, ezért hasznos lenne a tartalom CDN-n keresztül történő kiszolgálása.)

Nem akartam arra kényszeríteni a csapatot, hogy számlákat hozzon létre egy másik szolgáltatónál. Már rendelkeznek Active Directory és GitHub fiókkal. Ez bosszúságot jelent számukra, és kormányzási terhet jelent számomra.

Sajnos nem találtam ilyen szolgáltatást. A GemFury kiváló, de nem támogatja a GitHub engedélyezést (csapat / szervezet szinten), a Packagr pedig egyáltalán nem támogatja a GitHub engedélyezést. A MyGet szintén kiváló, lehetővé teszi a GitHub engedélyezés használatát, de nem üzemeltet Python csomagokat. Az Azure DevOps-nak van valami, ami ígéretesnek tűnik, de jelenleg privát bétaverzióban van.

Szerencsére ez lehetséges a felhő Git tárházak, például a GitHub, a GitLab és a BitBucket használatával.

A Pip csomagokat telepíthet a Gitből

Tároltam egy Python csomagot a GitHub-on (python_world), amelyet a következő paranccsal telepíthet (győződjön meg róla, hogy megbízik bennem, mielőtt futtatja ezt a parancsot, és telepíti a kódomat a számítógépére).

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

A Pip lehetőséget kínál a telepítésre fejből, ágból, címkéből vagy elkötelezettségből. Az egyes kiadásokat általában ezekről a címkékről címkézem és telepítem. A részletekért lásd a pip install dokumentációját.

Ez az adattár nyilvános, de ugyanúgy működik egy privát repóval is, amennyiben van engedélye. Nincs külön varázslat (ez egy vanília Python csomag), és a Setup.py a legtöbb munkát a szokásos módon végzi.

Ha még nem ismeri a Python-csomagok létrehozását, akkor a Packaging Python Projects oktatóanyagot érdemes gyorsan elolvasni.

A Setuptools telepítheti a Git függőségeit is

A legtöbb ember a Setuptools segítségével készít Python csomagokat.

Tároltam még egy csomagot a GitHub python_hello oldalon, amely a python_world függvénye. (Biztos vagyok benne, hogy láthatja, merre tart ez.)

A setup.py megfelelő bitjei alább találhatók. install_requiresmegadja, hogy python_worldmelyik függőség szükséges, és megmondja a Setuptools-nak, hol találja meg.

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

Az alábbi paranccsal telepítheti ezt a csomagot. Letölti a függő python_worldcsomagot is.

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

Ez a (z) egy adott verziójához kapcsolódik python_world, ami szégyen, mivel azt jelenti, hogy a pip nem tud semmilyen függőségkezelést végrehajtani (például elfogadható verziót dolgozhat ki, ha több dolog támaszkodik rá). Ennek a cikknek a végére azonban eltávolítottuk az adott link szükségességét.

Python környezetek

Mint mindenki tudja, aki környezet nélkül használta a Pythont, a környezetek sok csalódást és pazarolt időt spórolnak meg. Tehát támogatnunk kell ezeket.

Létrehoztam egy repót (use-hello-world), amely python_helloa követelmények.txt függőségeként határozza meg a Virtualenv-t, a environment.yml pedig a Conda-t.

Ha letölti a repót, a következő paranccsal telepítheti a függőségeket a virtualenv-be.

pip install -r requirements.txt

Ha condát használ, használhatja ezt a parancsot:

conda env create -n use-hello-world

PyPi Index

Eddig képesek vagyunk a Git privát tárházainkból csomagokat telepíteni. Ezek a csomagok viszont meghatározhatják a függőségeket más privát tárolóktól. Még mindig nincs PyPi szerver a láthatáron.

Ezen a ponton megállhatunk. A függőségek meghatározásának szintaxisa azonban kissé rejtélyes. A csapat számára nehéz lenne felfedezni, hogy mely csomagok állnak rendelkezésre, és a függő csomagok konkrét verzióihoz kapcsolódunk, ahelyett, hogy hagynánk a pip kezelni.

Ennek kijavításához létrehozhatunk egy PyPi indexet, amely megfelel a Pep 503-nak. Ez a specifikáció meglehetősen egyszerű, és most készítettem kézzel az indexet. Ha ez túl nehézkessé válik, akkor előállíthatom a GitHub API-ból.

Ezt a PyPi indexet a GitHub Pages segítségével hoztam létre. A GitLab és a BitBucket esetében vannak egyenértékű dolgok. Láthatja, hogy a forráskód nagyon egyszerű. A GitHub Pages webhelyek mindig nyilvánosak (és valószínűleg nincsenek érzékeny információk az indexében). Ha azonban magánéletre van szükséged, használhatsz olyan szolgáltatást, mint a PrivateHub.

Egy dologra figyelni kell, a specifikáció név normalizálása. Ehhez meg kell python_helloadni a csomaginformációkat python-hello/index.html(vegye figyelembe az aláhúzásból a kötőjelbe történő változást).

Most, hogy PyPi szerverünk van, az alábbi paranccsal telepíthetjük a csomagokat.

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

Annak érdekében, hogy láthassa ezt a környezetekkel való együttműködésben, létrehoztam egy másik repót (use_hello_world_from_server), amely python_helloa közvetlen GitHub Linkek helyett a PyPi index használatával határozza meg a függőséget. Ha a Condával próbálkozik, akkor a> 4.4-es verzióra van szükség.

Ezen a ponton visszaléphetünk és eltávolíthatjuk a közvetlen Git hivatkozást az install_requires fájlban a python_hello setup.py fájljában (mivel a Setuptools képes lesz megtalálni a szerverünkről).

Következtetések

A felhőben tárolt Git szolgáltató PyPi-kiszolgálóként történő használata életképes lehetőség. Ha már használ egyet, ez azt jelenti, hogy újból felhasználhatja a már meglévő hitelesítő adatokat és engedélyeket. A Cloud build szerverekkel fog működni, és valószínűleg CDN-en keresztül fogják biztosítani, így világszerte gyors lesz. Több tudást igényel a telepítése, mint egy hosztolt szerver, de valószínűleg ugyanannyi vagy kevesebb, mint a saját szerverének helyben történő tárolása.

Tanácsok és tippek

Az index helyi kiszolgálása segíthet a problémák (például a név normalizálása) elhárításában. Könnyen belátható, hogy milyen kérések érkeznek. Ehhez használhatja a beépített python HTTP szervert ( python -m Http.Server -8000). Ez arra késztetett, hogy megtudjam, hogy kéréseket pip searchhasznál post, ezért nem fog működni a GitHub-oldalakkal.

Futtathatja, python setup.py -installhogy helyben ellenőrizze a pip csomagjait, mielőtt Githez tolná őket.