Como os links de dependência privada devem ser tratados em setup.py

10

No trabalho, usamos um servidor pypi privado. Este servidor pypi é especificado como um link de dependência:

...
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,
    ...)

Isso funciona bem na maioria dos nossos casos. No entanto, há algum tempo, tivemos que instalar pacotes em um servidor cliente. Para isso, tivemos que copiar um válido .pypircantes de poder instalar quaisquer pacotes.

Além disso, o código acima parece um hack sujo.

Qual é a maneira correta de especificar links de dependência protegidos sem credenciais codificadas?

Remco Haszing
fonte
1
Eu vejo o que você quer dizer. Não é um truque tão sujo, mas significa que você está acoplando a autenticação ao gerenciamento de dependências por pacote. Essa abordagem não é portátil ou escalável.
Joel Cornett

Respostas:

1

Parece um truque razoável e não um truque sujo.

  1. Há um arquivo de configuração para credenciais
  2. Existe uma maneira de injetar o URL personalizado + creds nas dependências

O trabalho está sendo feito e bem feito, a única maneira de melhorar isso é documentá-lo e testá-lo em várias configurações diferentes ou com vários servidores pypi e resolver os problemas resultantes disso.

Rudolf Olah
fonte
0

Uma possibilidade seria definir variáveis ​​de ambiente . Isso pode ser feito com ferramentas de implantação como o Ansible . Armazenando seus segredos com o Blackbox do Stack Overflow ou o Ansible's Vault

Como alternativa: a conteinerização ajudaria, pois tudo o que é necessário para executar o software está embutido.

Thomas Junk
fonte
0

Tenha muito cuidado ao usar esta solução. Conforme declarado na documentação :

Eles também serão gravados nos metadados do ovo para serem usados ​​por ferramentas como o EasyInstall para instalar na instalação de um arquivo .egg.

Ou seja, suas credenciais serão distribuídas no .egg. Ao pesquisar o setuptoolscódigo-fonte, descobri que internamente parece estar usando o easy_installcomando para instalar dependências. Portanto, adicionar o seguinte às suas setup.cfgcausas faz com que ele adquira um repositório particular:

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

Isso ainda causa a impressão de que suas credenciais são impressas no terminal durante a instalação, mas pelo menos elas não acabam na sua distribuição. Observe que esta solução substitui o URL do índice, portanto, seu repositório particular também deve refletir o público. Não vi suporte para adicionar URLs de índice de maneira óbvia.

scranen
fonte