Azure DevOps を使用した Azure Databricks での継続的インテグレーションとデリバリー

注意

この記事では、Databricks によって提供もサポートもされていない Azure DevOps について説明します。 プロバイダーに問い合わせるには、「Azure DevOps Services サポート」を参照してください。

この記事では、Azure Databricks で動作するコードと成果物に対して Azure DevOps オートメーションを構成する手順について説明します。 具体的には、継続的インテグレーションと継続的デリバリー (CI/CD) ワークフローを構成して、Git リポジトリに接続し、Azure Pipelines を使用してジョブを実行し、Python ホイール (*.whl) をビルドして単体テストし、これを Databricks ノートブックで使用するためにデプロイします。

CI/CD 開発ワークフロー

Databricks では、Azure DevOps を使用した CI/CD 開発に次のワークフローを提案しています。

  1. サードパーティの Git プロバイダーでリポジトリを作成するか、既存のリポジトリを使用してください。
  2. ローカル開発マシンを同じサード パーティのリポジトリに接続します。 手順については、サードパーティの Git プロバイダーのドキュメントを参照してください。
  3. 既存の更新された成果物 (ノートブック、コード ファイル、ビルド スクリプトなど) をすべて、サードパーティのリポジトリからローカル開発マシンにプルします。
  4. 必要に応じて、ローカル開発マシン上で成果物を作成、更新、テストします。 次に、新しい成果物と変更された成果物をすべて、ローカル開発マシンからサードパーティのリポジトリにプッシュします。 手順については、サードパーティの Git プロバイダーのドキュメントを参照してください。
  5. 必要に応じて、手順 3 と手順 4 を繰り返します。
  6. Azure DevOps を、サードパーティのリポジトリから成果物を自動的にプルしたり、Azure Databricks ワークスペース上でコードをビルド、テスト、実行したり、テストおよび実行結果を報告したりするための統合されたアプローチとして定期的に使用します。 Azure DevOps は手動で実行できますが、実際の実装では、リポジトリの pull request などの特定のイベントが発生するたびに Azure DevOps を実行するようにサードパーティの Git プロバイダーに指示します。

パイプラインの管理と実行に使用できる CI/CD ツールは多数あります。 この記事では、Azure DevOps を使用する方法について説明します。 CI/CD は設計パターンなので、この記事の例に記載されている手順とステージでは、各ツールのパイプライン定義言語にいくつかの変更を加えて転送する必要があります。 さらに、このパイプラインの例に含まれるコードの多くは、他のツールで呼び出すことができる標準の Python コードです。

ヒント

Azure Databricks で Azure DevOps ではなく Jenkins を使用する方法については、「Azure Databricks 上の Jenkins を使用した CI/CD」を参照してください。

この記事の残りの部分では、Azure Databricks の独自のニーズに合わせて調整できる Azure DevOps の一組のサンプル パイプラインについて説明します。

この例について

この記事の例では、2 つのパイプラインを使用して、リモート Git リポジトリに格納されている Python コードと Python ノートブックの例を収集、デプロイ、実行します。

"ビルド" パイプラインと呼ばれる 1 番目のパイプラインでは、"リリース" パイプラインと呼ばれる 2 番目のパイプライン用にビルド成果物が準備されます。 ビルド パイプラインをリリース パイプラインから分離すると、ビルド成果物をデプロイせずに作成したり、複数のビルドから成果物を同時にデプロイしたりすることができます。 ビルド パイプラインとリリース パイプラインを実行するには:

  1. ビルド パイプライン用に Azure 仮想マシンを作成します。
  2. Git リポジトリから仮想マシンにファイルをコピーします。
  3. Python コード、Python ノートブック、関連するビルド、デプロイ、実行の各設定ファイルが含まれている gzip で圧縮された tar ファイルを作成します。
  4. gzip で圧縮された tar ファイルを zip ファイルとして、リリース パイプラインがアクセスする場所にコピーします。
  5. リリース パイプライン用に別の Azure 仮想マシンを作成します。
  6. ビルド パイプラインの場所から zip ファイルを取得し、zip ファイルのパッケージ化を解除して、Python コード、Python ノートブック、関連するビルド、デプロイ、実行の各設定ファイルを取得します。
  7. Python コード、Python ノートブック、関連するビルド、デプロイ、実行の各設定ファイルをリモートの Azure Databricks ワークスペースにデプロイします。
  8. Python ホイール ライブラリのコンポーネント コード ファイルを Python ホイール ファイルにビルドします。
  9. コンポーネント コードに対して単体テストを実行して、Python ホイール ファイルのロジックを確認します。
  10. Python ノートブックを実行します。そのうちの 1 つが Python ホイール ファイルの機能を呼び出します。

Databricks CLI について

