#python #docker #gitlab #gitlab-ci #pipenv
#python #docker #gitlab #gitlab-ci #pipenv
Вопрос:
Я создал этот простой проект в Gitlab:
https://gitlab.com/PequeX/deleteme
С Pip-файлом, который устанавливает только пару пакетов:
[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true
[dev-packages]
pytest = "*"
[packages]
requests = "*"
[requires]
python_version = "3.7"
И очень простой .gitlab-ci.yml
файл:
image: peque/python-devel
before_script:
- pipenv sync --dev
python36:
script:
- pipenv run pytest
Существует также автоматически созданный Pipfile.заблокируйте файл. Который я не буду вставлять здесь, поскольку это не очень интересно.
Теперь проблема в том, что Gitlab, похоже, блокируется при вызове pipenv sync
:
https://gitlab.com/PequeX/deleteme/-/jobs/171273142
В журнале нет выходных данных и нет ошибки. Он просто блокируется навсегда. А затем, в конечном итоге, истекает время ожидания (потому что Gitlab не позволит вам запускать конвейер вечно).
Что не так или как я мог успешно выполнить pipenv sync
? Обратите внимание, что я хотел бы продолжать использовать один и тот же peque/python-devel
образ из Docker Hub, поскольку мне нужно установить несколько версий Python для моих конвейеров.
Обновить
Попытался сбросить CI
переменную, как предлагает @Hernan Garcia в своем ответе, но безуспешно:
Я также пытался с pipenv shell
, как предлагает @Hernan Garcia в своих комментариях, но безуспешно:
Комментарии:
1. Можете ли вы добавить
--verbose
? pipenv.readthedocs.io/en/latest/#pipenv-sync
Ответ №1:
Как упоминалось в другом ответе, определение пустой CI
переменной решит проблему зависания сборки.
Тогда вторая проблема, с которой вы столкнетесь из-за того, что вы не можете найти pytest
, и это связано с тем, что в образе docker отсутствует which
пакет, и это делает pipenv
невозможным поиск pytest.
Конечный файл gitlab-ci.yml должен быть похож на следующий:
image: peque/python-devel
variables:
CI: ""
before_script:
- pipenv sync --dev
- yum install -y which
python36:
script:
- pipenv run pytest
И конечный результат будет:
$ pipenv run pytest
============================= test session starts ==============================
platform linux -- Python 3.7.2, pytest-4.3.0, py-1.8.0, pluggy-0.9.0
rootdir: /builds/mostafahussein/deleteme, inifile:
collected 0 items
========================= no tests ran in 0.01 seconds =========================
Что касается этой проблемы:
termios.error: (25, 'Inappropriate ioctl for device')
Это связано с тем, что для запуска без возникновения вышеуказанной ошибки pipenv shell
требуется tty
, однако GitLab CI не предоставляет tty, поскольку, насколько я знаю, нет пользовательских вводов. Поэтому будет лучше использовать первый метод, который pipenv run
.
Комментарии:
1. Исправляет проблему, спасибо. Все еще нужно выяснить, в чем разница между этим (возможно, слишком) сокращенным примером и реальным репозиторием, который теперь (после установки
which
) завершается сбоем с ошибкой «сброс ядра», как только я запускаюpipenv
команду. :'(2. @Peque Я извлек текущий образ docker, и все работает как ожидалось, устанавливать его не нужно, потому что я обнаружил, что он уже существует, как я вижу, вы загрузили новый образ
b7c96e8d2b98
. В чем ваша текущая проблема, поскольку я не могу воспроизвести ошибку «сброс ядра»3. Да, я обновил изображение недостающим
which
, спасибо. Мне нужно немного поработать над попыткой создать сокращенный пример, который воспроизводил бы «сброс ядра». Я пока приму ваш ответ, поскольку в настоящее время он устраняет все воспроизводимые проблемы.4. @Peque пожалуйста, не забудьте добавить награду, поскольку она должна быть добавлена вручную, и проголосуйте за ответ.
5. Я уже поддержал ответ. Я все еще думаю, присуждать награду или нет. Если я не назначу его, он будет разделен между вами и @hernangarcia, который также помог с
CI
проблемой переменной. ^^
Ответ №2:
Я мог бы исправить это, используя этот обходной путь:
https://github.com/pypa/pipenv/issues/3534#issuecomment-464510351
Добавьте следующее в свой .gitlab-ci.yml
файл, чтобы отменить CI
переменную:
variables:
CI: ""
Проверьте это успешное задание:
https://gitlab.com/hernandanielg/deleteme/-/jobs/171342796
😉
Комментарии:
1. Я попробую это обходное решение, спасибо! Клянусь, я искал
pipenv
проблемы, но я думаю, что я искал слово «блок», а не «застрял», и эта проблема не возникла… :-/2. Я немного обновил репозиторий, фактически пытаясь использовать какой-то установленный пакет . Теперь он не застревает, но говорит, что не может найти (предположительно правильно) установленный пакет. Есть идеи?
3. если я это сделаю,
pipenv shell
и тогдаpytest
это сработает… для использованияpipenv run pytest
кажется, проблема с pip4. Проблема с
pip
а неpipenv
в этом случае? Следует ли сообщать об этом? Я всегда думал, чтоpipenv shell xxx
это эквивалентноpipenv run xxx
.5. Я не знаю наверняка, но я попробовал использовать образ контейнера, который вы используете, и он тоже дал сбой, так что это вообще не связано с gitlab-ci
Ответ №3:
Вам необходимо изменить разрешение файла. сделайте его доступным для чтения и записи с помощью chmod 777
команды. который предоставит файлу полные разрешения на чтение и запись
Комментарии:
1. Какой файл вы имеете в виду?
2. весь файл docker изменяет режим
3. Вы имеете в виду
Dockerfile
? Это используется только для генерации образа, который уже находится в Docker Hub, как это может быть связано с проблемой в Gitlab?4. основная проблема с файлом docker заключается в том, что у него нет полного разрешения на выполнение задания. когда я работал над aws batch, я столкнулся с этой проблемой, поэтому файл, который находится внутри файла docker, а также весь образ docker предоставляют полный доступ для чтения и записи. т. е. Chmod 777
5. перед запуском в gitlab предоставьте полный доступ к образу docker