自定义 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
以及 setuptools
包 wheel
。
- 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 代码安装 pytest
并 pytest-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 应用生成映像并将其推送到容器注册表。