この記事の例では、パイプライン内で非対話型モードの Databricks CLI を使用する方法を示します。 この記事のパイプラインの例では、コードをデプロイし、ライブラリをビルドし、Azure Databricks ワークスペース内でノートブックを実行します。

この記事のコード、ライブラリ、ノートブックの例を実装せずに、ご利用のパイプライン内で Databricks CLI を使用している場合は、次の手順にお従いください。

  1. サービス プリンシパルの認証に OAuth マシン間 (M2M) 認証を使用するように、Azure Databricks ワークスペースを準備します。 開始する前に、Microsoft Entra ID (旧称 Azure Active Directory) サービス プリンシパルと Azure Databricks OAuth シークレットがあることをご確認ください。 「OAuth マシン間 (M2M) 認証」を参照してください。

  2. パイプライン内に Databricks CLI をインストールします。 これを行うには、次のスクリプトを実行する Bash スクリプト タスクをパイプラインに追加します。

    curl -fsSL https://raw.githubusercontent.com/databricks/setup-cli/main/install.sh | sh
    

    Bash スクリプト タスクをパイプラインに追加するには、「手順 3.6.Databricks CLI と Python ホイール ビルド ツールをインストールする」を参照してください。

  3. インストールされた Databricks CLI がワークスペースでサービス プリンシパルを認証することができるように、パイプラインを構成します。 これを行うには、「手順 3.1: リリース パイプラインの環境変数を定義する」をご参照ください。

  4. 必要に応じて、Databricks CLI コマンドを実行するために、さらに Bash スクリプト タスクをパイプラインに追加します。 「Databricks CLI コマンド」をご参照ください。

開始する前に

この記事の例を使用するには、次のものが必要です。

  • 既存の Azure DevOps プロジェクト。 プロジェクトがまだない場合は、Azure DevOps でプロジェクトを作成します
  • Azure DevOps でサポートされている Git プロバイダーを含む既存のリポジトリ。 このリポジトリにサンプルの Python コード、サンプルの Python ノートブック、関連するリリース設定ファイルを追加します。 リポジトリがまだない場合は、Git プロバイダーの手順に従ってリポジトリを作成します。 次に、まだ実行していない場合は、Azure DevOps プロジェクトをこのリポジトリに接続します。 手順については、「サポートされているソース リポジトリ」にあるリンクに従ってください。
  • この記事の例では、OAuth マシン間 (M2M) 認証を使い、Azure Databricks ワークスペースに対して Microsoft Entra ID (旧称 Azure Active Directory) サービス プリンシパルを認証します。 そのサービス プリンシパルの Azure Databricks OAuth シークレットと Microsoft Entra ID サービス プリンシパルが必要です。 「OAuth マシン間 (M2M) 認証」を参照してください。

手順 1: この例にあるファイルをリポジトリに追加する

この手順では、サードパーティの Git プロバイダーを含むリポジトリで、Azure DevOps パイプラインがリモートの Azure Databricks ワークスペース上でビルド、デプロイ、実行する、この記事のファイルの例をすべて追加します。

手順 1.1: Python ホイールのコンポーネント ファイルを追加する

この記事の例では、Azure DevOps パイプラインで Python ホイール ファイルをビルドおよび単体テストします。 次に、ビルドされた Python ホイール ファイルの機能を Azure Databricks ノートブックで呼び出します。

ノートブックが実行される Python ホイール ファイルのロジックと単体テストを定義するには、次に示すように、リポジトリのルートに addcol.pytest_addcol.py という名前の 2 つのファイルを作成し、それらを Libraries フォルダー内の python/dabdemo/dabdemo という名前のフォルダー構造に追加します。

└── Libraries
      └── python
            └── dabdemo
                  └── dabdemo
                        ├── addcol.py
                        └── test_addcol.py

addcol.py ファイルには、後で Python ホイール ファイルに組み込まれてから、Azure Databricks クラスターにインストールされるライブラリ関数が含まれています。 これは、リテラルで入力された新しい列を Apache Spark DataFrame に追加する単純な関数です。

# Filename: addcol.py
import pyspark.sql.functions as F

def with_status(df):
  return df.withColumn("status", F.lit("checked"))

test_addcol.py ファイルには、addcol.py で定義されている with_status 関数にモック DataFrame オブジェクトを渡すテストが含まれています。 結果は、想定される値を含む DataFrame オブジェクトと比較されます。 これらの値が一致する場合、テストは合格です。

# Filename: test_addcol.py
import pytest
from pyspark.sql import SparkSession
from dabdemo.addcol import *

