You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何自动将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 22:48:35