如何自动将Azure DevOps源的.whl制品部署到Synapse Spark池
Azure DevOps 流水线自动部署自定义.whl包到Synapse Spark池实现方案
整套流程可以通过Azure CLI搭配Synapse REST API在流水线中全自动化完成,不需要手动操作界面,对应手动操作的三个环节,具体实现步骤如下:
前置准备
- 给流水线使用的服务账号/服务主体分配对应权限:目标Synapse工作区的贡献者权限、目标Spark池的写入权限,以及Azure DevOps制品源的读取权限
- 流水线运行环境预装Azure CLI,微软托管的
ubuntu-latest等代理镜像默认已经预装,不需要额外安装
步骤1:从Azure DevOps制品源拉取目标.whl包
直接使用Azure CLI制品命令拉取即可,流水线中可以直接绑定服务连接完成认证,无需硬编码凭据:
az artifacts universal download \ --organization <你的DevOps组织地址段> \ --project <项目名/项目ID> \ --scope project \ --feed <制品源名称> \ --name <Python包名称> \ --version <要部署的包版本号> \ --path $(Pipeline.Workspace)/whl-temp
如果你的制品源是PyPI类型而非通用包类型,也可以直接用pip download命令拉取对应版本的.whl文件,提前在流水线中配置好制品源的认证服务连接即可。
步骤2:上传.whl包到Synapse工作区
这一步有原生Azure CLI支持,直接调用synapse工作区包命令即可完成上传:
az synapse workspace-package create \ --workspace-name <Synapse工作区名称> \ --resource-group <工作区所在资源组名称> \ --package $(Pipeline.Workspace)/whl-temp/<你的完整包文件名>.whl
命令执行完成后,包就会出现在Synapse工作区的「工作区包」列表中,和手动上传的效果完全一致。
步骤3:将上传的包关联到目标Spark池
这部分目前没有独立的Azure CLI封装命令,直接调用Synapse管理面REST API即可完成关联,不需要手动进入界面操作,PowerShell示例如下,可以直接嵌到流水线的PowerShell任务里:
# 获取Synapse资源访问令牌 $token = (az account get-access-token --resource https://management.azure.com --query accessToken -o tsv) $requestHeader = @{ Authorization = "Bearer $token" } $apiVersion = "2021-06-01-preview" # 拼接Spark池资源地址 $sparkPoolUri = "https://management.azure.com/subscriptions/<你的订阅ID>/resourceGroups/<资源组名>/providers/Microsoft.Synapse/workspaces/<Synapse工作区名>/bigDataPools/<目标Spark池名>?api-version=$apiVersion" # 拉取Spark池当前配置 $sparkPoolConfig = Invoke-RestMethod -Method Get -Uri $sparkPoolUri -Headers $requestHeader # 构造新包的配置项,注意path固定为workspace/path/前缀加文件名 $newPackage = @{ name = "<你的完整包文件名>.whl" path = "workspace/path/<你的完整包文件名>.whl" type = "whl" } # 排除已存在的同版本包,避免重复添加 $sparkPoolConfig.properties.customLibraries = @($sparkPoolConfig.properties.customLibraries | Where-Object { $_.name -ne $newPackage.name }) + $newPackage # 提交更新请求 $updateResponse = Invoke-RestMethod -Method Put -Uri $sparkPoolUri -Headers $requestHeader -Body ($sparkPoolConfig | ConvertTo-Json -Depth 10) -ContentType "application/json"
注意:更新Spark池关联包列表会触发Spark池自动重启,整个过程通常需要3~10分钟,可以在流水线中增加轮询逻辑,定时查询Spark池状态,等状态回到
Idle后再结束任务,避免后续作业运行失败。
如果不想自行维护REST调用逻辑,也可以使用流水线扩展市场中的Synapse部署第三方任务直接完成包关联操作,原生CLI+REST的方案无第三方依赖,可控性更高。
内容的提问来源于stack exchange,提问作者Cribber
相关产品推荐
相关产品推荐