class TestAppendCol(object):

  def test_with_status(self):
    spark = SparkSession.builder.getOrCreate()

    source_data = [
      ("paula", "white", "paula.white@example.com"),
      ("john", "baer", "john.baer@example.com")
    ]

    source_df = spark.createDataFrame(
      source_data,
      ["first_name", "last_name", "email"]
    )

    actual_df = with_status(source_df)

    expected_data = [
      ("paula", "white", "paula.white@example.com", "checked"),
      ("john", "baer", "john.baer@example.com", "checked")
    ]
    expected_df = spark.createDataFrame(
      expected_data,
      ["first_name", "last_name", "email", "status"]
    )

    assert(expected_df.collect() == actual_df.collect())

Databricks CLI でこのライブラリ コードを Python ホイール ファイルに正しくパッケージ化するには、__init__.py__main__.py という名前の 2 つのファイルを、前の 2 つのファイルと同じフォルダーに作成します。 また、次に示すように、python/dabdemo フォルダー内に setup.py という名前のファイルを作成します。

└── Libraries
      └── python
            └── dabdemo
                  ├── dabdemo
                  │     ├── __init__.py
                  │     ├── __main__.py
                  │     ├── addcol.py
                  │     └── test_addcol.py
                  └── setup.py

__init__.py ファイルには、ライブラリのバージョン番号と作成者が含まれています。 <my-author-name> をお客様の名前に置き換えます:

# Filename: __init__.py
__version__ = '0.0.1'
__author__ = '<my-author-name>'

import sys, os

sys.path.append(os.path.join(os.path.dirname(__file__), "..", ".."))

__main__.py ファイルには、ライブラリのエントリ ポイントが含まれています:

# Filename: __main__.py
import sys, os

sys.path.append(os.path.join(os.path.dirname(__file__), "..", ".."))

from addcol import *

def main():
  pass

if __name__ == "__main__":
  main()

setup.py ファイルには、ライブラリを Python ホイール ファイルにビルドするための追加の設定が含まれています。 <my-url><my-author-name>@<my-organization><my-package-description> を有効な値に置き換えます。

# Filename: setup.py
from setuptools import setup, find_packages

import dabdemo

setup(
  name = "dabdemo",
  version = dabdemo.__version__,
  author = dabdemo.__author__,
  url = "https://<my-url>",
  author_email = "<my-author-name>@<my-organization>",
  description = "<my-package-description>",
  packages = find_packages(include = ["dabdemo"]),
  entry_points={"group_1": "run=dabdemo.__main__:main"},
  install_requires = ["setuptools"]
)

手順 1.2: Python ホイール ファイルの単体テスト ノートブックを追加する

後で、Databricks CLI ではノートブック ジョブを実行します。 このジョブは、run_unit_tests.py のファイル名を持つ Python ノートブックを実行します。 このノートブックは、Python ホイール ライブラリのロジックに対して pytest を実行します。

この記事の例の単体テストを実行するには、リポジトリのルートに、次の内容を含む run_unit_tests.py という名前のノートブック ファイルを追加します。

# Databricks notebook source

# COMMAND ----------

# MAGIC %sh
# MAGIC
# MAGIC mkdir -p "/Workspace${WORKSPACEBUNDLEPATH}/Validation/reports/junit/test-reports"

# COMMAND ----------

# Prepare to run pytest.
import sys, pytest, os

# Skip writing pyc files on a readonly filesystem.
sys.dont_write_bytecode = True

# Run pytest.
retcode = pytest.main(["--junit-xml", f"/Workspace{os.getenv('WORKSPACEBUNDLEPATH')}/Validation/reports/junit/test-reports/TEST-libout.xml",
                      f"/Workspace{os.getenv('WORKSPACEBUNDLEPATH')}/files/Libraries/python/dabdemo/dabdemo/"])

# Fail the cell execution if there are any test failures.
assert retcode == 0, "The pytest invocation failed. See the log for details."

手順 1.3: Python ホイール ファイルを呼び出すノートブックを追加する

後で、Databricks CLI では別のノートブック ジョブを実行します。 このノートブックは、DataFrame オブジェクトを作成し、それを Python ホイール ライブラリの with_status 関数に渡し、結果を出力し、ジョブの実行結果を報告します。 リポジトリのルートに、次の内容を含む dabdemo_notebook.py という名前のノートブック ファイルを作成します。

# Databricks notebook source

# COMMAND ----------

# Restart Python after installing the Python wheel.
dbutils.library.restartPython()

# COMMAND ----------

from dabdemo.addcol import with_status

df = (spark.createDataFrame(
  schema = ["first_name", "last_name", "email"],
  data = [
    ("paula", "white", "paula.white@example.com"),
    ("john", "baer", "john.baer@example.com")
  ]
))

new_df = with_status(df)

display(new_df)

