Gitlab CI и Django: Как установить пользовательский пакет с помощью 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, я попробовал добавить SSH-ключ в смесь, но это тоже не сработало.
Я также нашел это выпуск Gitlab, который, кажется, говорит о той же теме, но он требует создания частного пакета PyPi, и я не совсем уверен, как это сделать, и стоит ли
Любая помощь приветствуется
Исправление установки pip через ssh
Если вы хотите продолжать использовать ssh для установки с помощью pip, вам нужно исправить проблему проверки ключа хоста ssh.
Проверка ключа хоста не удалась.
Вы можете решить эту проблему, установив GIT_SSH_OPTIONS игнорировать проверку ключа хоста.
before_script:
- export GIT_SSH_COMMAND="ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no"
Конечно, это не идеально, поскольку вы больше не проверяете личность git-сервера.
В качестве альтернативы, если вы не хотите пропускать проверку ключей хостов, вы можете проверить ключи хостов, как описано здесь и добавить ключ хоста для вашего сервера в файл known_hosts.
Вы также можете полностью избежать проблем с ключом хоста, используя HTTPS вместо ssh, используя HTTP basic auth с pip. То есть используйте git+https вместо git+ssh.
Используйте реестр пакетов (рекомендуется!)
Как упоминалось в сообщении, которое вы нашли в своем вопросе, на GitLab есть реестр пакетов PyPI, который позволяет публиковать пакеты Python, а также использовать их с помощью pip. Для этого вам потребуется опубликовать пакеты и настроить (дополнительные) индексные url(ы) в конфигурации pip. В документации описана настройка и использование.