¿Cómo deben manejarse los enlaces de dependencia privada en setup.py?

10

En el trabajo utilizamos un servidor privado pypi. Este servidor pypi se especifica como un enlace de dependencia:

...
from setuptools import setup

config = ConfigParser.ConfigParser()
rc = os.path.join(os.path.expanduser('~'), '.pypirc')
config.read(rc)
dependency_links = [
    'https://{}:{}@<private_url>'.format(
        config.get('dc', 'username'), config.get('dc', 'password'))]

setup(
    dependency_links=dependency_links,
    ...)

Esto funciona bien en la mayoría de nuestros casos. Sin embargo, hace algún tiempo tuvimos que instalar paquetes en un servidor cliente. Para esto tuvimos que copiar un documento válido .pypircantes de poder instalar cualquier paquete.

Además, el código anterior se siente como un truco sucio.

¿Cuál es la forma correcta de especificar enlaces de dependencia seguros sin credenciales de codificación?

Remco Haszing
fuente
1
Veo a que te refieres. No es un truco tan sucio, pero significa que está acoplando la autenticación con la gestión de dependencias por paquete. Este enfoque no es portátil ni escalable.
Joel Cornett

Respuestas:

1

Esto parece un truco razonable y no sucio en absoluto.

  1. Hay un archivo de configuración para credenciales
  2. Hay una manera de inyectar la URL personalizada + creds en las dependencias

El trabajo se está haciendo y se está haciendo bien, la única forma de hacerlo mejor es documentarlo y probarlo en múltiples configuraciones diferentes o con múltiples servidores pypi y abordar los problemas que surjan de eso.

Rudolf Olah
fuente
0

Una posibilidad sería establecer variables de entorno . Esto podría hacerse con herramientas de implementación como Ansible . Almacenando tus secretos con Stack Overflow's Blackbox o Ansible's Vault

Alternativamente: la contenedorización ayudaría, ya que todo lo necesario para ejecutar el software está integrado.

Thomas Junk
fuente
0

Tenga mucho cuidado al usar esta solución. Como se indica en la documentación :

También se escribirán en los metadatos del huevo para que las utilicen herramientas como EasyInstall para instalar un archivo .egg.

Es decir, sus credenciales se distribuirán en el .egg. Al rootear el setuptoolscódigo fuente, descubrí que internamente parece estar usando el easy_installcomando para instalar dependencias. Por lo tanto, agregar lo siguiente a sus setup.cfgcausas hace que recoja un repositorio privado:

[easy_install]
index_url=https://username:password@your.repo/simple

Esto todavía tiene el inconveniente de que sus credenciales se imprimen en el terminal cuando lo está instalando, pero al menos no terminan en su distribución. Tenga en cuenta que esta solución reemplaza su URL de índice, por lo que su repositorio privado también debe reflejar el público. No vi soporte para agregar URL de índice de ninguna manera obvia.

scranen
fuente