自定义 Python 管道

本文介绍如何在 Azure Pipelines 中自定义生成、测试、打包和交付 Python 应用和代码。 若要使用 Python 创建第一个管道,请参阅 Python 快速入门

使用 Azure Pipelines 中的Microsoft托管代理 ,无需设置自己的基础结构即可生成 Python 应用。 通常用于生成、测试和运行 Python 应用(包括 pip)的工具已预安装。

可能需要 请求并行作业 的免费授予,或购买 并行作业 来运行管道。

若要使用 Azure Pipelines 生成 Python 应用,需要 安装了 Python 的自承载代理 。 若要在代理上安装 Python,请参阅 UsePythonVersion

使用特定的 Python 版本

若要在管道中使用特定版本的 Python,请添加“ 使用 Python 版本”任务azure-pipelines.yml。 以下示例 YAML 管道定义将管道设置为使用 Python 3.11。

steps:
- task: UsePythonVersion@0
  inputs:
    versionSpec: '3.11'

使用多个 Python 版本

若要运行具有多个 Python 版本的管道来实现特定目的(例如针对这些版本来测试包),请使用 Python 版本的 matrix 来定义 job。 然后,设置 UsePythonVersion 任务以引用 matrix 变量。 例如:

jobs:
- job: 'Test'
  pool:
    vmImage: 'ubuntu-latest'
  strategy:
    matrix:
      Python38:
        python.version: '3.8'
      Python39:
        python.version: '3.9'
      Python310:
        python.version: '3.10'

  steps:
  - task: UsePythonVersion@0
    inputs:
      versionSpec: '$(python.version)'

可以添加使用矩阵中每个 Python 版本的任务。

运行 Python 脚本

若要从存储库运行 Python 脚本,请使用 script 元素并指定文件名。 例如:

- script: python src/example.py

还可以使用 Python 脚本任务 来运行内联 Python 脚本。

- task: PythonScript@0
  inputs:
    scriptSource: 'inline'
    script: |
      print('Hello world 1')
      print('Hello world 2')

若要参数化脚本执行,请使用 PythonScript 具有 arguments 值的任务将参数传递到正在运行的进程。 可以使用 sys.argv 或更复杂的 argparse 库来分析参数。

- task: PythonScript@0
  inputs:
    scriptSource: inline
    script: |
      import sys
      print ('Executing script file is:', str(sys.argv[0]))
      print ('The arguments are:', str(sys.argv))
      import argparse
      parser = argparse.ArgumentParser()
      parser.add_argument("--world", help="Provide the name of the world to greet.")
      args = parser.parse_args()
      print ('Hello ', args.world)
    arguments: --world Venus

安装依赖项

可以使用脚本安装具有 pip 的特定 PyPI 包。 以下示例安装或升级 pip 以及 setuptoolswheel

- script: python -m pip install --upgrade pip setuptools wheel
  displayName: 'Install tools'

安装要求

更新pip和好友后,典型的下一步是从requirements.txt安装依赖项

- script: pip install -r requirements.txt
  displayName: 'Install requirements'

运行测试

可以使用脚本在管道中安装和运行各种测试。

使用 flake8 运行 lint 测试

以下 YAML 代码安装或升级 flake8 ,并使用它来运行 lint 测试。

- script: |
    python -m pip install flake8
    flake8 .
  displayName: 'Run lint tests'

使用 pytest 进行测试并使用 pytest-cov 收集覆盖率指标

以下 YAML 代码安装 pytestpytest-cov 运行测试,以 JUnit 格式输出测试结果,并将代码覆盖率结果输出到 Cobertura XML 格式。

- script: |
    pip install pytest pytest-azurepipelines
    pip install pytest-cov
    pytest --doctest-modules --junitxml=junit/test-results.xml --cov=. --cov-report=xml
  displayName: 'pytest'

使用 Tox 运行测试

Azure Pipelines 可以运行并行 Tox 测试作业来拆分工作。 在开发计算机上,必须连续运行测试环境。 以下示例用于 tox -e py 运行当前作业处于活动状态的 Python 版本。

- job:

  pool:
    vmImage: 'ubuntu-latest'
  strategy:
    matrix:
      Python38:
        python.version: '3.8'
      Python39:
        python.version: '3.9'
      Python310:
        python.version: '3.10'

  steps:
  - task: UsePythonVersion@0
    displayName: 'Use Python $(python.version)'
    inputs:
      versionSpec: '$(python.version)'

  - script: pip install tox
    displayName: 'Install Tox'

  - script: tox -e py
    displayName: 'Run Tox'

发布测试结果

添加发布测试结果任务,以将 JUnit 或 xUnit 测试结果发布到服务器。

- task: PublishTestResults@2
  condition: succeededOrFailed()
  inputs:
    testResultsFiles: '**/test-*.xml'
    testRunTitle: 'Publish test results for Python $(python.version)'

发布代码覆盖率结果

添加“发布代码覆盖率结果”任务,将代码覆盖率结果发布到服务器。 可以在生成摘要中查看覆盖率指标,并下载 HTML 报表以供进一步分析。

- task: PublishCodeCoverageResults@2
  inputs:
    codeCoverageTool: Cobertura
    summaryFileLocation: '$(System.DefaultWorkingDirectory)/**/coverage.xml'

打包和交付代码

若要进行身份验证 twine,请使用 Python 孪生上传身份验证任务 将身份验证凭据存储在环境变量中 PYPIRC_PATH

- task: TwineAuthenticate@0
  inputs:
    artifactFeed: '<Azure Artifacts feed name>'
    pythonUploadServiceConnection: '<twine service connection from external organization>'

然后添加用于发布包的自定义脚本twine

- script: |
   twine upload -r "<feed or service connection name>" --config-file $(PYPIRC_PATH) <package path/files>

还可以使用 Azure Pipelines 为 Python 应用生成映像将其推送到容器注册表