共用方式為


使用 Azure DevOps 在 Azure Databricks 上進行持續整合和傳遞

注意

本文涵蓋 Databricks 既不提供也不支援的 Azure DevOps。 若要連絡供應商,請參閱 Azure DevOps Services 支援

本文會引導您為使用 Azure Databricks 的程式碼和成品設定 Azure DevOps 自動化。 具體來說,您將設定持續整合和傳遞 (CI/CD) 工作流程以連線到 Git 存放庫、使用 Azure Pipelines 執行作業來建置和單元測試 Python Wheel (*.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,但在實際的實作中,您會指示第三方 Git 供應商在每次發生特定事件 (例如存放庫提取要求) 時執行 Azure DevOps。

有許多 CI/CD 工具可用來管理和執行管線。 本文說明如何使用 Azure DevOps。 CI/CD 是一種設計模式,因此在其他各工具中使用本文範例所述的步驟和階段時,應對相應的管線定義語言進行一些變更。 此外,此範例管線中的大部分程式碼都是可在其他工具中叫用的標準 Python 程式碼。

提示

如需搭配 Azure Databricks 而非 Azure DevOps 使用 Jenkins 的相關資訊,請參閱在 Azure Databricks 上使用 Jenkins 進行 CI/CD

本文的其餘部分說明 Azure DevOps 中的一對範例管線,您可以根據您的 Azure Databricks 需求進行調整。

關於範例

本文的範例使用兩個管線來收集、部署和執行儲存在遠端 Git 存放庫中的範例 Python 程式碼和 Python 筆記本。

第一個管線稱為組建管線,會準備稱為發行管線的第二個管線的組建成品。 將組建管線與發行管線分開,可讓您建立組建成品,而不需要部署它,或同時從多個組建部署成品。 若要建構組建和發行管線:

  1. 建立建置管線的 Azure 虛擬機器。
  2. 將檔案從 Git 存放庫複製到虛擬機器。
  3. 建立包含 Python 程式碼、Python 筆記本和相關組建、部署及回合設定檔案的 gzip ed tar 檔案。
  4. 將 gzip'ed tar 檔案當做 zip 檔案複製到發行管線存取的位置。
  5. 為發行管線建立另一個 Azure 虛擬機器。
  6. 從組建管線的位置取得 zip 檔案,然後解除封裝 zip 檔案,以取得 Python 程式碼、Python 筆記本,以及相關的組建、部署和回合設定檔案。
  7. 將 Python 程式碼、Python 筆記本和相關組建、部署及回合設定檔案部署至遠端 Azure Databricks 工作區。
  8. 將 Python Wheel 程式庫的元件程式碼檔案組建至 Python Wheel 檔案。
  9. 在元件程式碼上執行單元測試,以檢查 Python Wheel 檔案中的邏輯。
  10. 執行 Python 筆記本,其中一個會呼叫 Python Wheel 檔案的功能。

關於 Databricks CLI

本文的範例展示如何在管線內的非互動式模式中使用 Databricks CLI。 本文的範例管線會部署程式碼、組建程式庫,並在 Azure Databricks 工作區中執行筆記本。

如果您在管線中使用 Databricks CLI 而不實作本文中的範例程式碼、程式庫和筆記本,請遵循下列步驟:

  1. 準備您的 Azure Databricks 工作區,以使用 OAuth 機器對機器 (M2M) 驗證來驗證服務主體。 開始之前,請確認您擁有具有 Azure Databricks OAuth 祕密的 Microsoft Entra ID 服務主體。 請參閱使用 OAuth (OAuth M2M) 透過服務主體對 Azure Databricks 的存取進行驗證

  2. 在管線中安裝 Databricks CLI。 若要這樣做,請將 Bash 指令碼工作新增至您的管線,以執行下列指令碼:

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

    若要將 Bash 指令碼工作新增至管線,請參閱步驟 3.6. 安裝 Databricks CLI 和 Python Wheel 組建工具

  3. 設定管線以啟用已安裝的 Databricks CLI,向工作區驗證您的服務主體。 若要這樣做,請參閱步驟 3.1:定義發行管線的環境變數

  4. 視需要將更多 Bash 指令碼工作新增至管線,以執行 Databricks CLI 命令。 請參閱 Databricks CLI 命令

開始之前

若要使用本文的範例,您必須具備:

  • 現有的 Azure DevOps 專案。 如果您還沒有專案,請在 Azure DevOps 中建立專案
  • 具有 Azure DevOps 支援的 Git 供應商的現有存放庫。 您會將 Python 範例程式碼、範例 Python 筆記本,以及相關的版本設定檔案新增至此存放庫。 如果您還沒有存放庫,請遵循 Git 供應商的指示建立一個。 然後,如果您尚未將 Azure DevOps 專案連線到此存放庫。請連線。 如需指示,請遵循支援的來源存放庫中的連結。
  • 本文的範例會使用 OAuth 計算機對計算機 (M2M) 驗證,向 Azure Databricks 工作區驗證 Microsoft Entra ID 服務主體。 您擁有的 Microsoft Entra ID 服務主體必須具有適合的 Azure Databricks OAuth 祕密。 請參閱使用 OAuth (OAuth M2M) 透過服務主體對 Azure Databricks 的存取進行驗證

步驟 1:將範例的檔案新增至您的存放庫

在此步驟中,在具有第三方 Git 供應商的存放庫中,您會新增您 Azure DevOps 管線在遠端 Azure Databricks 工作區上組建、部署及執行的所有此文章範例檔案。

步驟 1.1:新增 Python Wheel 元件檔案

在本文中的範例中,您的 Azure DevOps 管線會組建和單元測試 Python Wheel 檔案。 Azure Databricks 筆記本接著會呼叫組建 Python Wheel 檔案的功能。

若要定義筆記本執行所針對的 Python Wheel 檔案的邏輯和單元測試,請在存放庫根目錄中建立名為 addcol.pytest_addcol.py 的兩個檔案,並將其新增至 Libraries 資料夾中名為 python/dabdemo/dabdemo 的資料夾結構,如下所示:

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

檔案 addcol.py 包含程式庫函式,稍後會組建至 Python Wheel 檔案,然後安裝在 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 包含測試,以將模擬 DataFrame 物件傳遞至 addcol.py 中定義的 with_status 函式。 然後,結果會與包含預期值的 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 Wheel 檔案中,請在與上述兩個檔案相同的資料夾中建立名為 __init__.py__main__.py 的兩個檔案。 此外,在 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 Wheel 檔案的其他設定。 將 <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 Wheel 檔案的單元測試筆記本

稍後,Databricks CLI 會執行筆記本作業。 此作業會執行具有檔案名 run_unit_tests.py 的 Python 筆記本。 此筆記本會針對 Python Wheel 程式庫的邏輯執行 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 Wheel 檔案的筆記本

稍後,Databricks CLI 會執行另一個筆記本作業。 此筆記本會建立 DataFrame 物件、將它傳遞給 Python Wheel 程式庫的 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 Asset Bundles 來定義組建、部署和執行 Python Wheel 檔案、兩個筆記本和 Python 程式碼檔案的設定和行為。 Databricks Asset Bundles,一般稱為套件組合,可讓您將完整的資料、分析和 ML 專案表示為來源檔案的集合。 請參閱什麼是 Databricks Asset Bundles?

若要設定本文範例的套件組合,請在存放庫的根目錄中建立名為 databricks.yml 的檔案。 在此範例 databricks.yml 檔案中,取代下列預留位置:

  • <bundle-name> 取代為套件組合的唯一程式設計名稱。 例如: azure-devops-demo
  • <job-prefix-name> 取代為一些字串,以協助唯一識別在此範例的 Azure Databricks 工作區中建立的作業。 例如: azure-devops-demo
  • <spark-version-id> 取代為作業叢集的 Databricks Runtime 版本識別碼,例如 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 Asset Bundles 設定

步驟 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 專案。

    注意

    如果顯示的是 Azure 入口網站而不是您的 Azure DevOps 專案,請按一下 [更多服務] > [Azure DevOps 組織] > [我的 Azure DevOps 組織],然後開啟您的 Azure DevOps 專案。

  2. 按一下側邊欄中的 [管線],然後按一下 [管線] 功能表上的 [管線]。

    Azure DevOps 管線功能表

  3. 按一下 [新增管線] 按鈕,並遵循畫面上的指示。 (如果您已經有管線,則請按一下建立管線。) 在這些指示結束時,管線編輯器隨即開啟。 在這裡,您會在出現的 azure-pipelines.yml 檔案中定義組建管線指令碼。 如果在指示結束時看不到管線編輯器,請選取組建管線的名稱,然後按一下 [編輯]

    您可以使用 Git 分支選取器 Git 分支選取器 來自訂 Git 存放庫中每個分支的組建流程。 CI/CD 最佳做法是不要直接在存放庫的 main 分支中執行生產工作。 這個範例假設要使用的存放庫中,而不是 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. 按一下 [儲存] > [確定]。

步驟 3.1:定義發行管線的環境變數

此範例的發行管線依賴下列環境變數,您可以按一下 [變數] 索引標籤的 [管線變數] 區段中的 [新增],並且 [範圍] 使用 [階段 1]

  • BUNDLE_TARGET,應該符合 databricks.yml 檔案中的 target 名稱。 在本文中的範例中,這是 dev
  • DATABRICKS_HOST,表示 Azure Databricks 工作區的個別工作區 URL,以 https:// 開頭,例如 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. 按一下 [儲存] > [確定]。

步驟 3.3:設定發行代理程式的 Python 版本

  1. 按一下 [代理程式作業] 區段中的加號,如下圖紅色箭號所示。 可用工作的可搜尋清單隨即出現。 第三方外掛模組也有 [市集] 索引標籤,可用來補充標準 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 Runtime 13.3 LTS。

    Azure DevOps 設定 Python 第 2 版

  4. 按一下 [儲存] > [確定]。

步驟 3.4:從組建管線解除封裝組建成品

  1. 接下來,讓發行代理程式使用 [擷取檔案] 工作,從 zip 檔案擷取 Python Wheel 檔案、相關的發行設定檔、筆記本和 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. 按一下 [儲存] > [確定]。

步驟 3.5:設定 BUNDLE_ROOT 環境變數

若要讓本文的範例如預期般運作,您必須在發行管線中設定名為 BUNDLE_ROOT 的環境變數。 Databricks Asset Bundles 會使用此環境變數來判斷 databricks.yml 檔案所在的位置。 要設定此環境變數:

  1. 使用 [環境變數]工作:再按一下 [代理程式作業] 區段中的加號,選取 [公用程式] 索引標籤上的 [環境變數] 工作,然後按一下 [新增]。

    注意

    如果 [公用程式] 索引標籤上看不到 [環境變數] 工作,請在 [搜尋] 方塊中輸入 Environment Variables,並遵循畫面上的指示,將工作新增至 [公用程式] 索引標籤。這可能需要您離開 Azure DevOps,然後再回到您離開的位置。

  2. 針對 [環境變數 (逗號分隔)],輸入下列定義:BUNDLE_ROOT=$(Agent.ReleaseDirectory)/$(Release.PrimaryArtifactSourceAlias)/Databricks

    注意

    $(Agent.ReleaseDirectory) 表示 Azure DevOps 產生的別名,以識別發行代理程式上的發行目錄位置,例如 /home/vsts/work/r1/a。 發行管線會將此值設定為發行代理程式的 [初始化作業] 階段中的環境變數 AGENT_RELEASEDIRECTORY。 參閲傳統發行和成品變數。 如需 $(Release.PrimaryArtifactSourceAlias) 的相關資訊,請參閱上一個步驟中的附注。

  3. 將 [顯示名稱] 設定為 Set BUNDLE_ROOT environment variable

    設定 BUNDLE_ROOT 環境變數

  4. 按一下 [儲存] > [確定]。

步驟 3.6. 安裝 Databricks CLI 和 Python Wheel 組建工具

  1. 接下來,在發行代理程式上安裝 Databricks CLI 和 Python Wheel 組建工具。 發行代理程式會在後續幾個工作中呼叫 Databricks CLI 和 Python Wheel 組建工具。 為此,使用 Bash 工作:再按一下 [代理程式作業] 區段中的加號,選取 [公用程式] 索引標籤上的 Bash 工作,然後按一下 [新增]。

  2. 按一下 [代理程式作業] 旁的 [Bash 指令碼] 工作。

  3. 針對 [類型],選取 [內嵌]。

  4. 使用下列命令取代指令碼的內容,以安裝 Databricks CLI 和 Python Wheel 組建工具:

    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. 按一下 [儲存] > [確定]。

步驟 3.7:驗證 Databricks Asset Bundle

在此步驟中,您要確定 databricks.yml 檔案語法正確。

  1. 使用 Bash 工作:再按一下 [代理程式作業] 區段中的加號,選取 [公用程式] 索引標籤上的 Bash 工作,然後按一下 [新增]。

  2. 按一下 [代理程式作業] 旁的 [Bash 指令碼] 工作。

  3. 針對 [類型],選取 [內嵌]。

  4. 使用下列命令取代指令碼的內容,以使用 Databricks CLI 來檢查 databricks.yml 檔案語法是否正確:

    databricks bundle validate -t $(BUNDLE_TARGET)
    
  5. 將 [顯示名稱] 設定為 Validate bundle

  6. 按一下 [儲存] > [確定]。

步驟 3.8:部署套件組合

在此步驟中,您會組建 Python Wheel 檔案,並將組建的 Python Wheel 檔案、兩個 Python 筆記本和 Python 檔案從發行管線部署到 Azure Databricks 工作區。

  1. 使用 Bash 工作:再按一下 [代理程式作業] 區段中的加號,選取 [公用程式] 索引標籤上的 Bash 工作,然後按一下 [新增]。

  2. 按一下 [代理程式作業] 旁的 [Bash 指令碼] 工作。

  3. 針對 [類型],選取 [內嵌]。

  4. 使用下列命令取代指令碼的內容,以使用 Databricks CLI 來組建 Python Wheel 檔案,並將本文的範例檔案從發行管線部署到 Azure Databricks 工作區:

    databricks bundle deploy -t $(BUNDLE_TARGET)
    
  5. 將 [顯示名稱] 設定為 Deploy bundle

  6. 按一下 [儲存] > [確定]。

步驟 3.9:執行 Python Wheel 的單元測試筆記本

在此步驟中,您會執行在 Azure Databricks 工作區中執行單元測試筆記本的作業。 此筆記本會針對 Python Wheel 程式庫的邏輯執行單元測試。

  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. 按一下 [儲存] > [確定]。

步驟 3.10:執行呼叫 Python Wheel 的筆記本

在此步驟中,您會執行在 Azure Databricks 工作區中執行另一個筆記本的作業。 此筆記本會呼叫 Python Wheel 程式庫。

  1. 使用 Bash 工作:再按一下 [代理程式作業] 區段中的加號,選取 [公用程式] 索引標籤上的 Bash 工作,然後按一下 [新增]。

  2. 按一下 [代理程式作業] 旁的 [Bash 指令碼] 工作。

  3. 針對 [類型],選取 [內嵌]。

  4. 使用下列命令取代指令碼的內容,以使用 Databricks CLI 在 Azure Databricks 工作區中執行作業:

    databricks bundle run -t $(BUNDLE_TARGET) run-dabdemo-notebook
    
  5. 將 [顯示名稱] 設定為 Run notebook

  6. 按一下 [儲存] > [確定]。

您現在已完成發行管線的設定。 它看起來應該如下:

Azure DevOps 已完成發行管線設定

步驟 4:執行組建和發行管線

在此步驟中,您會手動執行管線。 若要了解如何自動執行管線,請參閱指定觸發管線的活動發行觸發程序

若要手動執行組建管線:

  1. 在側邊欄中的 [管線] 功能表上,按一下 [管線]
  2. 按一下組建管線的名稱,然後按一下 [執行管線]
  3. 針對 [分支/標籤],選取包含您新增的所有原始程式碼的 Git 存放庫中分支的名稱。 此範例假設這是在 release 分支中。
  4. 按一下 [執行]。 組建管線的執行頁面隨即出現。
  5. 若要查看組建管線的進度,以及檢視相關的記錄,請按一下 [作業] 旁的旋轉圖示。
  6. 作業圖示變成綠色核取記號之後,繼續執行發行管線。

若要手動執行發行管線:

  1. 成功執行組建管線之後,在側邊欄的 [管線] 功能表上,按一下 [發行]
  2. 按一下發行管線的名稱,然後按一下 [建立發行]
  3. 按一下 [建立]。
  4. 若要查看發行管線的進度,請在發行清單中,按一下最新版本的名稱。
  5. 在 [階段] 方塊中,按一下 [階段 1],然後按一下 [記錄]。