Gitlab CI & Django:如何使用 pip 安装自定义包

Gitlab CI & Django: How to install custom package with pip

我有一个 Django 项目,它有很多依赖项,其中有几个自定义私有 Django 包列在项目根目录的 requirements.txt 文件中。

我想设置简单的 CI 每次提交时触发我们的测试。
为此,我编写了一个简单的 .gitlab-ci.yaml 文件来尝试 运行 这些测试,但我在安装自定义依赖项时遇到了问题。
它们列在我们的要求中,如下所示:

...
Django==3.2.12
...
-e git+ssh://git@gitlab.com/{organization}/{project}.git@{commit-sha}#egg={project}
-e git+ssh://git@gitlab.com/{organization}/{project}.git@{{commit-sha}#egg={project}
...

注意:所有提到的项目都属于同一个Gitlab组织

这是我的 .gitlab-ci.yaml 文件的样子:

stages:
  - test

run-test: 
  image: ubuntu:18.04
  stage: test
  before_script: # installing python, pip & installing requirements
    - apt -y update

    - apt -y install apt-utils git net-tools
    - apt -y install python3.8 python3-pip
    - apt -y upgrade
    
    - python3 -m pip install --upgrade pip
    - cd servers/api
    - pip3 install -r ../requirements.txt
  script:
    - python3 manage.py test

这显然失败并给出以下错误:

Obtaining {project} from git+ssh://****@gitlab.com/{organization}/{project}.git@{commit-sha}#egg={project} (from -r ../requirements.txt (line 32))
Cloning ssh://****@gitlab.com/{organization}/{project}.git (to revision {commit-sha}) to ./src/{project}
Running command git clone --filter=blob:none -q 'ssh://****@gitlab.com/{organization}/{project}.git' /builds/{organization}/platform/servers/api/src/{project}
  Host key verification failed.
  fatal: Could not read from remote repository.
  Please make sure you have the correct access rights
  and the repository exists.

从 Gitlab 文档中阅读此 topic 我尝试在混合中添加 SSH 密钥,但它也没有用。

我还发现 this Gitlab issue 似乎在谈论相同的主题,但它需要创建 PyPi 私有包,我不太确定该怎么做,如果我应该的话也不行

感谢任何帮助

修复通过 ssh 的 pip 安装

如果您想继续使用 ssh 通过 pip 安装,您需要修复 ssh 主机密钥验证问题。

Host key verification failed.

您可以通过设置 GIT_SSH_OPTIONS 忽略主机密钥验证来解决此问题。

before_script:
  - export GIT_SSH_COMMAND="ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no"

当然,这并不理想,因为您不再验证 git 服务器的身份。

或者,如果您不想跳过主机密钥验证,您可以验证主机密钥,as described here 并将服务器的主机密钥添加到 known_hosts 文件中。

您还可以通过使用 HTTPS 而不是 ssh 来完全避免主机密钥问题,使用 HTTP basic auth with pip。也就是说用git+https代替git+ssh.

使用包注册表(推荐!)

如您在问题中发现的 post 中所述,GitLab 有一个 PyPI package registry 允许您发布 Python 包以及将它们与 pip 一起使用。这将要求您发布包并在您的 pip 配置中设置(附加)索引 url(s)。该文档涵盖了设置和使用。