Я создал скрипт Python, который извлекает структуры данных из базы данных SQL (таблицы, представления, индексы, SP) и сохраняет их в учетной записи хранения Azure в папке в формате «ДД-ММ-ГГГГ».
Я хочу создать следующий модуль, который берет эти сценарии из папки и отправляет их в репозиторий Azure DevOps в качестве фиксации новой ветки, которая мгновенно объединяется с основной, чтобы я мог видеть ежедневные изменения, вносимые в базу данных.
Можно ли это сделать на Databricks или мне придется использовать конвейеры DevOps? Если DevOps — единственный путь, как я могу это сделать?
В конвейере вы можете использовать Azure CLI «az Storage Copy», чтобы скопировать папки из учетной записи хранения Azure в локальный каталог на компьютере агента, а затем использовать команду git
для фиксации и отправки папок в репозитории Azure.
Убедитесь, что в учетной записи хранения существуют последние ежедневные данные с папкой (например, 06-08-2024
). В моем примере ниже папки хранятся в контейнере (daily-sqldb-data
) учетной записи хранения.
В Azure DevOps у меня есть репозиторий git (daily-sqldb-data
). Перейдите в «Настройки проекта» > «Хранилища», на вкладке «Безопасность» репозитория убедитесь, что для следующих двух идентификаторов установлено разрешение «Contribute
» на «Allow
».
Project Collection Build Service ({Organization Name})
{Project Name} Build Service ({Organization Name})
В Azure DevOps перейдите в раздел «Настройки проекта» > «Подключения к службам», чтобы создать подключение к службе Azure Resource Manager (соединение ARM), которое может подключаться и получать доступ к подписке Azure, в которой находится учетная запись хранения.
В конвейере вы можете использовать задачу 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:
. . .