工作服:错误 - 在我的应用程序中没有使用 Docker 容器的来源
Coveralls: Error- No source for in my application using Docker container
我一直在尝试将代码覆盖率集成到我的 Django 应用程序中。构建成功并且所有测试都成功但是当我检查 coveralls.io 或 codecov.io 时没有数据.. 我搜索了所有内容,添加了 .coveragerc 但仍然没有任何帮助。
Dockerfile
FROM python:3.7-alpine
MAINTAINER abhie-lp
ENV PYTHONUNBUFFERED 1
COPY ./requirements.txt /requirements.txt
RUN apk add --update --no-cache jpeg-dev
RUN apk add --update --no-cache --virtual .tmp-build-deps \
gcc libc-dev musl-dev zlib zlib-dev
RUN pip install -r /requirements.txt
RUN apk del .tmp-build-deps
RUN mkdir /app
WORKDIR /app
COPY ./app /app
RUN mkdir -p /vol/web/media
RUN mkdir -p /vol/web/static
RUN adduser -D ABHIE
RUN chown -R ABHIE:ABHIE /vol/
RUN chmod -R 755 /vol/web
USER ABHIE
docker-compose.yml
version: "3"
services:
app:
build:
context: .
ports:
- "8000:8000"
volumes:
- ./app:/app
command: >
sh -c "python manage.py wait_for_db &&
python manage.py migrate &&
python manage.py runserver 0.0.0.0:8000"
.travis.yml
language: python
python:
- "3.6"
services:
- docker
before_script:
- pip install docker-compose
- pip install coveralls
- pip install codecov
- docker-compose run --user='root' app chmod -R 777 .
script:
- docker-compose run app sh -c "coverage run --source=. manage.py test"
- docker-compose run app sh -c "flake8"
after_success:
- coveralls
- codecov
.coveragerc
[run]
source = /home/travis/build/abhie-lp/recipe-app-api/app
parallel = True
data_file = /home/travis/build/abhie-lp/recipe-app-api/app/.coverage
[paths]
source =
/home/travis/build/abhie-lp/recipe-app-api
/app/
您显示的测试设置存在三个主要问题:
docker-compose.yml
文件中的 volumes:
声明隐藏了图像中 /app
树的内容,这意味着您的测试设置没有测试它构建的图像。
您的 pip install
命令会在主机的 Python 环境中安装额外的包,但这些包在 Docker 容器中是不可见的。
每个 docker-compose run
命令都会启动一个带有新临时文件系统的新容器,因此在您 docker-compose run coverage
之后,具有覆盖率报告的临时容器文件系统将丢失。
对于基本的测试覆盖率指标,希望您的 unit-test 设置对 Docker 中的 运行 或部署在不同的路径上或来自不同开发人员的工作站不是特别敏感.我成功使用的设置是 运行 单元测试和 Docker 之外的代码覆盖率之类的东西,并且只构建和发布 Docker 图像作为最后一步。虽然值得 运行 针对您构建的映像进行一些集成测试,但您应该能够从 Docker 外部驱动这些测试,而不需要对映像本身进行任何更改。
如果从 Docker 内部 运行 这些测试对您来说很重要,您需要将这些 development-only 工具添加到您的生产映像中,或者执行所有操作(安装额外的工具,运行 测试,并从单个 docker-compose run
命令中提取结果)。 one-liner 可能看起来像
docker-compose run \
-v $PWD:/coverage \
sh -c 'pip install coverage && COVERAGE_FILE=/coverage/.coverage coverage run --source=. manage.py test'
您也可以将其分解为一个脚本,该脚本可以复制或 bind-mounted 到您的容器中
docker-compose run -v $PWD:/coverage /coverage/cov-pytest
这可能更易于维护并且更容易手动测试。
我一直在尝试将代码覆盖率集成到我的 Django 应用程序中。构建成功并且所有测试都成功但是当我检查 coveralls.io 或 codecov.io 时没有数据.. 我搜索了所有内容,添加了 .coveragerc 但仍然没有任何帮助。
Dockerfile
FROM python:3.7-alpine
MAINTAINER abhie-lp
ENV PYTHONUNBUFFERED 1
COPY ./requirements.txt /requirements.txt
RUN apk add --update --no-cache jpeg-dev
RUN apk add --update --no-cache --virtual .tmp-build-deps \
gcc libc-dev musl-dev zlib zlib-dev
RUN pip install -r /requirements.txt
RUN apk del .tmp-build-deps
RUN mkdir /app
WORKDIR /app
COPY ./app /app
RUN mkdir -p /vol/web/media
RUN mkdir -p /vol/web/static
RUN adduser -D ABHIE
RUN chown -R ABHIE:ABHIE /vol/
RUN chmod -R 755 /vol/web
USER ABHIE
docker-compose.yml
version: "3"
services:
app:
build:
context: .
ports:
- "8000:8000"
volumes:
- ./app:/app
command: >
sh -c "python manage.py wait_for_db &&
python manage.py migrate &&
python manage.py runserver 0.0.0.0:8000"
.travis.yml
language: python
python:
- "3.6"
services:
- docker
before_script:
- pip install docker-compose
- pip install coveralls
- pip install codecov
- docker-compose run --user='root' app chmod -R 777 .
script:
- docker-compose run app sh -c "coverage run --source=. manage.py test"
- docker-compose run app sh -c "flake8"
after_success:
- coveralls
- codecov
.coveragerc
[run]
source = /home/travis/build/abhie-lp/recipe-app-api/app
parallel = True
data_file = /home/travis/build/abhie-lp/recipe-app-api/app/.coverage
[paths]
source =
/home/travis/build/abhie-lp/recipe-app-api
/app/
您显示的测试设置存在三个主要问题:
docker-compose.yml
文件中的volumes:
声明隐藏了图像中/app
树的内容,这意味着您的测试设置没有测试它构建的图像。您的
pip install
命令会在主机的 Python 环境中安装额外的包,但这些包在 Docker 容器中是不可见的。每个
docker-compose run
命令都会启动一个带有新临时文件系统的新容器,因此在您docker-compose run coverage
之后,具有覆盖率报告的临时容器文件系统将丢失。
对于基本的测试覆盖率指标,希望您的 unit-test 设置对 Docker 中的 运行 或部署在不同的路径上或来自不同开发人员的工作站不是特别敏感.我成功使用的设置是 运行 单元测试和 Docker 之外的代码覆盖率之类的东西,并且只构建和发布 Docker 图像作为最后一步。虽然值得 运行 针对您构建的映像进行一些集成测试,但您应该能够从 Docker 外部驱动这些测试,而不需要对映像本身进行任何更改。
如果从 Docker 内部 运行 这些测试对您来说很重要,您需要将这些 development-only 工具添加到您的生产映像中,或者执行所有操作(安装额外的工具,运行 测试,并从单个 docker-compose run
命令中提取结果)。 one-liner 可能看起来像
docker-compose run \
-v $PWD:/coverage \
sh -c 'pip install coverage && COVERAGE_FILE=/coverage/.coverage coverage run --source=. manage.py test'
您也可以将其分解为一个脚本,该脚本可以复制或 bind-mounted 到您的容器中
docker-compose run -v $PWD:/coverage /coverage/cov-pytest
这可能更易于维护并且更容易手动测试。