我正在使用Gitlab托管两个私有Python软件包。一个,例如包裹B,取决于另一个,例如包裹A。
我想正确设置B软件包,所以我有一个setup.py与
install_requires=[
'packagea @ git+https://gitlab.com/me/packagea.git',
...
]
以及其中包含的require.txt
git+https://gitlab.com/me/packagea.git@v1.0.1
当用户使用pip install git+https://gitlab.com/me/packageb.git
安装软件包B时,或者当用户克隆软件包B然后运行pip install -r requirements.txt
时,该方法都很好用。
但是,我想在软件包B上设置持续集成。我的gitlab-ci.yml看起来像
image: python:3.7
before_script:
- pip install -r requirements.txt
pylint:
script:
- pylint **/*.py
之所以失败,是因为Gitlab-CI运行程序没有任何用户名/密码来验证和提取程序包A仓库。我读过我可以为CI运行程序生成一个个人访问令牌进行身份验证,但这将意味着setup.py和requirements.txt包含该令牌。在我看来,这很丑陋(我希望其他用户仍然使用他们自己的用户名/密码)。
我该如何实现?
答案 0 :(得分:1)
如果有人像我一样在尝试解决此管道问题时迷失了方向,那么对我有帮助的解决方案是 this Gitlab issue and the discussion below。
总结:
在 .gitlab-ci.yml
中,将这些行添加到您的 before_script
部分:
before_script
- ...
- echo "machine gitlab.com" > ~/.netrc
- echo "login gitlab-ci-token" >> ~/.netrc
- echo "password ${CI_JOB_TOKEN}" >> ~/.netrc
- if [ -f "requirements.txt" ]; then pip install -r requirements.txt ; fi
在您的 requirements.txt
文件中,使用名称、网址和鸡蛋指定私有依赖项(鸡蛋必须是
包裹名字)。例如
thispackageisonpip>=1.2.3
soisthisone==1.0.0
...
privatepackage @ git+https://gitlab.com/user/repository.git@tag#egg=privatepackage
标签所在的位置,例如'v1.3.3'(注意必须有标记版本才能签出)。
现在管道应该成功检出私有包。在 install_requires
的 setup.py
中指定要求的情况下,我无法让它发挥作用,但至少这是可行的。
答案 1 :(得分:0)
由于软件包A是私有存储库,因此在任何情况下您都将需要权限才能访问它。
您可以考虑使用GitLab Deploy Keys。这样,具有部署密钥的任何用户(包括ci)都可以读取或写入存储库(取决于您对密钥的访问权限)。这会将密钥与存储库相关联,而不是您的用户帐户。
需要特别注意的是,此部署密钥可以访问私有存储库,因此这是一个秘密,应将其视为此类密钥。
Secrets management是一个复杂的主观主题,其解决方案会因许多因素而有很大不同,这些因素包括您需要的项目安全性,易用性和团队规模。避免以明文形式存储密码的常见方法是使用custom environment variables。如果您正在寻找有关如何以这种方式建立项目的建议,this post可能是一个很好的起点。