如何在Azure DevOps中通过工作负载身份联合发布EF Core迁移包并执行efbundle.exe
在Azure DevOps中通过工作负载身份联合发布EF Core迁移包并执行efbundle.exe
一、Azure DevOps中配置工作负载身份联合完成数据库认证
1. 配置工作负载身份服务连接
在Azure DevOps项目的项目设置 > 服务连接中,创建Azure资源管理器类型的服务连接:
- 选择工作负载身份联合作为认证方式
- 关联你已配置数据库权限的服务主体(SP)
- 确保该服务主体拥有目标SQL Server/数据库所在资源组的必要权限(如
SQL DB Contributor,配合已执行的数据库用户创建语句)
2. 生成EF Core迁移包(efbundle.exe)
在本地或CI管道中,执行以下命令生成包含迁移的独立可执行文件:
dotnet ef migrations bundle --output efbundle.exe
这个bundle包含所有迁移依赖,无需额外安装.NET环境即可运行。
3. 创建发布管道执行迁移
添加PowerShell或Azure CLI任务到发布管道:
- 选择之前配置的工作负载身份服务连接作为Azure订阅
- 在任务脚本中获取Azure AD访问令牌并执行efbundle:
# 获取数据库访问令牌 $token = az account get-access-token --resource https://database.windows.net/ --query accessToken -o tsv # 执行迁移 .\efbundle.exe --connection "Server=tcp:<你的SQL服务器名>.database.windows.net,1433;Database=<目标数据库名>;AccessToken=$token;"
二、在Azure环境中直接执行efbundle.exe
1. 基于工作负载身份认证
如果目标Azure资源(VM、ACI、容器应用等)已启用工作负载身份并关联授权的服务主体:
- 通过托管身份完成Azure认证:
az login --identity
- 获取数据库访问令牌:
token=$(az account get-access-token --resource https://database.windows.net/ --query accessToken -o tsv)
- 执行efbundle(Linux环境需先添加执行权限):
# Linux环境 chmod +x efbundle ./efbundle --connection "Server=tcp:<你的SQL服务器名>.database.windows.net,1433;Database=<目标数据库名>;AccessToken=$token;" # Windows环境 .\efbundle.exe --connection "Server=tcp:<你的SQL服务器名>.database.windows.net,1433;Database=<目标数据库名>;AccessToken=$token;"
2. 关键注意事项
- 确保服务主体已通过
CREATE USER <service principal name> FROM EXTERNAL PROVIDER...语句添加到数据库,并授予足够权限(如db_ddladmin或db_owner) - efbundle需匹配目标环境的操作系统,编译时可通过
--runtime参数指定,例如:
dotnet ef migrations bundle --output efbundle --runtime linux-x64
- 连接字符串无需包含用户名/密码,通过Azure AD令牌完成认证即可
内容的提问来源于stack exchange,提问作者Matthew Holmes
相关产品推荐
相关产品推荐