# Expected output:
#
# +------------+-----------+-------------------------+---------+
# │ first_name │ last_name │ email                   │ status  │
# +============+===========+=========================+=========+
# │ paula      │ white     │ paula.white@example.com │ checked │
# +------------+-----------+-------------------------+---------+
# │ john       │ baer      │ john.baer@example.com   │ checked │
# +------------+-----------+-------------------------+---------+

手順 1.4: バンドル構成を作成する

この記事の例では、Databricks アセット バンドル を使用して、Python ホイール ファイル、2 つのノートブック、Python コード ファイルをビルド、デプロイ、実行するための設定と動作を定義します。 Databricks アセット バンドル (単に バンドル とも呼ばれます) を使用すると、完全なデータ、分析、ML プロジェクトをソース ファイルのコレクションとして表すことができます。 「Databricks アセット バンドルとは」をご覧ください。

この記事の例のバンドルを構成するには、リポジトリのルートに databricks.yml という名前のファイルを作成します。 この例の databricks.yml ファイルでは、次のプレースホルダーを置き換えます。

  • <bundle-name> をバンドルの一意なプログラム名に置き換えます。 たとえば、「 azure-devops-demo 」のように入力します。
  • <job-prefix-name> を、この例で Azure Databricks ワークスペース内に作成されたジョブを一意に識別するのに役立つ何らかの文字列に置き換えます。 たとえば、「 azure-devops-demo 」のように入力します。
  • <spark-version-id> をジョブ クラスターの Databricks Runtime バージョン ID に置き換えます。例: 13.3.x-scala2.12
  • <cluster-node-type-id> を、ジョブ クラスターのクラスター ノード タイプ ID (Standard_DS3_v2 など) に置き換えます。
  • targets マッピング内の dev が、ホストとそれに関連するデプロイ動作を指定していることに注意してください。 実際の実装では、独自のバンドルで、このターゲットに別の名前を付けることができます。

この例の databricks.yml ファイルの内容を次に示します。

# Filename: databricks.yml
bundle:
  name: <bundle-name>

variables:
  job_prefix:
    description: A unifying prefix for this bundle's job and task names.
    default: <job-prefix-name>
  spark_version:
    description: The cluster's Spark version ID.
    default: <spark-version-id>
  node_type_id:
    description: The cluster's node type ID.
    default: <cluster-node-type-id>

artifacts:
  dabdemo-wheel:
    type: whl
    path: ./Libraries/python/dabdemo

resources:
  jobs:
    run-unit-tests:
      name: ${var.job_prefix}-run-unit-tests
      tasks:
        - task_key: ${var.job_prefix}-run-unit-tests-task
          new_cluster:
            spark_version: ${var.spark_version}
            node_type_id: ${var.node_type_id}
            num_workers: 1
            spark_env_vars:
              WORKSPACEBUNDLEPATH: ${workspace.root_path}
          notebook_task:
            notebook_path: ./run_unit_tests.py
            source: WORKSPACE
          libraries:
            - pypi:
                package: pytest
    run-dabdemo-notebook:
      name: ${var.job_prefix}-run-dabdemo-notebook
      tasks:
        - task_key: ${var.job_prefix}-run-dabdemo-notebook-task
          new_cluster:
            spark_version: ${var.spark_version}
            node_type_id: ${var.node_type_id}
            num_workers: 1
            spark_env_vars:
              WORKSPACEBUNDLEPATH: ${workspace.root_path}
          notebook_task:
            notebook_path: ./dabdemo_notebook.py
            source: WORKSPACE
          libraries:
            - whl: "/Workspace${workspace.root_path}/files/Libraries/python/dabdemo/dist/dabdemo-0.0.1-py3-none-any.whl"

targets:
  dev:
    mode: development

databricks.yml ファイルの構文の詳細については、「Databricks アセット バンドルの構成」を参照してください。

手順 2: ビルド パイプラインを定義する

Azure DevOps には、YAML を使用して CI/CD パイプラインのステージを定義するための、クラウドでホストされたユーザー インターフェイスが用意されています。 Azure DevOps とパイプラインの詳細については、「Azure DevOps のドキュメント」を参照してください。

この手順では、YAML マークアップを使用してビルド パイプラインを定義します。これにより、デプロイ成果物がビルドされます。 コードを Azure Databricks ワークスペースにデプロイするには、このパイプラインのビルド成果物をリリース パイプラインへの入力として指定します。 このリリース パイプラインは後で定義します。

ビルド パイプラインを実行するために、Azure DevOps では、Kubernetes、VM、Azure Functions、Azure Web Apps などの多数のターゲットへのデプロイをサポートするクラウドホスト型のオンデマンド実行エージェントが提供されています。 この例では、オンデマンド エージェントを使用して、デプロイ成果物のビルドを自動化します。

