如何在Gitlab CI Runner中通过az cli登录Azure部署Web应用?
GitLab CI 环境部署Azure Web App的无高权限登录方案
问题核心
你已在GitLab CI流程中生成可直接运行的Node.js Web应用ZIP包,本地使用az webapp deploy可正常完成部署,但GitLab Runner无Azure登录态,且账号存在权限限制(无AD访问权限、无应用注册权限),无法使用常规的托管标识、服务主体自动创建方案。
已排除的无效方案
- Publish Profile在线获取:需要Azure登录态,无法在CI环境独立完成
- 自定义角色绑定托管标识:需要AD操作权限
- 系统分配托管标识直接认证:无对应访问密钥,无法直接用于CLI登录
- 手动生成JWT令牌认证:需要应用注册功能权限
可行落地方案
方案一:预存发布凭据直接部署(最适配你的权限场景,无需执行az login)
该方案不需要在CI流程中完成Azure账号登录,仅需一次本地操作即可永久使用,完全适配你现有ZIP包直接部署的需求:
- 本地登录Azure门户,进入目标App Service的管理页面
- 点击顶部菜单栏的「获取发布配置文件」按钮,下载后缀为
.PublishSettings的XML配置文件到本地 - 打开GitLab对应项目的设置页面,进入「CI/CD」-「变量」板块,新增一个私密变量:
- 变量键:
AZURE_PUBLISH_PROFILE - 变量值:打开本地下载的
.PublishSettings文件,复制全部文本内容粘贴为变量值 - 勾选「Protected」「Masked」选项,防止凭据在日志中泄露
- 变量键:
- 在CI部署脚本中直接调用部署命令,传入预存的发布凭据即可,不需要提前执行
az login:
deploy_to_azure: stage: deploy dependencies: - build # 替换为你生成ZIP包的上游任务名 script: - az webapp deploy --name 你的Web应用名称 --resource-group 你的资源组名称 --src-path 编译生成的zip包路径 --publish-profile $AZURE_PUBLISH_PROFILE
方案二:服务主体登录(需要本地账号有资源级服务主体创建权限)
如果你必须在CI流程中显式执行az login,且本地账号有权限为目标Web App创建资源级服务主体,可以按以下步骤配置:
- 本地已登录Azure CLI的环境下,执行以下命令创建仅拥有目标Web App部署权限的服务主体:
az ad sp create-for-rbac --name "gitlab-ci-deploy-demo" --role contributor --scopes /subscriptions/你的订阅ID/resourceGroups/你的资源组名称/providers/Microsoft.Web/sites/你的Web应用名称 --sdk-auth
- 命令执行完成后会输出一段JSON格式的认证凭据,复制整段JSON内容
- 进入GitLab项目CI/CD变量配置页,新增私密变量
AZURE_CREDENTIALS,值为刚才复制的整段JSON内容,同样勾选保护、掩码选项 - 在CI脚本中先执行登录,再运行部署命令:
deploy_to_azure: stage: deploy dependencies: - build script: # 解析变量完成az登录 - az login --service-principal -u $(echo $AZURE_CREDENTIALS | jq -r .clientId) -p $(echo $AZURE_CREDENTIALS | jq -r .clientSecret) --tenant $(echo $AZURE_CREDENTIALS | jq -r .tenantId) # 执行部署 - az webapp deploy --name 你的Web应用名称 --resource-group 你的资源组名称 --src-path 编译生成的zip包路径
注意:该方案创建的服务主体仅对单个目标Web App有部署权限,不会产生越权风险;如果执行创建服务主体的命令时提示权限不足,直接使用方案一即可。
内容的提问来源于stack exchange,提问作者Sam Imberman
相关产品推荐
相关产品推荐

