Python パイプラインをカスタマイズする

この記事では、Azure Pipelines で Python アプリとコードの構築、テスト、パッケージ化、配信をカスタマイズする方法について説明します。 Python を使用するパイプラインを初めて作成する場合は、Python のクイックスタートに関するページをご覧ください。

Azure Pipelines Microsoft でホストされるエージェント を使用すると、独自のインフラストラクチャを設定しなくても、Python アプリを構築できます。 pipを含む Python アプリのビルド、テスト、実行に一般的に使用するツールがプレインストールされています。

パイプラインを実行するには、並列ジョブの無料の許可を要求するかパラメーター ジョブを購入必要になる場合があります。

Azure Pipelines を使用して Python アプリを構築するには、Python がインストールされた 自身がホストするエージェント 必要があります。 エージェントに Python をインストールするには、 UsePythonVersionを参照してください。

特定のバージョンの Python を使用する

パイプラインで特定のバージョンの Python を使用するには、azure-pipelines.yml Python バージョンの使用タスクを追加します。 次の YAML パイプライン定義の例では、Python 3.11 を使用するようにパイプラインを設定します。

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

Python の複数のバージョンを使用する

Python の複数のバージョンでパイプラインを実行するには (たとえば、それらのバージョンに対してパッケージをテストするため)、Python のバージョンの matrix を使って job を定義します。 次に、matrix 変数を参照するように UsePythonVersion タスクを設定します。 次に例を示します。

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')

スクリプトの実行をパラメーター化するには、arguments値を持つPythonScript タスクを使用して、実行中のプロセスに引数を渡します。 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 コードは、 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)'

コード カバレッジの結果を発行する

Publish コード カバレッジの結果タスクを追加して、コード カバレッジの結果をサーバーに発行します。 ビルドの概要でカバレッジ メトリックを確認したり、HTML レポートをダウンロードして詳細な分析を行うことができます。

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

コードをパッケージ化して提供する

twineで認証するには、Python twine アップロード認証タスクを使用して認証資格情報をPYPIRC_PATH環境変数に格納します。

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

次に、twineを使用してパッケージを発行するカスタム script を追加します。

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

Azure Pipelines を使って Python アプリのイメージをビルドし、コンテナー レジストリにそれをプッシュすることもできます。