この記事の例のビルド パイプラインを次のように定義します。

  1. Azure DevOps にサインインし、[サインイン] リンクをクリックして Azure DevOps プロジェクトを開きます。

    Note

    Azure DevOps プロジェクトの代わりに Azure Portal が表示された場合は、[その他のサービス] > [Azure DevOps 組織] > [自分の Azure DevOps 組織] の順にクリックし、Azure DevOps プロジェクトを開きます。

  2. サイドバーで [パイプライン] をクリックし、[パイプライン] メニューで [パイプライン] をクリックします。

    Azure DevOps のパイプラインのメニュー

  3. [新しいパイプライン] ボタンをクリックし、画面の指示に従います。 (既にパイプラインがある場合は、代わりに [パイプラインの作成] をクリックします。)これらの指示の最後に、パイプライン エディターが開きます。 ここで、表示される azure-pipelines.yml ファイルでビルド パイプライン スクリプトを定義します。 手順の最後にパイプライン エディターが表示されない場合は、ビルド パイプラインの名前を選択し、[編集] をクリックします。

    Git ブランチ セレクター Git ブランチ セレクター を使用して、Git リポジトリ内の各ブランチのビルド プロセスをカスタマイズします。 運用作業をリポジトリの main ブランチで直接行わないことが CI/CD のベスト プラクティスです。 この例では、main の代わりに使用される release という名前のブランチがリポジトリ内に存在することを前提としています。

    Azure DevOps のパイプライン エディター

    azure-pipelines.yml ビルド パイプライン スクリプトは、パイプラインに関連付けるリモート Git リポジトリのルートに既定で格納されます。

  4. パイプラインの azure-pipelines.yml ファイルのスターター コンテンツを次の定義で上書きし、[保存] をクリックします。

    # Specify the trigger event to start the build pipeline.
    # In this case, new code merged into the release branch initiates a new build.
    trigger:
    - release
    
    # Specify the operating system for the agent that runs on the Azure virtual
    # machine for the build pipeline (known as the build agent). The virtual
    # machine image in this example uses the Ubuntu 22.04 virtual machine
    # image in the Azure Pipeline agent pool. See
    # https://learn.microsoft.com/azure/devops/pipelines/agents/hosted#software
    pool:
      vmImage: ubuntu-22.04
    
    # Download the files from the designated branch in the remote Git repository
    # onto the build agent.
    steps:
    - checkout: self
      persistCredentials: true
      clean: true
    
    # Generate the deployment artifact. To do this, the build agent gathers
    # all the new or updated code to be given to the release pipeline,
    # including the sample Python code, the Python notebooks,
    # the Python wheel library component files, and the related Databricks asset
    # bundle settings.
    # Use git diff to flag files that were added in the most recent Git merge.
    # Then add the files to be used by the release pipeline.
    # The implementation in your pipeline will likely be different.
    # The objective here is to add all files intended for the current release.
    - script: |
        git diff --name-only --diff-filter=AMR HEAD^1 HEAD | xargs -I '{}' cp --parents -r '{}' $(Build.BinariesDirectory)
        mkdir -p $(Build.BinariesDirectory)/Libraries/python/dabdemo/dabdemo
        cp $(Build.Repository.LocalPath)/Libraries/python/dabdemo/dabdemo/*.* $(Build.BinariesDirectory)/Libraries/python/dabdemo/dabdemo
        cp $(Build.Repository.LocalPath)/Libraries/python/dabdemo/setup.py $(Build.BinariesDirectory)/Libraries/python/dabdemo
        cp $(Build.Repository.LocalPath)/*.* $(Build.BinariesDirectory)
      displayName: 'Get Changes'
    
    # Create the deployment artifact and then publish it to the
    # artifact repository.
    - task: ArchiveFiles@2
      inputs:
        rootFolderOrFile: '$(Build.BinariesDirectory)'
        includeRootFolder: false
        archiveType: 'zip'
        archiveFile: '$(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip'
        replaceExistingArchive: true
    
    - task: PublishBuildArtifacts@1
      inputs:
        ArtifactName: 'DatabricksBuild'
    

手順 3: リリース パイプラインを定義する

リリース パイプラインでは、ビルド成果物をビルド パイプラインから Azure Databricks 環境にデプロイします。 この手順のリリース パイプラインを前の手順のビルド パイプラインから分離すると、ビルドをデプロイせずに作成したり、複数のビルドから成果物を同時にデプロイしたりすることができます。

  1. Azure DevOps プロジェクトのサイドバーの [パイプライン] メニューで、[リリース] をクリックします。

    Azure DevOps のリリース

  2. [新規] > [新しいリリース パイプライン] の順にクリックします。 (既にパイプラインがある場合は、代わりに [新しいパイプライン] をクリックします。)

  3. 画面の横には、一般的なデプロイ パターンに関するお勧めテンプレートの一覧が表示されます。 この例のリリース パイプラインでは、[空のジョブ] をクリックします。

    Azure DevOps のリリース パイプライン 1

  4. 画面の横にある [成果物] ボックスで、[追加] をクリックします。 [成果物の追加] ウィンドウの [ソース (ビルド パイプライン)] で、以前に作成したビルド パイプラインを選択します。 [追加] をクリックします。

    Azure DevOps のリリース パイプライン 2

  5. 雷アイコン をクリックして画面の横にトリガー オプションを表示することによって、パイプラインがトリガーされる方法を構成できます。 ビルド成果物が使用できるかどうかに基づいて、またはプル要求のワークフローの後に、リリースを自動的に開始するには、適切なトリガーを有効にします。 今のところ、この例では、この記事の最後の手順でビルド パイプライン、リリース パイプラインの順に手動でトリガーします。

    Azure DevOps のリリース パイプライン ステージ 1

  6. [保存] > [OK] の順にクリックします。

手順 3.1: リリース パイプラインの環境変数を定義する

この例のリリース パイプラインでは、次の環境変数を使います。これらを追加するには、[ステージ 1][スコープ] で、[変数] タブの [パイプライン変数] セクションにある [追加] をクリックします。

  • BUNDLE_TARGET。これは、databricks.yml ファイル内の target の名前と一致している必要があります。 この記事の例では、これは dev です。
  • DATABRICKS_HOSThttps:// で始まる Azure Databricks ワークスペースのワークスペースごとの URL を表します (例: https://adb-<workspace-id>.<random-number>.azuredatabricks.net)。 .net の後に末尾の / を含めないでください。
  • DATABRICKS_CLIENT_ID。Microsoft Entra ID サービス プリンシパルのアプリケーション ID を表します。
  • DATABRICKS_CLIENT_SECRET。Microsoft Entra ID サービス プリンシパルの Azure Databricks OAuth シークレットを表します。

手順 3.2: リリース パイプラインのリリース エージェントを構成する

  1. [ステージ 1] オブジェクト内で [1 個のジョブ、0 個のタスク] リンクをクリックします。

    Azure DevOps のリリース パイプライン ステージの追加

  2. [タスク] タブで [エージェント ジョブ] をクリックします。

  3. [エージェントの選択] セクションの [エージェント プール] で、[Azure Pipelines] を選択します。

  4. [エージェントの指定] で、前にビルド エージェントで指定したのと同じエージェント (この例では ubuntu-22.04) を選択します。

    Azure DevOps リリース パイプライン エージェント ジョブ定義

  5. [保存] > [OK] の順にクリックします。

手順 3.3: リリース エージェントの Python バージョンを設定する

  1. 次の図で赤い矢印で示されている [エージェント ジョブ] セクションのプラス記号をクリックします。 使用可能なタスクを検索できるリストが表示されます。 また、サードパーティ製プラグイン用の [Marketplace] タブも用意されています。こうしたプラグインを使用して、標準の Azure DevOps タスクを補完できます。 次のいくつかの手順では、リリース エージェントに複数のタスクを追加します。

    Azure DevOps でのタスクの追加

  2. 最初に追加するタスクは、[ツール] タブにある [Python バージョンを使用する] です。このタスクが見つからない場合は、[検索] ボックスを使用して見つけてください。 見つけたら、それを選択し、[Python バージョンを使用する] タスクの横にある [追加] ボタンをクリックします。

    Azure DevOps での python バージョンの追加 1

  3. ビルド パイプラインと同様に、Python バージョンが後続のタスクで呼び出されるスクリプトと互換性があることが必要です。 この場合は、[エージェント] ジョブの横にある [Python 3.x を使用する] タスクをクリックし、[バージョンの仕様]3.10 に設定します。 また、[表示名]Use Python 3.10 に設定します。 このパイプラインでは、Python 3.10.12 がインストールされているクラスターで Databricks ランタイム 13.3 LTS を使用していることを前提としています。

    Azure DevOps での python バージョンの追加 2

  4. [保存] > [OK] の順にクリックします。

手順 3.4: ビルド パイプラインからビルド成果物のパッケージ化を解除する

  1. 次に、[ファイルを抽出する] タスクを使用して、リリース エージェントで zip ファイルから Python ホイール ファイル、関連するリリース設定ファイル、ノートブック、Python コード ファイルを抽出します。[エージェント ジョブ] セクションでプラス記号をクリックし、[ユーティリティ] タブの [ファイルを抽出する] タスクを選択して [追加] をクリックします。

  2. [エージェント ジョブ] の横にある [ファイルを抽出する] タスクをクリックし、[アーカイブ ファイル パターン]**/*.zip に設定し、[宛先フォルダー] をシステム変数 $(Release.PrimaryArtifactSourceAlias)/Databricks に設定します。 また、[表示名]Extract build pipeline artifact に設定します。

    注意

    $(Release.PrimaryArtifactSourceAlias) は、リリース エージェントでプライマリ成果物ソースの場所を識別するために Azure DevOps で生成されたエイリアスを表します (例: _<your-github-alias>.<your-github-repo-name>)。 リリース パイプラインでは、この値は、リリース エージェントの RELEASE_PRIMARYARTIFACTSOURCEALIAS[ジョブの初期化] フェーズで環境変数 として設定されます。 「クラシック リリースと成果物の変数」を参照してください。

  3. [表示名]Extract build pipeline artifact に設定します。

    Azure DevOps でのパッケージ化解除

  4. [保存] > [OK] の順にクリックします。

