如何将 AWS CodeBuild 与 buildspec.yaml 中的 Python pytest-cov 代码覆盖率报告集成

问题描述 投票:0回答:1

我有一个基于 Python 的应用程序,其中包含:

  • 一些使用 AWS Boto3 SDK 与 AWS 资源交互的 Python 源代码
  • 基于 AWS
    public.ecr.aws/lambda/python:3.9
    镜像构建的 Dockerfile
  • 一个 AWS SAM(无服务器应用程序模型)模板,用于构建 lambda 以在调用 lambda 时执行 Docker 映像

buildspec.yaml
文件中的构建命令的第一部分旨在使用代码覆盖率报告执行所有单元测试。这个效果很好。

我能够使用构建规范的

reports
部分将单元测试报告与 AWS CodeBuild 集成:

reports:
  pytest_reports:
    files:
      - junitxml-report.xml
  base-directory: ./pytest_reports
  file-format: JUNITXML

这按预期工作。我可以看到在执行代码管道后,在 CodeBuild 中创建了一个新的“报告组”和第一个报告。不幸的是,这仅包括单元测试结果报告。

问题:如何通过 buildspec.yaml 文件将我的 Python 代码覆盖率报告与 CodeBuild 集成?

我在此 AWS 文档页面上找到了一些信息,但代码覆盖率报告格式列表不包含我可以从 Python 代码覆盖率运行生成的任何内容。我对 Python 开发还是有点陌生,所以我希望专家可能已经解决了这个问题。

作为参考,这是我完整的 buildspec.yaml 文件(删除了一些敏感值):

version: 0.2

env:

  variables:
    # Elastic Container Registry (ECR) hosts
    MAIN_REPO: 999999999999.dkr.ecr.us-east-1.amazonaws.com
    DR_REPO: 999999999999.dkr.ecr.us-west-2.amazonaws.com


phases:

  install:
    runtime-versions:
        python: 3.9

  build:
    on-failure: ABORT
    commands:
      # -------------------------------------------------------------------------------------------
      # PART 1 - EXECUTE UNIT TESTS AND CODE COVERAGE ON THE PYTHON SOURCE CODE
      # -------------------------------------------------------------------------------------------
      # install/upgrade build-related modules that CodeBuild will use
      - python3 -m pip install --upgrade pip
      - python3 -m pip install --upgrade pytest
      - python3 -m pip install --upgrade pytest-mock
      - python3 -m pip install --upgrade pytest-cov
      # do local user 'install' of source code, then run pytest (company-private Pypi repo must be explicitly included)
      - pip install --extra-index-url https://artifactory.my-company-domain.com/artifactory/api/pypi/private-pypi/simple -e ./the_python_code
      - python3 -m pytest --junitxml=./pytest_reports/junitxml-report.xml --cov-fail-under=69 --cov-report xml:pytest_reports/cov.xml --cov-report html:pytest_reports/cov_html --cov-report term-missing --cov=./the_python_code/src/ ./the_python_code
      # -------------------------------------------------------------------------------------------
      # PART 2 - BUILD THE DOCKER IMAGE AND PUBLISH TO ECR
      # -------------------------------------------------------------------------------------------
      # REFERENCE: https://docs.aws.amazon.com/AmazonECR/latest/userguide/docker-push-ecr-image.html
      # Pre-authenticate access to Docker Hub and Elastic Container Registry for image pulls and pushes
      - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin 999999999999.dkr.ecr.us-east-1.amazonaws.com
      - docker image build -t 999999999999.dkr.ecr.us-east-1.amazonaws.com/my-docker-image-tag-name .
      - docker push 999999999999.dkr.ecr.us-east-1.amazonaws.com/my-docker-image-tag-name
      # -------------------------------------------------------------------------------------------
      # PART 3 - BUILD THE SAM PROJECT
      # -------------------------------------------------------------------------------------------
      - printenv
      - echo "-----------------------------------------------------"
      - 'echo "ARTIFACTS_BUCKET_NAME : $ARTIFACTS_BUCKET_NAME"'
      - 'echo "ARTIFACTS_BUCKET_PATH : $ARTIFACTS_BUCKET_PATH"'
      - 'echo "CODEBUILD_KMS_KEY_ID  : $CODEBUILD_KMS_KEY_ID"'
      - echo "-----------------------------------------------------"
      - MAIN_TEMPLATE="main-template.yaml"
      - sam build --debug
      - |
        sam package \
          --template-file .aws-sam/build/template.yaml \
          --output-template-file "${MAIN_TEMPLATE}" \
          --image-repository  "999999999999.dkr.ecr.us-east-1.amazonaws.com/my-docker-image-tag-name" \
          --s3-bucket "${ARTIFACTS_BUCKET_NAME}" \
          --s3-prefix "${ARTIFACTS_BUCKET_PATH}" \
          --kms-key-id "${CODEBUILD_KMS_KEY_ID}" \
          --force-upload

reports:
  pytest_reports:
    files:
      - junitxml-report.xml
    base-directory: ./pytest_reports
    file-format: JUNITXML

artifacts:
  files:
    - main-template.yaml
    - parameters/*.json
python amazon-web-services code-coverage aws-codebuild buildspec
1个回答
0
投票

您需要在“报告”下添加一个附加部分,因此您的报告将如下所示:

reports:
  pytest_reports:
    files:
      - junitxml-report.xml
    base-directory: ./pytest_reports
    file-format: JUNITXML
  coverage_tests:
    files:
      - coverage.xml
    file-format: COBERTURAXML

感谢如何获取测试覆盖率报告?

© www.soinside.com 2019 - 2024. All rights reserved.