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 的构建***失败的主要内容,如果未能解决你的问题,请参考以下文章

基于GitLab的CI/CD系统重点记要

GitLab CI 的多行 YAML 字符串 (.gitlab-ci.yml)

[后端]gitlab之gitlab-ci自动部署

gitlab CI + jenkins 实践

GitLab CI Pipeline框架

gitlab+gitlab-ci+docker自动化部署