Sådan bruges GitHub som en PyPi-server

Jeg ledte efter en hostet privat PyPi Python Package-server, der brugte legitimationsoplysninger, som teamet allerede har (såsom GitHub).

Jeg ville ikke oprette en server på stedet. For os ville det gøre det umuligt at bruge skybaserede build-servere, og det er en anden bevægelig del, der kan gå galt. Der er også potentielle problemer med finkornet sikkerhed og hastighed. (Vi har et verdensomspændende team, så det ville være nyttigt at betjene indholdet via et CDN.)

Jeg ville ikke tvinge holdet til at oprette konti hos en anden udbyder. De har allerede Active Directory- og GitHub-konti. Det er en irritation for dem og skaber en regeringsbyrde for mig.

Desværre kunne jeg ikke finde sådan en tjeneste. GemFury er fremragende, men understøtter ikke GitHub-godkendelse (på team- / organisationsniveau), og Packagr understøtter slet ikke GitHub-godkendelse. MyGet er også fremragende, det tillader mig at bruge GitHub-godkendelse, men er ikke vært for Python-pakker. Azure DevOps har noget, der ser lovende ud, men det er i privat beta i øjeblikket.

Heldigvis er dette muligt ved hjælp af cloud Git-arkiver som GitHub, GitLab og BitBucket.

Pip kan installere pakker fra Git

Jeg har været vært for en Python-pakke på GitHub (python_world), som du kan installere med følgende kommando (sørg for at stole på mig, før du kører denne kommando og installerer min kode på din computer).

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

Pip giver mulighed for at installere fra hoved, fra en gren, fra et tag eller fra en commit. Jeg mærker normalt hver udgivelse og installerer fra disse tags. Se pip-installationsdokumentationen for alle detaljer.

Dette arkiv er offentligt, men det fungerer på samme måde med en privat repo, så længe du har tilladelse. Der er ingen særlig magi (det er en vanilje-Python-pakke), og Setup.py udfører det meste af arbejdet som normalt.

Hvis du er ny med at oprette Python-pakker, er vejledningen Packaging Python Projects værd at læse hurtigt.

Setuptools kan også installere afhængigheder fra Git

Setuptools er, hvordan de fleste mennesker opretter Python-pakker.

Jeg har været vært for en anden pakke på GitHub python_hello, som afhænger af python_world. (Jeg er sikker på at du kan se, hvor dette går hen.)

De relevante bits fra setup.py er nedenfor. install_requiresangiver, at der python_worlder en nødvendig afhængighed, og fortæller Setuptools, hvor den skal findes.

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

Du kan installere denne pakke ved hjælp af kommandoen nedenfor. Det vil også downloade den afhængige python_worldpakke.

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

Dette linker til en bestemt version af python_world, hvilket er en skam, da det betyder, at pip ikke kan foretage nogen afhængighedsstyring (såsom at arbejde med en acceptabel version, hvis flere ting er afhængige af det). Imidlertid vil vi ved afslutningen af ​​denne artikel have fjernet behovet for det specifikke link.

Python-miljøer

Som alle, der har brugt Python uden miljø, ved, sparer miljøer meget frustration og spildt tid. Så vi er nødt til at støtte dem.

Jeg har oprettet en repo (brug-hej-verden), der definerer python_hellosom en afhængighed i krav.txt til Virtualenv og miljø.yml til Conda.

Hvis du downloader repoen, kan du installere afhængighederne i en virtualenv med følgende kommando.

pip install -r requirements.txt

Hvis du bruger conda, kan du bruge denne kommando:

conda env create -n use-hello-world

PyPi-indeks

Indtil videre er vi i stand til at installere pakker fra vores private Git-arkiver. Disse pakker kan til gengæld definere afhængigheder til andre private arkiver. Der er stadig ikke en PyPi-server i syne.

Vi kunne stoppe på dette tidspunkt. Syntaksen til at definere afhængigheder er dog lidt mystisk. Det ville være vanskeligt for holdet at finde ud af, hvilke pakker der er tilgængelige, og vi linker til specifikke versioner af afhængige pakker i stedet for at lade pip administrere det.

For at løse dette kan vi oprette et PyPi-indeks, der overholder Pep 503. Denne specifikation er ret enkel, og jeg har lige oprettet indekset manuelt. Hvis dette bliver for besværligt, kan jeg generere det fra GitHub API.

Jeg oprettede dette PyPi-indeks ved hjælp af GitHub-sider. Der er tilsvarende ting for GitLab og BitBucket. Du kan se, at kildekoden er meget enkel. GitHub Pages-sider er altid offentlige (og der er sandsynligvis ingen følsomme oplysninger i dit indeks). Men hvis du har brug for dem for at være private, kan du bruge en tjeneste som f.eks. PrivateHub.

En ting at passe på er navnet normalisering af specifikationen. Dette kræver, at python_hellopakkeoplysningerne skal være til stede python-hello/index.html(bemærk ændringen fra understregning til bindestreg).

Nu hvor vi har en PyPi-server, kan vi installere pakker ved hjælp af kommandoen nedenfor.

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

For at du kan se dette arbejde med miljøer, har jeg oprettet en anden repo (use_hello_world_from_server), der definerer python_helloafhængigheden ved hjælp af dette PyPi-indeks i stedet for direkte GitHub Links. Hvis du prøver det med Conda, kræves version> 4.4.

På dette tidspunkt kan vi gå tilbage og fjerne det direkte Git-link i install_requires i setup.py af python_hello (da Setuptools vil være i stand til at finde det fra vores server).

Konklusioner

Brug af en cloud-hostet Git-udbyder som en PyPi-server er en levedygtig mulighed. Hvis du allerede bruger en, betyder det, at du kan genbruge de legitimationsoplysninger og tilladelser, du allerede har. Det fungerer med Cloud build-servere og vil sandsynligvis blive leveret via et CDN, så det vil være hurtigt over hele verden. Det kræver mere viden at opsætte end en hostet server, men sandsynligvis den samme eller mindre end at være vært for din egen server lokalt.

Tip og tip

Betjening af indekset lokalt kan hjælpe med at foretage fejlfinding af problemer (såsom navnenormalisering). Det er let at se, hvilke anmodninger der fremsættes. Du kan bruge den indbyggede python HTTP-server til dette ( python -m Http.Server -8000). Dette fik mig til at finde ud af, der pip searchbruger postanmodninger, så det fungerer ikke med GitHub-sider.

Du kan køre for python setup.py -installat kontrollere dine pip-pakker lokalt, inden du skubber dem til Git.