다음을 통해 공유


Git 및 Databricks Git 폴더(Repos)를 사용하는 CI/CD 기술

CI/CD 워크플로에서 Databricks Git 폴더를 사용하는 방법을 알아봅니다. 작업 영역에서 Databricks Git 폴더를 구성하면 Git 리포지토리의 프로젝트 파일에 대한 소스 제어를 사용하여 데이터 엔지니어링 파이프라인에 통합할 수 있습니다.

다음 그림에서는 기술 및 워크플로의 개요를 보여 줍니다.

Git 폴더에 대한 CI/CD 기술 개요입니다.

Azure Databricks의 CI/CD에 대한 개요는 Azure Databricks의 CI/CD란?을 참조하세요.

개발 흐름

Databricks Git 폴더에는 사용자 수준 폴더가 있습니다. 사용자 수준 폴더는 사용자가 원격 리포지토리를 처음 복제할 때 자동으로 만들어집니다. 사용자 폴더의 Databricks Git 폴더는 각 사용자에 대해 개별적이고 사용자가 코드를 변경하는 “로컬 체크 아웃”으로 생각할 수 있습니다.

Databricks Git 폴더의 사용자 폴더에서 원격 리포지토리를 복제합니다. 기본 분기에 변경 내용을 직접 커밋하고 푸시하는 대신 새 기능 분기를 만들거나 이전에 만든 분기를 작업에 선택하는 것이 가장 좋습니다. 해당 분기에서 변경, 커밋, 푸시 변경을 수행할 수 있습니다. 코드를 병합할 준비가 되면 Git 폴더 UI에서 병합할 수 있습니다.

요구 사항

이 워크플로를 사용하려면 Git 통합을 이미 설정했어야 합니다.

참고 항목

Databricks에서는 각 개발자가 자체 기능 분기에서 작업하는 것이 좋습니다. 병합 충돌을 해결하는 방법에 대한 자세한 내용은 병합 충돌 해결을 참조하세요.

Git 폴더에서 공동 작업

다음 워크플로에서는 메인 분기를 기반으로 하는 feature-b라는 분기를 사용합니다.

  1. 기존 Git 리포지토리를 Databricks 작업 영역에 복제합니다.
  2. Git 폴더 UI를 사용하여 메인 분기에서 기능 분기를 만들기를 할 수 있습니다. 이 예제에서는 단순성을 위해 단일 기능 분기 feature-b를 사용합니다. 여러 기능 분기를 만들고 사용하여 작업을 수행할 수 있습니다.
  3. 리포지토리에서 Azure Databricks Notebook 및 기타 파일을 수정합니다.
  4. 변경 내용을 커밋하고 Git 공급자에 푸시합니다.
  5. 이제 기여자가 Git 리포지토리를 자신의 사용자 폴더에 복제할 수 있습니다.
    1. 새 분기에서 작업하는 동료가 Git 폴더의 Notebook 및 기타 파일을 변경합니다.
    2. 기여자는 변경 사항을 커밋하고 Git 공급자에게 푸시합니다.
  6. 다른 분기의 변경 내용을 병합하거나 Databricks의 feature-b 분기를 다시 기반으로 하려면 Git 폴더 UI에서 다음 워크플로 중 하나를 사용합니다.
  7. 원격 Git 리포지토리와 main 분기에 작업을 병합할 준비가 되면 Git 폴더 UI를 사용하여 feature-b의 변경 내용을 병합합니다. 원하는 경우 변경 내용을 Git 폴더를 지원하는 Git 리포지토리에 직접 병합할 수 있습니다.

프로덕션 작업 워크플로

Databricks Git 폴더는 프로덕션 작업을 실행하기 위한 두 가지 옵션을 제공합니다.

  • 옵션 1: 작업 정의에 원격 Git 참조를 제공합니다. 예를 들어 Git 리포지토리의 main 분기에서 특정 Notebook을 실행합니다.
  • 옵션 2: 프로덕션 Git 리포지토리를 설정하고 Repos API를 호출하여 프로그래밍 방식으로 업데이트합니다. 이 원격 리포지토리 복제하는 Databricks Git 폴더에 대해 작업을 실행합니다. Repos API 호출은 작업의 첫 번째 작업이어야 합니다.

