Hoe GitHub als PyPi-server te gebruiken

Ik was op zoek naar een gehoste privé PyPi Python-pakketserver, die referenties gebruikte die het team al heeft (zoals GitHub).

Ik wilde geen lokale server maken. Voor ons zou het het onmogelijk maken om cloudgebaseerde build-servers te gebruiken, en het is een ander bewegend onderdeel dat fout kan gaan. Er zijn ook potentiële problemen met fijnmazige beveiliging en snelheid. (We hebben een wereldwijd team, dus het aanbieden van de inhoud via een CDN zou nuttig zijn.)

Ik wilde het team niet dwingen om accounts aan te maken bij een andere provider. Ze hebben al Active Directory- en GitHub-accounts. Het is voor hen een ergernis en een bestuurlijke last voor mij.

Helaas kon ik zo'n dienst niet vinden. GemFury is uitstekend, maar ondersteunt geen GitHub-autorisatie (op team- / organisatieniveau) en Packagr ondersteunt helemaal geen GitHub-autorisatie. MyGet is ook uitstekend, ik kan wel GitHub-autorisatie gebruiken, maar host geen Python-pakketten. Azure DevOps heeft iets dat er veelbelovend uitziet, maar het is momenteel in privé-bèta.

Gelukkig is dit mogelijk met behulp van Git-repositories in de cloud, zoals GitHub, GitLab en BitBucket.

Pip kan pakketten installeren vanuit Git

Ik heb een Python-pakket gehost op GitHub (python_world), dat je kunt installeren met het volgende commando (zorg ervoor dat je me vertrouwt voordat je dit commando uitvoert en mijn code op je computer installeert).

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

Pip biedt opties om te installeren vanaf head, vanuit een branch, vanuit een tag of vanuit een commit. Meestal tag ik elke release en installeer ik vanuit deze tags. Zie de pip-installatiedocumentatie voor volledige details.

Deze repository is openbaar, maar het werkt precies hetzelfde met een privé-repository, zolang je toestemming hebt. Er is geen speciale magie (het is een vanille Python-pakket) en Setup.py doet het meeste werk zoals normaal.

Als u nieuw bent bij het maken van Python-pakketten, is de tutorial Python Projects-verpakking inpakken de moeite waard om snel te lezen.

Setuptools kan ook afhankelijkheden installeren vanuit Git

Setuptools is hoe de meeste mensen Python-pakketten maken.

Ik heb een ander pakket gehost op GitHub python_hello, dat afhangt van python_world. (Ik weet zeker dat je kunt zien waar dit heen gaat.)

De relevante bits van setup.py staan ​​hieronder. install_requiresspecificeert dat python_worlddit een vereiste afhankelijkheid is en vertelt Setuptools waar het te vinden is.

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

U kunt dit pakket installeren met de onderstaande opdracht. Het zal ook het afhankelijke python_worldpakket downloaden .

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

Dit linkt naar een specifieke versie van python_world, wat jammer is, want het betekent dat pip geen afhankelijkheidsbeheer kan uitvoeren (zoals het uitwerken van een acceptabele versie als er meerdere dingen van afhankelijk zijn). Aan het einde van dit artikel hebben we de behoefte aan de specifieke link echter verwijderd.

Python-omgevingen

Zoals iedereen die Python heeft gebruikt zonder een omgeving weet, besparen omgevingen veel frustratie en tijdverspilling. Die moeten we dus ondersteunen.

Ik heb een repo gemaakt (use-hello-world) die wordt gedefinieerd python_helloals een afhankelijkheid in requirements.txt voor Virtualenv en environment.yml voor Conda.

Als u de repo downloadt, kunt u de afhankelijkheden in een virtualenv installeren met het volgende commando.

pip install -r requirements.txt

Als u conda gebruikt, kunt u deze opdracht gebruiken:

conda env create -n use-hello-world

PyPi-index

Tot nu toe zijn we in staat om pakketten te installeren vanuit onze privé Git-repositories. Deze pakketten kunnen op hun beurt afhankelijkheden met andere privérepository's definiëren. Er is nog steeds geen PyPi-server in zicht.

We zouden op dit punt kunnen stoppen. De syntaxis voor het definiëren van afhankelijkheden is echter een beetje mysterieus. Het zou moeilijk zijn voor het team om te ontdekken welke pakketten beschikbaar zijn, en we linken naar specifieke versies van afhankelijke pakketten, in plaats van het door pip te laten beheren.

Om dit op te lossen kunnen we een PyPi-index opzetten die voldoet aan Pep 503. Deze specificatie is vrij eenvoudig en ik heb de index zojuist met de hand gemaakt. Als dit te omslachtig wordt, kan ik het genereren vanuit de GitHub API.

Ik heb deze PyPi-index gemaakt met GitHub-pagina's. Er zijn gelijkwaardige dingen voor GitLab en BitBucket. Je kunt zien dat de broncode heel eenvoudig is. GitHub Pages-sites zijn altijd openbaar (en er is waarschijnlijk geen gevoelige informatie in uw index). Als u ze echter privé wilt hebben, kunt u een service zoals PrivateHub gebruiken.

Een ding om op te letten is de naamnormalisatie van de specificatie. Dit vereist dat de python_hellopakketinformatie aanwezig is op python-hello/index.html(let op de verandering van een onderstrepingsteken naar een streepje).

Nu we een PyPi-server hebben, kunnen we pakketten installeren met de onderstaande opdracht.

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

Zodat je dit kunt zien werken met omgevingen, heb ik een andere repo gemaakt (use_hello_world_from_server) die de python_helloafhankelijkheid definieert met behulp van deze PyPi-index in plaats van directe GitHub-links. Als u het probeert met Conda, is versie> 4.4 vereist.

Op dit punt kunnen we teruggaan en de directe Git-link verwijderen in install_requires in setup.py van python_hello (aangezien Setuptools het kan vinden vanaf onze server).

Conclusies

Het gebruik van een in de cloud gehoste Git-provider als PyPi-server is een haalbare optie. Als u er al een gebruikt, betekent dit dat u de inloggegevens en machtigingen die u al heeft opnieuw kunt gebruiken. Het werkt met Cloud build-servers en wordt waarschijnlijk geleverd via een CDN, dus het zal wereldwijd snel zijn. Het vereist meer kennis om op te zetten dan een gehoste server, maar waarschijnlijk hetzelfde of minder dan het hosten van uw eigen server op locatie.

Hints en tips

Het lokaal aanbieden van de index kan helpen bij het oplossen van problemen (zoals naamnormalisatie). Het is gemakkelijk om te zien welke verzoeken er worden gedaan. U kunt hiervoor de ingebouwde python HTTP-server gebruiken ( python -m Http.Server -8000). Dit bracht me ertoe om erachter te komen dat verzoeken pip searchgebruikt post, dus niet werken met GitHub-pagina's.

U kunt python setup.py -installuw pip-pakketten lokaal controleren voordat u ze naar Git pusht.