Передача данных из учетной записи хранения Azure в репозиторий Azure DevOps ежедневно

Я создал скрипт Python, который извлекает структуры данных из базы данных SQL (таблицы, представления, индексы, SP) и сохраняет их в учетной записи хранения Azure в папке в формате «ДД-ММ-ГГГГ».

Я хочу создать следующий модуль, который берет эти сценарии из папки и отправляет их в репозиторий Azure DevOps в качестве фиксации новой ветки, которая мгновенно объединяется с основной, чтобы я мог видеть ежедневные изменения, вносимые в базу данных.

Можно ли это сделать на Databricks или мне придется использовать конвейеры DevOps? Если DevOps — единственный путь, как я могу это сделать?


61
1

Ответ:

Решено

В конвейере вы можете использовать Azure CLI «az Storage Copy», чтобы скопировать папки из учетной записи хранения Azure в локальный каталог на компьютере агента, а затем использовать команду git для фиксации и отправки папок в репозитории Azure.

  1. Убедитесь, что в учетной записи хранения существуют последние ежедневные данные с папкой (например, 06-08-2024). В моем примере ниже папки хранятся в контейнере (daily-sqldb-data) учетной записи хранения.

  2. В Azure DevOps у меня есть репозиторий git (daily-sqldb-data). Перейдите в «Настройки проекта» > «Хранилища», на вкладке «Безопасность» репозитория убедитесь, что для следующих двух идентификаторов установлено разрешение «Contribute» на «Allow».

    • Project Collection Build Service ({Organization Name})
    • {Project Name} Build Service ({Organization Name})

  3. В Azure DevOps перейдите в раздел «Настройки проекта» > «Подключения к службам», чтобы создать подключение к службе Azure Resource Manager (соединение ARM), которое может подключаться и получать доступ к подписке Azure, в которой находится учетная запись хранения.

  4. В конвейере вы можете использовать задачу AzureCLI@2 для запуска команды «az storage copy».

# azure-pipelines.yml

variables:
  accountName: 'storagebriran'
  containerName: 'daily-sqldb-data'

pool:
  vmImage: ubuntu-latest

steps:
- checkout: self
  persistCredentials: true

# Create a temporary local branch named as the format 'DD-MM-YYYY' to receive the data downloaded from storage account.
- task: Bash@3
  displayName: 'Create temporary branch'
  inputs:
    targetType: inline
    script: |
      git config --global user.name "[Auto-Boot]"
      git config --global user.email [email protected]

      branchName=$(date +"%d-%m-%Y")
      echo "##vso[task.setvariable variable=folderName;]$branchName"

      echo "Create '$branchName' branch."
      git branch $branchName
      git checkout $branchName

# Download data folder 'DD-MM-YYYY' from storage account.
- task: AzureCLI@2
  displayName: 'Download Daily Data'
  inputs:
    azureSubscription: 'myArmConnection'
    scriptType: 'bash'
    scriptLocation: 'inlineScript'
    inlineScript: |
      echo "Download entire folder '$(folderName)' from container '$(containerName)' of Storage account '$(accountName)'."
      az storage copy -s https://$(accountName).blob.core.windows.net/$(containerName)/$(folderName) -d "$(Build.SourcesDirectory)" --recursive

# Merge the download data folder 'DD-MM-YYYY' from the local temporary branch to the local main branch.
# Commit and push the updates form the local main branch to remote.
- task: Bash@3
  displayName: 'Merge and Push Daily Data'
  inputs:
    targetType: inline
    script: |
      git add --all
      git commit -m "Add daily data in '$(folderName)' folder."

      echo "----------------------------------------------"
      echo "Merge daily data to main branch."
      git checkout main
      git merge $(folderName)
      git branch -d $(folderName)

      echo "----------------------------------------------"
      echo "Pushing changes to remote..."
      git add --all
      git commit -m "Merge daily data from '$(folderName)' branch."
      git push

Если вы хотите, чтобы конвейер запускался автоматически ежедневно, вы можете установить для него запланированные триггеры.

# Disbale CI trigger.
trigger: none

# Trigger the pipeline at 23:00 UTC everyday. The time zone for cron schedules is UTC.
# If you want to schedule a time in your time zone, you need to calculate the corresponding UTC time.
# For example, the time 22:00 in UTC+8 time zone is 14:00 in UTC time zone.
schedules:
- cron: 0 23 * * *
  displayName: 'Daily run at 23:00 UTC'
  branches:
    include:
    - main

. . .

steps:
. . .