Gitlab CI:opencv-python 的构建***失败
Posted
技术标签:
【中文标题】Gitlab CI:opencv-python 的构建***失败【英文标题】:Gitlab CI: Failed building wheel for opencv-python 【发布时间】:2022-01-10 17:13:27 【问题描述】:我正在 gitlab 中为我的 python/django 项目开发 CI/CD。
我有一个错误——Gitlab CI: Failed building wheel for opencv-python
完整的 gitlab ci 日志 -- https://pastebin.com/pZdZ6ws2
我在build_pip
阶段出现错误:
gitlab-ci.yaml
stages:
- linter
- build_pip
- build
- meta
- code_quality
- deploy
.except-tags:
except:
- tags
build_pip:build_dist:
stage: build_pip
# image: $CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX/python:3.9-alpine
image: python:3.9-alpine
before_script:
- apk update && apk add postgresql-dev gcc python3-dev musl-dev g++ jpeg-dev zlib-dev
- pip install pip --upgrade
- pip install -r requirements/production.txt --no-cache
script:
- python setup.py bdist_wheel
- echo PIP_CI_JOB_ID=$CI_JOB_ID > PIP_CI_JOB_ID.env
dependencies: []
artifacts:
expire_in: 1 hour
paths:
- dist/
- version
reports:
dotenv: PIP_CI_JOB_ID.env
extends:
- .except-tags
meta:version:
stage: meta
needs:
- job: build_pip:build_dist
artifacts: true
script:
- cat version
artifacts:
expire_in: never
paths:
- version
extends: .except-tags
build:build_api:
stage: build
image: registry.ml.bastion-tech.ru:8843/ansible/infrastructure/ansible_tools:2.9
needs:
- job: build_pip:build_dist
artifacts: true
before_script:
- ansible-vault decrypt /ansible/infrastructure/secrets/ansible@infrastructure/id_rsa --vault-password-file=$ANSIBLE_VAULT_PASSWORD
script:
- |
ansible-playbook -i /ansible/infrastructure/inventories/ml.inventory \
--vault-password-file=$ANSIBLE_VAULT_PASSWORD \
--private-key /ansible/infrastructure/secrets/ansible@infrastructure/id_rsa \
-e ansible_ssh_user=deploy \
-e smartconstructions_pip_ci_job_id=$PIP_CI_JOB_ID \
-e build=true -e smartconstructions_build_ref=$CI_COMMIT_BRANCH \
/ansible/infrastructure/ml_smartconstructions.yml
tags:
- linux-docker
deploy:deploy_api:
stage: deploy
image: registry.ml.bastion-tech.ru:8843/ansible/infrastructure/ansible_tools:2.9
needs:
- job: build_pip:build_dist
artifacts: true
when: manual
only:
- master
- dev
before_script:
- ansible-vault decrypt /ansible/infrastructure/secrets/ansible@infrastructure/id_rsa --vault-password-file=$ANSIBLE_VAULT_PASSWORD
script:
- |
ansible-playbook -i /ansible/infrastructure/inventories/ml.inventory \
--vault-password-file=$ANSIBLE_VAULT_PASSWORD \
--private-key /ansible/infrastructure/secrets/ansible@infrastructure/id_rsa \
-e ansible_ssh_user=deploy \
-e smartconstructions_pip_ci_job_id=$PIP_CI_JOB_ID \
-e run=true -e frontend_restart=true \
/ansible/infrastructure/ml_smartconstructions.yml
tags:
- linux-docker
include:
- local: .gitlab/ci/code-quality.yml
requirements/production.txt
djangorestframework==3.12.4
drf-extra-fields==3.1.1
djangorestframework-camel-case==1.2.0 # https://pypi.org/project/djangorestframework-camel-case/
Pillow==8.3.2
python-dateutil==2.8.2 # datetime formatting
psycopg2==2.9.1
opencv-python==4.5.3.56
drf-yasg==1.20.0
sentry-sdk==1.4.3
gunicorn==20.1.0
requests==2.26.0
yarl==1.7.0
googlemaps==4.5.3
django_redis==5.0.0
celery==5.2.0
channels==3.0.4
channels_redis==3.3.1
【问题讨论】:
【参考方案1】:在您的日志中,我们可以看到以下错误:
gcc -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -DTHREAD_STACK_SIZE=0x100000 -fPIC -DUSE__THREAD -DHAVE_SYNC_SYNCHRONIZE -I/usr/include/ffi -I/usr/include/libffi -I/usr/local/include/python3.9 -c c/_cffi_backend.c -o build/temp.linux-x86_64-3.9/c/_cffi_backend.o
c/_cffi_backend.c:15:10: fatal error: ffi.h: No such file or directory
15 | #include <ffi.h>
| ^~~~~~~
compilation terminated.
error: command '/usr/bin/gcc' failed with exit code 1
这些错误表明您缺少头文件。
在 Alpine 中,ffi.h 文件应该是 libffi-dev 的一部分。试试这个:
apk add libffi-dev
【讨论】:
谢谢,我添加了这个库,但与 opencv 有同样的错误。完整日志:pastebin.com/XELTV8aj 错误提示CMake Error: CMake was unable to find a build program corresponding to Ninja
。也许一些apk add ninja
?【参考方案2】:
也许您的用例会从使用opencv-python-headless 中受益?它基本上是同一个库,由同一个人维护,但对 Xorg 和 GUI 包的依赖较少。这意味着由于缺少软件包而导致的错误更少(即通过apk
安装的东西更少)。
您可以在development.txt
文件中使用opencv-python
并将生产更改为无头版本。
来自文档:
这些包比上面的其他两个包要小,因为它们不包含任何 GUI 功能(未使用 Qt/其他 GUI 组件编译)。这意味着这些包避免了对 X11 库的大量依赖链,因此您将拥有例如更小的 Docker 映像。如果您不使用 cv2.imshow 等,则应始终使用这些软件包。或者您正在使用 OpenCV 之外的其他包(例如 PyQt)来创建您的 GUI。
选项 3 - 无头主模块包:
pip install opencv-python-headless
选项 4 - Headless full package(包含主模块和 contrib/extra 模块):
pip install opencv-contrib-python-headless
(查看 OpenCV 文档中的 contrib/extra 模块列表)
除此之外,使用基于 Alpine 的图像 + Python + 科学工具真的是个好主意吗?考虑到一些 Python 工具对 GCC 等人来说是多么复杂,如果您在运行时会遇到更多问题,即使这个图像设法构建,我也不会感到惊讶。
尝试使用3.9-slim-bullseye
,它是基于 debian 的映像。
【讨论】:
以上是关于Gitlab CI:opencv-python 的构建***失败的主要内容,如果未能解决你的问题,请参考以下文章