手順 3.5: BUNDLE_ROOT 環境変数を設定する

この記事の例を想定どおりに動作させるには、リリース パイプラインで BUNDLE_ROOT という名前の環境変数を設定する必要があります。 Databricks アセット バンドルは、この環境変数を使用して databricks.yml ファイルが存在する場所を特定します。 この環境変数を設定するには、次の操作を行います。

  1. [環境変数] タスクを使用します。[エージェント ジョブ] セクションでプラス記号をもう一度クリックし、[ユーティリティ] タブで [環境変数] タスクを選択して [追加] をクリックします。

    Note

    [ユーティリティ] タブに [環境変数] タスクが表示されない場合は、[検索] ボックスに「Environment Variables」と入力し、画面の指示に従ってこのタスクを [ユーティリティ] タブに追加します。れには、Azure DevOps を終了してから、再びこの場所に戻ることが必要になる場合があります。

  2. [環境変数 (コンマ区切り)] で、BUNDLE_ROOT=$(Agent.ReleaseDirectory)/$(Release.PrimaryArtifactSourceAlias)/Databricks という定義を入力します。

    Note

    $(Agent.ReleaseDirectory) は、リリース エージェントでリリース ディレクトリの場所 (/home/vsts/work/r1/a など) を識別するための Azure DevOps で生成されたエイリアスを表します。 リリース パイプラインでは、この値は、リリース エージェントの AGENT_RELEASEDIRECTORY[ジョブの初期化] フェーズで環境変数 として設定されます。 「クラシック リリースと成果物の変数」を参照してください。 $(Release.PrimaryArtifactSourceAlias) については、前の手順の注を参照してください。

  3. [表示名]Set BUNDLE_ROOT environment variable に設定します。

    BUNDLE_ROOT 環境変数を設定する

  4. [保存] > [OK] の順にクリックします。

