从 Azure 管道中的 az vm 运行-command 获取退出代码

Get exit code from `az vm run-command` in Azure pipeline

我正在 运行我的 Azure 管道中进行相当大的构建,这涉及处理大量数据,因此需要太多内存供我的构建代理处理。因此,我的方法是启动一个 linux 虚拟机,运行 在那里构建,然后将生成的 docker 镜像推送到我的容器注册表。

为此,我使用 Azure CLI task 向 VM 发出命令(例如 az vm startaz vm run-command ... 等)。

我面临的问题是 az vm run-command“成功”,即使您 运行 在 VM returns 上的脚本是一个非零状态代码。例如,这个“坏”虚拟机脚本:

az vm run-command invoke -g <group> -n <vmName> --command-id RunShellScript --scripts "cd /nonexistent/path"

returns 以下回复:

{
  "value": [
    {
      "code": "ProvisioningState/succeeded",
      "displayStatus": "Provisioning succeeded",
      "level": "Info",
      "message": "Enable succeeded: \n[stdout]\n\n[stderr]\n/var/lib/waagent/run-command/download/87/script.sh: 1: cd: can't cd to /nonexistent/path\n",
      "time": null
    }
  ]
}

所以,命令成功了,大概是因为在虚拟机上成功执行了脚本。脚本在 VM 上实际失败的事实隐藏在响应“消息”

如果 VM 上的脚本 returns 状态代码非零,我希望我的 Azure 管道任务失败。我将如何实现?

一个想法是(以某种方式)解析响应并搜索 stderr 下的文本 - 但这听起来很麻烦,我什至不确定如何“访问”其中的响应任务。

您是否在 Azure CLI 任务中启用了“标准错误失败”选项?如果不行,你可以尝试启用它并再次运行管道,看看错误“cd: can't cd to /nonexistent/path”是否可以使任务运行失败.

如果任务仍然通过,错误“cd: can't cd to /nonexistent/path”不应该是标准错误。在这种情况下,您可能需要在脚本中添加更多命令行来监控 az 命令的输出日志。一旦有任何输出消息显示错误,执行“exit 1”退出脚本并return一个标准错误使任务失败。

我通过使用 the SSH pipeline task 解决了这个问题 - 这允许我通过 SSH 连接到虚拟机,并且 运行 机器上的给定脚本通过 SSH“直接”。

这意味着从任务的上下文中,您可以从虚拟机上的脚本本身 运行ning 中获取状态代码。您还会在任务日志中看到任何控制台输出,这些输出在使用 az vm run-command.

时被遮盖了

这是一个例子:

  - task: SSH@0
    displayName: My VM script
    timeoutInMinutes: 10
    inputs:
      sshEndpoint: <sshConnectionName> 
      runOptions: inline
      inline: |
        echo "Write your script here" 

并不是说 SSH 连接需要 set up as a service connection 使用 Azure 管道 UI。您引用您在 yaml 中设置的服务连接的名称。