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

CI/CD 워크플로에서 Databricks Git 폴더를 사용하는 방법을 알아봅니다. 작업 영역에서 Databricks Git 폴더를 구성하면 Git 리포지토리의 프로젝트 파일에 대한 소스 제어가 제공됩니다.

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

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

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

개발 흐름

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

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 공급자에서 변경 내용을 병합할 수 있습니다.

프로덕션 작업 워크플로

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

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

옵션 1: 원격 리포지토리 Notebook을 사용하여 작업 실행

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

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

Azure Databricks 작업에서 버전 제어 소스 코드 사용을 참조 하세요.

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

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

1단계: 최상위 폴더 설정

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

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

최상위 Git 폴더

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

최신 버전의 Databricks에서 Git 폴더를 유지하려면 Git 자동화를 설정하여 Repos API호출할 수 있습니다. Git 공급자에서 PR을 기본 분기에 성공적으로 병합한 후 적절한 Git 폴더의 Repos API 엔드포인트를 호출하여 최신 버전으로 업데이트하는 자동화를 설정합니다.

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

Databricks Notebook 셀 내에서 Databricks REST API를 호출하려면 먼저 최신 Databricks REST API를 사용하여 Databricks SDK %pip install databricks-sdk --upgrade 를 설치한 다음에서 databricks.sdk.core가져옵니다ApiClient.

참고 항목

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

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

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

Azure Databricks의 서비스 주체에 대한 자세한 내용은 서비스 주체 관리를 참조 하세요. 서비스 주체 및 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 작업으로 실행할 수 있는 간단한 자동화입니다.

요구 사항

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

단계

참고 항목

1단계는 Git 리포지토리의 관리자가 수행해야 합니다.

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

  2. Git 리포지토리의 작업 탭으로 이동하고 새 워크플로 단추를 클릭합니다. 페이지 맨 위에서 워크플로 설정을 직접 선택하고 이 스크립트에 붙여넣습니다.

    GitHub Actions 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:
          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
          env:
            DBFS_LIB_PATH: dbfs:/path/to/libraries/
            REPO_PATH: /Repos/path/here
            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@v2
    
          - name: Setup Python
            uses: actions/setup-python@v2
            with:
            # Version range or exact version of a Python version to use, using SemVer's version range syntax.
              python-version: 3.8
    
          - name: Install mods
            run: |
              pip install databricks-cli
              pip install pytest setuptools wheel
    
          - name: Configure CLI
            run: |
              echo "${{ secrets.DEPLOYMENT_TARGET_URL }} ${{ secrets.DEPLOYMENT_TARGET_TOKEN }}" | databricks configure --token
    
          - 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 --path ${{env.REPO_PATH}} --branch "${{ steps.extract_branch.outputs.branch }}"
    
          - name: Build Wheel and send to Databricks workspace DBFS 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 폴더의 경로입니다. 예들 들어 /Repos/Develop입니다.
    • LATEST_WHEEL_NAME: 마지막으로 컴파일된 Python 휠 파일(.whl)의 이름입니다. Databricks 작업에서 휠 버전을 수동으로 업데이트하지 않도록 하는 데 사용됩니다. 예들 들어 your_wheel-latest-py3-none-any.whl입니다.
  4. 변경 내용 커밋을 선택하여 스크립트를 GitHub Actions 워크플로로 커밋합니다. 이 워크플로에 대한 끌어오기 요청이 병합되면 Git 리포지토리의 작업 탭으로 이동하여 작업이 성공인지 확인합니다.