Cómo usar GitHub como servidor PyPi

Estaba buscando un servidor de paquetes PyPi Python privado alojado, que usara credenciales que el equipo ya tiene (como GitHub).

No quería crear un servidor local. Para nosotros, haría imposible el uso de servidores de compilación basados ​​en la nube, y es otra parte móvil que puede salir mal. También existen problemas potenciales con la seguridad y la velocidad detalladas. (Tenemos un equipo mundial, por lo que servir el contenido a través de un CDN sería útil).

No quería obligar al equipo a crear cuentas con otro proveedor. Ya tienen cuentas de Active Directory y GitHub. Es una molestia para ellos y crea una carga de gobierno para mí.

Lamentablemente, no pude encontrar ese servicio. GemFury es excelente pero no admite la autorización de GitHub (a nivel de equipo / organización) y Packagr no admite la autorización de GitHub en absoluto. MyGet también es excelente, me permite usar la autorización de GitHub, pero no aloja paquetes de Python. Azure DevOps tiene algo que parece prometedor, pero está en versión beta privada en este momento.

Afortunadamente, esto es posible utilizando repositorios de Git en la nube como GitHub, GitLab y BitBucket.

Pip puede instalar paquetes desde Git

He alojado un paquete de Python en GitHub (python_world), que puede instalar con el siguiente comando (asegúrese de confiar en mí antes de ejecutar este comando e instalar mi código en su computadora).

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

Pip ofrece opciones para instalar desde la cabecera, desde una rama, desde una etiqueta o desde una confirmación. Normalmente etiqueto cada lanzamiento e instalo desde estas etiquetas. Consulte la documentación de instalación de pip para obtener detalles completos.

Este repositorio es público, pero funciona de la misma manera con un repositorio privado, siempre que tenga permiso. No hay magia especial (es un paquete de Python de vainilla) y Setup.py hace la mayor parte del trabajo normalmente.

Si es nuevo en la creación de paquetes de Python, vale la pena leer rápidamente el tutorial Empaquetado de proyectos de Python.

Setuptools también puede instalar dependencias desde Git

Setuptools es la forma en que la mayoría de la gente crea paquetes de Python.

He alojado otro paquete en GitHub python_hello, que depende de python_world. (Estoy seguro de que puede ver a dónde va esto).

Los bits relevantes de setup.py se encuentran a continuación. install_requiresespecifica que python_worldes una dependencia requerida y le dice a Setuptools dónde encontrarla.

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

Puede instalar este paquete usando el siguiente comando. También descargará el python_worldpaquete dependiente .

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

Esto se vincula a una versión específica de python_world, lo cual es una pena, ya que significa que pip no puede realizar ninguna gestión de dependencias (como elaborar una versión aceptable si varias cosas dependen de ella). Sin embargo, al final de este artículo, habremos eliminado la necesidad del enlace específico.

Entornos de Python

Como saben todos los que han usado Python sin un entorno, los entornos ahorran mucha frustración y pérdida de tiempo. Así que tenemos que apoyarlos.

He creado un repositorio (use-hello-world) que se define python_hellocomo una dependencia en requirements.txt para Virtualenv y environment.yml para Conda.

Si descarga el repositorio, puede instalar las dependencias en un virtualenv con el siguiente comando.

pip install -r requirements.txt

Si está usando conda, puede usar este comando:

conda env create -n use-hello-world

Índice PyPi

Hasta ahora, podemos instalar paquetes desde nuestros repositorios privados de Git. Estos paquetes pueden, a su vez, definir dependencias con otros repositorios privados. Todavía no hay un servidor PyPi a la vista.

Podríamos detenernos en este punto. Sin embargo, la sintaxis para definir dependencias es un poco misteriosa. Sería difícil para el equipo descubrir qué paquetes están disponibles, y estamos vinculando a versiones específicas de paquetes dependientes, en lugar de dejar que pip lo administre.

Para solucionar esto, podemos configurar un índice PyPi que se ajuste a Pep 503. Esta especificación es bastante simple, y acabo de crear el índice a mano. Si esto se vuelve demasiado engorroso, puedo generarlo desde la API de GitHub.

Creé este índice PyPi usando páginas de GitHub. Hay cosas equivalentes para GitLab y BitBucket. Puedes ver que el código fuente es muy simple. Los sitios de las páginas de GitHub son siempre públicos (y probablemente no haya información confidencial en su índice). Sin embargo, si necesita que sean privados, puede utilizar un servicio como PrivateHub.

Una cosa a tener en cuenta es la normalización de nombres de la especificación. Esto requiere que la python_helloinformación del paquete esté presente en python-hello/index.html(observe el cambio de un guión bajo a un guión).

Ahora que tenemos un servidor PyPi, podemos instalar paquetes usando el siguiente comando.

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

Para que pueda ver que esto funciona con entornos, he creado otro repositorio (use_hello_world_from_server) que define la python_hellodependencia usando este índice PyPi en lugar de enlaces directos de GitHub. Si lo está probando con Conda, se requiere la versión> 4.4.

En este punto, podemos volver atrás y eliminar el enlace directo de Git en install_requires en setup.py de python_hello (ya que Setuptools podrá encontrarlo en nuestro servidor).

Conclusiones

Usar un proveedor de Git alojado en la nube como servidor PyPi es una opción viable. Si ya está utilizando uno, eso significa que puede reutilizar las credenciales y los permisos que ya tiene. Funcionará con servidores de compilación en la nube y es probable que se proporcione a través de un CDN, por lo que será rápido en todo el mundo. Requiere más conocimientos para configurar que un servidor alojado, pero probablemente lo mismo o menos que alojar su propio servidor en las instalaciones.

Consejos

Ofrecer el índice localmente puede ayudar a solucionar problemas (como la normalización de nombres). Es fácil ver qué solicitudes se están realizando. Puede usar el servidor HTTP de Python incorporado para esto ( python -m Http.Server -8000). Esto me llevó a descubrir que pip searchusa postsolicitudes, por lo que no funcionará con páginas de GitHub.

Puede ejecutar python setup.py -installpara verificar sus paquetes pip localmente, antes de enviarlos a Git.