每日将Azure存储账户数据推送至Azure DevOps仓库的方案咨询
一、用 Databricks 搞定的步骤
Databricks本身能跑Python代码,还能对接Azure存储和Azure DevOps的Git仓库,完全可以一站式完成整个流程:
挂载Azure存储账户
先把你的Azure存储容器挂载到Databricks,这样能直接访问日期格式的文件夹。示例代码:dbutils.fs.mount( source = "wasbs://<容器名>@<存储账户名>.blob.core.windows.net", mount_point = "/mnt/sql-scripts", extra_configs = {"fs.azure.account.key.<存储账户名>.blob.core.windows.net":"<存储账户密钥>"} )嫌密钥不安全的话,也可以用Azure AD认证的方式挂载。
读取当日文件夹里的脚本
遍历对应日期的文件夹,把脚本复制到Databricks的本地临时目录:import os import shutil from datetime import datetime today = datetime.now().strftime("%d-%m-%Y") script_dir = f"/dbfs/mnt/sql-scripts/{today}" local_temp_dir = f"/tmp/sql_scripts_{today}" os.makedirs(local_temp_dir, exist_ok=True) # 把存储里的文件复制到本地临时目录 for file in dbutils.fs.ls(script_dir): local_path = os.path.join(local_temp_dir, file.name) dbutils.fs.cp(file.path, f"file:{local_path}")对接Azure DevOps Git仓库
Databricks集群默认带Git,直接用Python调用Git命令就行:import subprocess # 克隆仓库到本地临时目录 repo_dir = "/tmp/devops_repo" subprocess.run(["git", "clone", "<你的Azure DevOps仓库HTTPS地址>", repo_dir], check=True) os.chdir(repo_dir) # 配置Git提交用的用户信息 subprocess.run(["git", "config", "user.name", "你的用户名"], check=True) subprocess.run(["git", "config", "user.email", "你的邮箱"], check=True)创建分支并提交脚本
建个以日期命名的分支,把脚本复制到仓库里提交推送:branch_name = f"sql-script-update-{today}" subprocess.run(["git", "checkout", "-b", branch_name], check=True) # 把脚本复制到仓库指定目录(比如sql_scripts文件夹) repo_script_dir = os.path.join(repo_dir, "sql_scripts") os.makedirs(repo_script_dir, exist_ok=True) for root, _, files in os.walk(local_temp_dir): for file in files: src_path = os.path.join(root, file) dest_path = os.path.join(repo_script_dir, file) shutil.copy(src_path, dest_path) # 提交变更并推送到远程 subprocess.run(["git", "add", "."], check=True) subprocess.run(["git", "commit", "-m", f"更新{today}的SQL脚本"], check=True) subprocess.run(["git", "push", "origin", branch_name], check=True)合并到主分支
如果仓库允许直接推主分支(不推荐,最好走PR),可以直接合并:subprocess.run(["git", "checkout", "main"], check=True) subprocess.run(["git", "merge", branch_name], check=True) subprocess.run(["git", "push", "origin", "main"], check=True)要是需要走PR流程,就调用Azure DevOps的REST API创建PR,再自动批准合并(得有对应的权限)。
定时自动运行
在Databricks里创建个作业,设置每日定时运行这个脚本就行。
二、用Azure DevOps流水线实现的步骤
如果更偏向用DevOps原生流程管理,步骤也很清晰:
新建流水线
进Azure DevOps项目的“流水线”→“新建流水线”,选“Azure Repos Git”作为代码源(虽然是要往这个仓库提交,但流水线可以操作自己的仓库)。设置触发器
要么设定时触发器每日跑一次,要么设Azure存储的触发器——当新的日期文件夹创建时自动触发流水线。下载Azure存储里的脚本
添加“Azure 文件复制”任务,配置参数:- 源类型选Azure Blob
- 选你的存储账户和容器
- Blob前缀填
$(Date:dd-MM-yyyy)/(用流水线变量自动取当前日期) - 目标设为流水线工作目录,比如
$(Build.SourcesDirectory)/sql_scripts
Git操作:创建分支并提交
先确保流水线的服务账户有仓库的读写权限(在项目设置→权限里配置),然后加个Bash任务执行Git命令:# 配置Git用户信息 git config user.name "DevOps流水线" git config user.email "pipeline@yourdomain.com" # 创建日期命名的分支 BRANCH_NAME="sql-script-update-$(date +%d-%m-%Y)" git checkout -b $BRANCH_NAME # 添加并提交文件 git add sql_scripts/* git commit -m "更新$(date +%d-%m-%Y)的SQL脚本" # 推送到远程分支 git push origin $BRANCH_NAME合并到主分支
- 方式一:走PR流程,用Azure DevOps CLI创建并自动完成PR:
# 创建PR az repos pr create --repository <你的仓库名> --source-branch $BRANCH_NAME --target-branch main --title "每日SQL脚本更新" --description "自动生成的PR,同步当日数据库结构变更" # 自动批准并完成PR(需要对应权限) PR_ID=$(az repos pr list --repository <你的仓库名> --source-branch $BRANCH_NAME --query "[0].pullRequestId" -o tsv) az repos pr update --id $PR_ID --status completed - 方式二:如果仓库允许直接合并,跳过PR直接操作:
git checkout main git merge $BRANCH_NAME git push origin main
- 方式一:走PR流程,用Azure DevOps CLI创建并自动完成PR:
测试并启用定时
保存流水线配置,手动触发一次看看流程是否正常,之后开启定时运行。
总结
- 用Databricks适合已经在Databricks做数据处理的场景,用Python一站式搞定,不用额外搭流水线。
- 用Azure DevOps流水线适合看重DevOps流程管控的场景,原生集成Git和Azure服务,权限和流程更规范。
内容的提问来源于stack exchange,提问作者KacperG

