使用Azure默认DevOps agent连接Windows Azure VM上传exe并启停服务咨询
解决方案
核心实现思路
直接使用Azure平台原生的虚拟机运行命令(Run Command) 功能实现操作,该功能通过Azure管控平面下发指令,完全不需要VM开放RDP/SSH端口,也不需要部署自定义DevOps代理,仅用默认微软托管代理即可完成所有操作。
前置配置要求
- DevOps中配置的Azure服务连接,需要具备目标VM所属资源组的虚拟机参与者权限
- 提前将构建生成的exe产物上传到Azure存储账户的Blob容器,生成带SAS令牌的临时下载链接(建议设置10分钟内有效期即可,满足VM临时下载需求)
Pipeline具体执行步骤
1. 执行Azure CLI登录
直接使用DevOps内置的Azure CLI任务,关联你提前配置好的Azure服务连接即可,默认托管代理已预装Azure CLI,无需额外安装。
2. 停止VM上的目标服务
执行以下Azure CLI命令调用Run Command下发停止服务指令:
az vm run-command invoke ` --resource-group <替换为你的VM资源组名称> ` --name <替换为你的VM名称> ` --command-id RunPowerShellScript ` --scripts "Stop-Service -Name <替换为目标服务名称> -Force"
3. 上传新的服务文件到VM
调用Run Command让VM直接从存储Blob下载新的exe文件到服务部署目录:
az vm run-command invoke ` --resource-group <替换为你的VM资源组名称> ` --name <替换为你的VM名称> ` --command-id RunPowerShellScript ` --scripts "Invoke-WebRequest -Uri '<替换为你的exe文件SAS下载链接>' -OutFile '<替换为VM上服务部署目录路径\服务名.exe>' -UseBasicParsing"
4. 启动更新后的服务
再次调用Run Command下发启动服务指令:
az vm run-command invoke ` --resource-group <替换为你的VM资源组名称> ` --name <替换为你的VM名称> ` --command-id RunPowerShellScript ` --scripts "Start-Service -Name <替换为目标服务名称>"
多文件更新适配
如果需要更新多个服务文件,可先在管道中用az storage blob upload-batch命令把所有构建产物批量上传到存储Blob容器,再在Run Command的PowerShell脚本中批量下载所有文件到VM指定目录即可。
内容的提问来源于stack exchange,提问作者M. Carlo Bramini
相关产品推荐
相关产品推荐

