Pip在Gitlab-CI上使用个人访问令牌从Gitlab安装私人仓库

时间:2020-10-08 15:54:04

标签: git pip gitlab-ci

我正在使用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包含该令牌。在我看来,这很丑陋(我希望其他用户仍然使用他们自己的用户名/密码)。

我该如何实现?

2 个答案:

答案 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_requiressetup.py 中指定要求的情况下,我无法让它发挥作用,但至少这是可行的。

答案 1 :(得分:0)

由于软件包A是私有存储库,因此在任何情况下您都将需要权限才能访问它。

您可以考虑使用GitLab Deploy Keys。这样,具有部署密钥的任何用户(包括ci)都可以读取或写入存储库(取决于您对密钥的访问权限)。这会将密钥与存储库相关联,而不是您的用户帐户。

需要特别注意的是,此部署密钥可以访问私有存储库,因此这是一个秘密,应将其视为此类密钥。

Secrets management是一个复杂的主观主题,其解决方案会因许多因素而有很大不同,这些因素包括您需要的项目安全性,易用性和团队规模。避免以明文形式存储密码的常见方法是使用custom environment variables。如果您正在寻找有关如何以这种方式建立项目的建议,this post可能是一个很好的起点。