手順 3.6. Databricks CLI と Python ホイール ビルド ツールをインストールする

  1. 次に、リリース エージェントに Databricks CLI と Python ホイール ビルド ツールをインストールします。 リリース エージェントは、次のいくつかのタスクで Databricks CLI および Python ホイール ビルド ツールを呼び出します。 これを行うには、[Bash] タスクを使用します。[エージェント ジョブ] セクションでプラス記号を再度クリックし、[ユーティリティ] タブで [Bash] タスクを選択してから、[追加] をクリックします。

  2. [エージェント ジョブ] の横にある [Bash スクリプト] タスクをクリックします。

  3. [種類] で、[インライン] を選択します。

  4. [スクリプト] の内容を次のコマンドに置き換えます。これにより、Databricks CLI と Python ホイール ビルド ツールがインストールされます。

    curl -fsSL https://raw.githubusercontent.com/databricks/setup-cli/main/install.sh | sh
    pip install wheel
    
  5. [表示名]Install Databricks CLI and Python wheel build tools に設定します。

    Azure DevOps リリース パイプラインインストール パッケージ

  6. [保存] > [OK] の順にクリックします。

手順 3.7: Databricks アセット バンドルを検証する

この手順では、databricks.yml ファイルが構文的に正しいことを確認します。

  1. [Bash] タスクを使用します。[エージェント ジョブ] セクションでプラス記号をもう一度クリックし、[ユーティリティ] タブで [Bash] タスクを選択して [追加] をクリックします。

  2. [エージェント ジョブ] の横にある [Bash スクリプト] タスクをクリックします。

  3. [種類] で、[インライン] を選択します。

  4. [スクリプト] の内容を、次のコマンドに置き換えます。これは、Databricks CLI を使用して、databricks.yml ファイルが構文的に正しいかどうかを確認します。

    databricks bundle validate -t $(BUNDLE_TARGET)
    
  5. [表示名]Validate bundle に設定します。

  6. [保存] > [OK] の順にクリックします。

