Kā izmantot GitHub kā PyPi serveri

Es meklēju mitinātu privātu PyPi Python Package serveri, kurā tika izmantoti komandas jau esošie akreditācijas dati (piemēram, GitHub).

Es negribēju izveidot lokālu serveri. Mums tas padarītu neiespējamu mākoņa bāzes serveru izmantošanu, un tā var būt nepareiza. Iespējamas problēmas arī ar precīzu drošību un ātrumu. (Mums ir pasaules mēroga komanda, tāpēc būtu noderīgi apkalpot saturu, izmantojot CDN.)

Es negribēju piespiest komandu izveidot kontus pie cita pakalpojumu sniedzēja. Viņiem jau ir Active Directory un GitHub konti. Tas viņus kaitina un rada man pārvaldības slogu.

Diemžēl es nevarēju atrast šādu pakalpojumu. GemFury ir lielisks, taču neatbalsta GitHub autorizāciju (komandas / organizācijas līmenī), un Packagr vispār neatbalsta GitHub autorizāciju. MyGet ir arī lielisks, tas ļauj man izmantot GitHub autorizāciju, bet neuzņem Python paketes. Azure DevOps ir kaut kas daudzsološs, taču pašlaik tas ir privātā beta versijā.

Par laimi, tas ir iespējams, izmantojot mākoņa Git krātuves, piemēram, GitHub, GitLab un BitBucket.

Pip var instalēt paketes no Git

Es GitHub (python_world) esmu mitinājis Python pakotni, kuru varat instalēt ar šādu komandu (pirms šīs komandas izpildīšanas un koda instalēšanas datorā pārliecinieties, vai man uzticaties).

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

Pip nodrošina iespējas instalēt no galvas, no filiāles, no taga vai no saistības. Katru laidienu es parasti atzīmēju un instalēju no šiem tagiem. Pilnu informāciju skatiet pip instalēšanas dokumentācijā.

Šī krātuve ir publiska, taču tā darbojas tāpat kā ar privātu repo, ja vien jums ir atļauja. Īpašas burvju nav (tā ir vaniļas Python pakete), un Setup.py lielāko daļu darba veic kā parasti.

Ja esat jauns Python pakotņu izveide, Packaging Python Projects apmācību ir vērts ātri izlasīt.

Setuptools var arī instalēt atkarības no Git

Setuptools ir veids, kā lielākā daļa cilvēku izveido Python paketes.

Vietnē GitHub python_hello esmu mitinājis vēl vienu pakotni, kas ir atkarīga no python_world. (Es esmu pārliecināts, ka jūs varat redzēt, kur tas notiek.)

Attiecīgie biti no setup.py ir zemāk. install_requiresnorāda python_worldnepieciešamo atkarību un norāda Setuptools, kur to atrast.

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

Jūs varat instalēt šo pakotni, izmantojot zemāk esošo komandu. Tas arī lejupielādēs atkarīgo python_worldpakotni.

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

Šī saite ir saistīta ar noteiktu versiju python_world, kas ir kauns, jo tas nozīmē, ka pip nevar veikt nekādu atkarības pārvaldību (piemēram, izstrādāt pieņemamu versiju, ja uz to ir atkarīgas vairākas lietas). Tomēr līdz šī raksta beigām mēs noņemsim nepieciešamību pēc īpašās saites.

Python vides

Kā zina visi, kas ir izmantojuši Python bez vides, vide ietaupa daudz neapmierinātības un izšķērdēta laika. Tāpēc mums tie jāatbalsta.

Esmu izveidojis repo (use-hello-world), kas definēts python_hellokā atkarība no prasībām.txt uz Virtualenv un environment.yml par Conda.

Ja lejupielādējat repo, varat instalēt atkarības virtuālajā env, izmantojot šādu komandu.

pip install -r requirements.txt

Ja izmantojat conda, varat izmantot šo komandu:

conda env create -n use-hello-world

PyPi indekss

Līdz šim mēs varam instalēt paketes no mūsu privātajiem Git krātuvēm. Šīs paketes savukārt var noteikt atkarību no citiem privātajiem krātuvēm. Joprojām nav redzams PyPi serveris.

Šajā brīdī mēs varētu apstāties. Tomēr atkarību noteikšanas sintakse ir nedaudz noslēpumaina. Komandai būtu grūti atklāt, kuras pakotnes ir pieejamas, un mēs saistāmies ar konkrētām atkarīgo pakotņu versijām, nevis ļaujam pipi to pārvaldīt.

Lai to labotu, mēs varam izveidot PyPi indeksu, kas atbilst Pep 503. Šī specifikācija ir diezgan vienkārša, un es tikko izveidoju indeksu ar rokām. Ja tas kļūst pārāk apgrūtinošs, es to varu ģenerēt no GitHub API.

Es izveidoju šo PyPi indeksu, izmantojot GitHub Pages. Ir līdzvērtīgas lietas GitLab un BitBucket. Var redzēt, ka pirmkods ir ļoti vienkāršs. GitHub Pages vietnes vienmēr ir publiskas (un, iespējams, jūsu rādītājā nav sensitīvas informācijas). Tomēr, ja jums ir nepieciešams, lai tie būtu privāti, varat izmantot tādu pakalpojumu kā PrivateHub.

Viena lieta, kas jāpievērš uzmanība, ir nosaukuma normalizēšana specifikācijā. Tam ir nepieciešama informācija par python_hellopaketi python-hello/index.html(ņemiet vērā izmaiņas no pasvītras uz domuzīmi).

Tagad, kad mums ir PyPi serveris, mēs varam instalēt paketes, izmantojot zemāk esošo komandu.

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

Lai jūs varētu redzēt, kā tas darbojas ar vidēm, esmu izveidojis citu repo (use_hello_world_from_server), kas nosaka python_helloatkarību, izmantojot šo PyPi indeksu, nevis tiešās GitHub saites. Ja to izmēģināt ar Conda, nepieciešama versija> 4.4.

Šajā brīdī mēs varam atgriezties un noņemt tiešo Git saiti vietnē install_requires vietnē python_hello setup.py (jo Setuptools to varēs atrast no mūsu servera).

Secinājumi

Mākoņa mitinātā Git nodrošinātāja izmantošana kā PyPi serveris ir reāla iespēja. Ja jūs jau to izmantojat, tas nozīmē, ka varat atkārtoti izmantot jau esošos akreditācijas datus un atļaujas. Tas darbosies ar Cloud build serveriem un, visticamāk, tiks nodrošināts caur CDN, tāpēc visā pasaulē tas būs ātrs. Lai to izveidotu, ir nepieciešamas vairāk zināšanu nekā mitinātajam serverim, taču, iespējams, tās pašas vai mazāk nekā sava servera mitināšana telpās.

Padomi un padomi

Indeksa apkalpošana lokāli var palīdzēt novērst problēmas (piemēram, nosaukuma normalizēšanu). Ir viegli saprast, kādi pieprasījumi tiek veikti. Tam varat izmantot iebūvēto python HTTP serveri ( python -m Http.Server -8000). Tas man lika uzzināt, kas pip searchizmanto postpieprasījumus, tāpēc nedarbosies ar GitHub lapām.

Jūs varat palaist, python setup.py -installlai pārbaudītu jūsu pip pakotnes lokāli, pirms virzāt tos uz Git.