옵션 1: 원격 리포지토리에서 Notebooks를 사용하여 작업 실행

원격 Git 리포지토리에 있는 Notebook을 사용하여 Azure Databricks 작업을 실행하고 작업 정의 프로세스를 간소화하고 단일 원본을 유지합니다. 이 Git 참조는 git 커밋, 태그 또는 분기일 수 있으며 작업 정의에서 사용자가 제공합니다.

이렇게 하면 사용자가 프로덕션 리포지토리에서 로컬 편집을 하거나 분기를 전환하는 등 의도치 않게 프로덕션 작업이 변경되는 것을 방지할 수 있습니다. 또한 Databricks에서 별도의 프로덕션 Git 폴더를 만들고, 권한을 관리하고, 업데이트된 상태로 유지할 필요가 없으므로 CD 단계를 자동화합니다.

작업에서 Git 사용을 참조하세요.

옵션 2: 프로덕션 Git 폴더 및 Git 자동화 설정

이 옵션에서는 프로덕션 Git 폴더를 설정하고 병합 시 Git 폴더를 업데이트하도록 자동화를 설정합니다.

1단계: 최상위 폴더 설정

관리자는 사용자가 아닌 최상위 폴더를 만듭니다. 이러한 최상위 폴더의 가장 일반적인 사용 사례는 개발, 스테이징, 프로덕션에 적합한 버전 또는 분기에 대한 Databricks Git 폴더가 포함된 개발, 스테이징, 프로덕션 폴더를 만드는 것입니다. 예를 들어 회사에서 프로덕션에 main 분기를 사용하는 경우 "프로덕션" Git 폴더에 main 분기가 체크 아웃되어 있어야 합니다.

일반적으로 이러한 최상위 폴더에 대한 권한은 작업 영역 내에서 관리자가 아닌 모든 사용자에 대해 읽기 전용입니다. 이러한 최상위 폴더의 경우 워크스페이스 사용자가 프로덕션 코드를 실수로 편집하는 것을 방지하기 위해 서비스 관리자에게만 CAN EDIT 및 CAN MANAGE 권한을 제공하는 것이 좋습니다.

최상위 Git 폴더

2단계: Git 폴더 API를 사용하여 Databricks Git 폴더에 대한 자동화된 업데이트 설정

Databricks에서 Git 폴더를 최신 버전으로 유지하려면 Repos API를 호출하도록 Git 자동화를 설정하면 됩니다. Git 공급자에서 PR을 메인 분기에 성공적으로 병합할 때마다 해당 Git 폴더의 Repos API 엔드포인트를 호출하여 최신 버전으로 업데이트하도록 자동화를 설정하세요.

예를 들어 GitHub에서는 GitHub 작업을 사용하여 이를 수행할 수 있습니다. 자세한 내용은 Repos API를 참조하세요.

Databricks Notebook 셀 내에서 Databricks REST API를 호출하려면 먼저 %pip install databricks-sdk --upgrade(최신 Databricks REST API의 경우)로 Databricks SDK를 설치한 다음 databricks.sdk.core에서 ApiClient를 가져오세요.

참고 항목

%pip install databricks-sdk --upgrade가 “패키지를 찾을 수 없습니다”라는 오류를 반환하면 databricks-sdk 패키지가 이전에 설치되지 않은 것입니다. --upgrade 플래그 없이 %pip install databricks-sdk 명령을 다시 실행합니다.

Notebook에서 Databricks SDK API를 실행하여 작업 영역에 대한 서비스 주체를 검색할 수도 있습니다. 다음은 Python 및 Python용 Databricks SDK를 사용하는 예제입니다.