手順 3.8: バンドルをデプロイする

この手順では、Python ホイール ファイルをビルドし、ビルドされた Python ホイール ファイル、2 つの Python ノートブック、Python ファイルをリリース パイプラインから Azure Databricks ワークスペースにデプロイします。

  1. [Bash] タスクを使用します。[エージェント ジョブ] セクションでプラス記号をもう一度クリックし、[ユーティリティ] タブで [Bash] タスクを選択して [追加] をクリックします。

  2. [エージェント ジョブ] の横にある [Bash スクリプト] タスクをクリックします。

  3. [種類] で、[インライン] を選択します。

  4. [スクリプト] の内容を、次のコマンドに置き換えます。これは、Databricks CLI を使用して、Python ホイール ファイルをビルドし、この記事のファイルの例をリリース パイプラインから Azure Databricks ワークスペースにデプロイします。

    databricks bundle deploy -t $(BUNDLE_TARGET)
    
  5. [表示名]Deploy bundle に設定します。

  6. [保存] > [OK] の順にクリックします。

手順 3.9: Python ホイールの単体テスト ノートブックを実行する

この手順では、Azure Databricks ワークスペースで、単体テスト ノートブックを実行するジョブを実行します。 このノートブックは、Python ホイール ライブラリのロジックに対して単体テストを実行します。

  1. [Bash] タスクを使用します。[エージェント ジョブ] セクションでプラス記号をもう一度クリックし、[ユーティリティ] タブで [Bash] タスクを選択して [追加] をクリックします。

  2. [エージェント ジョブ] の横にある [Bash スクリプト] タスクをクリックします。

  3. [種類] で、[インライン] を選択します。

  4. [スクリプト] の内容を、次のコマンドに置き換えます。これは、Databricks CLI を使用して、Azure Databricks ワークスペースでジョブを実行します。

    databricks bundle run -t $(BUNDLE_TARGET) run-unit-tests
    
  5. [表示名]Run unit tests に設定します。

  6. [保存] > [OK] の順にクリックします。

手順 3.10: Python ホイールを呼び出すノートブックを実行する

この手順では、Azure Databricks ワークスペースで、別のノートブックを実行するジョブを実行します。 このノートブックは、Python ホイール ライブラリを呼び出します。

  1. [Bash] タスクを使用します。[エージェント ジョブ] セクションでプラス記号をもう一度クリックし、[ユーティリティ] タブで [Bash] タスクを選択して [追加] をクリックします。

  2. [エージェント ジョブ] の横にある [Bash スクリプト] タスクをクリックします。

  3. [種類] で、[インライン] を選択します。

  4. [スクリプト] の内容を、次のコマンドに置き換えます。これは、Databricks CLI を使用して、Azure Databricks ワークスペースでジョブを実行します。

    databricks bundle run -t $(BUNDLE_TARGET) run-dabdemo-notebook
    
  5. [表示名]Run notebook に設定します。

  6. [保存] > [OK] の順にクリックします。

これで、リリース パイプラインの構成が完了しました。 次のようになっているはずです。

Azure DevOps によるリリース パイプラインの構成の完了

手順 4: ビルド パイプラインとリリース パイプラインを実行する

この手順では、これらのパイプラインを手動で実行します。 パイプラインを自動的に実行する方法については、「パイプラインをトリガーするイベントの指定」および「リリース トリガー」を参照してください。

ビルド パイプラインを手動で実行するには、次の操作を行います。

  1. サイドバーの [パイプライン] メニューで、[パイプライン] をクリックします。
  2. ビルド パイプラインの名前をクリックしてから、[パイプラインの実行] をクリックします。
  3. [ブランチ/タグ] で、追加したすべてのソース コードを含む Git リポジトリ内のブランチの名前を選択します。 この例では、これが release ブランチ内にあることを前提としています。
  4. 実行をクリックします。 ビルド パイプラインの実行ページが表示されます。
  5. ビルド パイプラインの進行状況を確認し、関連するログを表示するには、[ジョブ] の横にある回転アイコンをクリックします。
  6. [ジョブ] アイコンが緑色のチェック マークに変わったら、リリース パイプラインの実行に進みます。

リリース パイプラインを手動で実行するには、次の操作を行います。

  1. ビルド パイプラインが正常に実行されたら、サイドバーの [パイプライン] メニューの [リリース] をクリックします。
  2. リリース パイプラインの名前をクリックし、[リリースの作成] をクリックします。
  3. Create をクリックしてください。
  4. リリース パイプラインの進行状況を確認するには、リリースの一覧で、最新リリースの名前をクリックします。
  5. [ステージ] ボックスで、[ステージ 1] をクリックしてから [ログ] をクリックします。