curl 또는 Terraform과 같은 도구를 사용할 수도 있습니다. Azure Databricks 사용자 인터페이스는 사용할 수 없습니다.

Azure 데이터브릭의 서비스 주체에 대해 자세히 알아보려면 서비스 주체 관리를 참조하세요. 서비스 주체 및 CI/CD에 대한 자세한 내용은 CI/CD에 대한 서비스 주체를 참조하세요. Notebook에서 Databricks SDK를 사용하는 방법에 대한 자세한 내용은 Databricks Notebook 내에서 Python용 Databricks SDK 사용을 참조하세요.

Databricks Git 폴더와 함께 서비스 주체를 사용하세요.

위에서 언급한 워크플로를 서비스 주체로 실행하려면 다음과 같이 하세요:

  1. Azure Databricks를 사용하는 서비스 주체를 만듭니다.
  2. git 자격 증명 추가: 서비스 주체에 Git 공급자 PAT를 사용합니다.

서비스 주체를 설정한 다음, Git 공급자 자격 증명을 추가하려면 다음을 수행합니다.

  1. 서비스 주체를 생성합니다. 서비스 주체를 사용하여 작업 실행을 참조하세요.
  2. 서비스 주체에 대한 Microsoft Entra ID 토큰을 만듭니다.
  3. 서비스 주체를 만든 후에는 서비스 주체 API를 사용하여 Azure Databricks 작업 영역에 추가합니다.
  4. Microsoft Entra ID 토큰 및 Git 자격 증명 API를 사용하여 워크스페이스에 Git 공급자 자격 증명을 추가하세요.

Terraform 통합

Terraformdatabricks_repo를 사용하여 완전히 자동화된 설정으로 Databricks Git 폴더를 관리할 수도 있습니다:

resource "databricks_repo" "this" {
  url = "https://github.com/user/demo.git"
}

Terraform을 사용하여 서비스 주체에 Git 자격 증명을 추가하려면 다음 구성을 추가합니다.

  provider "databricks" {
    # Configuration options
  }

  provider "databricks" {
    alias = "sp"
    host = "https://....cloud.databricks.com"
    token = databricks_obo_token.this.token_value
  }

  resource "databricks_service_principal" "sp" {
    display_name = "service_principal_name_here"
  }

  resource "databricks_obo_token" "this" {
    application_id   = databricks_service_principal.sp.application_id
    comment          = "PAT on behalf of ${databricks_service_principal.sp.display_name}"
    lifetime_seconds = 3600
  }

  resource "databricks_git_credential" "sp" {
    provider = databricks.sp
    depends_on = [databricks_obo_token.this]
    git_username          = "myuser"
    git_provider          = "azureDevOpsServices"
    personal_access_token = "sometoken"
  }

Databricks Git 폴더를 사용하여 자동화된 CI/CD 파이프라인 구성

다음은 GitHub 작업으로 실행할 수 있는 간단한 자동화입니다.

요구 사항

  • 병합되는 베이스 분기 추적하는 Databricks 작업 영역에 Git 폴더를 만들었습니다.
  • DBFS 위치에 배치할 아티팩트를 만드는 Python 패키지가 있습니다. 코드는 다음을 충족해야 합니다.
    • 원하는 분기(예: development)와 연결된 리포지토리를 업데이트하여 최신 버전의 Notebook을 포함합니다.
    • 아티팩트 빌드 및 라이브러리 경로에 복사합니다.
    • 작업에서 아티팩트 버전을 수동으로 업데이트할 필요가 없도록 빌드 아티팩트 마지막 버전을 바꿉니다.

자동화된 CI/CD 워크플로 만들기

  1. 코드가 Databricks 작업 영역에 액세스할 수 있도록 비밀을 설정합니다. Github 리포지토리에 다음 비밀을 추가합니다.

    • DEPLOYMENT_TARGET_URL: 작업 영역 URL로 설정합니다. 부분 문자열을 /?o 포함하지 않습니다.
    • DEPLOYMENT_TARGET_TOKEN: 이를 PAT(Databricks Personal Access Token)로 설정합니다. Azure Databricks 개인용 액세스 토큰 인증의 지침에 따라 Databricks PAT를 생성할 수 있습니다.
  2. Git 리포지토리의 작업 탭으로 이동하고 새 워크플로 단추를 클릭합니다. 페이지 상단에서 직접 워크플로 설정을 선택하고 다음 스크립트를 붙여넣습니다.

    GitHub 작업 UI의 “직접 워크플로 설정” 링크

    # This is a basic automation workflow to help you get started with GitHub Actions.
    
    name: CI
    
    # Controls when the workflow will run
    on:
      # Triggers the workflow on push for main and dev branch
      push:
        paths-ignore:
          - .github
        branches:
          # Set your base branch name here
          - your-base-branch-name
    
    # A workflow run is made up of one or more jobs that can run sequentially or in parallel
    jobs:
      # This workflow contains a single job called "deploy"
      deploy:
        # The type of runner that the job will run on
        runs-on: ubuntu-latest
        environment: development
        env:
          DATABRICKS_HOST: ${{ secrets.DEPLOYMENT_TARGET_URL }}
          DATABRICKS_TOKEN:  ${{ secrets.DEPLOYMENT_TARGET_TOKEN }}
          REPO_PATH: /Workspace/Users/someone@example.com/workspace-builder
          DBFS_LIB_PATH: dbfs:/path/to/libraries/
          LATEST_WHEEL_NAME: latest_wheel_name.whl
    
        # Steps represent a sequence of tasks that will be executed as part of the job
        steps:
        # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
        - uses: actions/checkout@v3
    
        - name: Setup Python
          uses: actions/setup-python@v3
          with:
          # Version range or exact version of a Python version to use, using SemVer's version range syntax.
            python-version: 3.8
    
        # Download the Databricks CLI. See https://github.com/databricks/setup-cli
        - uses: databricks/setup-cli@main
    
        - name: Install mods
          run: |
            pip install pytest setuptools wheel
    
        - name: Extract branch name
          shell: bash
          run: echo "##[set-output name=branch;]$(echo ${GITHUB_REF#refs/heads/})"
          id: extract_branch
    
        - name: Update Databricks Git folder
          run: |
            databricks repos update ${{env.REPO_PATH}} --branch "${{ steps.extract_branch.outputs.branch }}"
    
        - name: Build Wheel and send to Databricks DBFS workspace location
          run: |
            cd $GITHUB_WORKSPACE
            python setup.py bdist_wheel
            dbfs cp --overwrite ./dist/* ${{env.DBFS_LIB_PATH}}
            # there is only one wheel file; this line copies it with the original version number in file name and overwrites if that version of wheel exists; it does not affect the other files in the path
            dbfs cp --overwrite ./dist/* ${{env.DBFS_LIB_PATH}}${{env.LATEST_WHEEL_NAME}} # this line copies the wheel file and overwrites the latest version with it
    
  3. 다음 환경 변수 값을 직접 업데이트하세요:

    • DBFS_LIB_PATH: 이 자동화에서 사용할 라이브러리(휠)에 대한 DBFS의 경로입니다. 이 경로는 dbfs:로 시작합니다. 예: dbfs:/mnt/myproject/libraries.
    • REPO_PATH: Databricks 작업 영역의 Notebook이 업데이트될 Git 폴더의 경로입니다.
    • LATEST_WHEEL_NAME: 마지막으로 컴파일된 Python 휠 파일(.whl)의 이름입니다. Databricks 작업에서 휠 버전을 수동으로 업데이트하지 않도록 하는 데 사용됩니다. 예들 들어 your_wheel-latest-py3-none-any.whl입니다.
  4. 변경 내용 커밋...을 선택하여 스크립트를 GitHub 작업 워크플로로 커밋합니다. 이 워크플로에 대한 끌어오기 요청이 병합된 후 Git 리포지토리의 작업 탭으로 이동하여 작업이 성공했음을 확인합니다.