从 Azure 管道中的 az vm 运行-command 获取退出代码
Get exit code from `az vm run-command` in Azure pipeline
我正在 运行我的 Azure 管道中进行相当大的构建,这涉及处理大量数据,因此需要太多内存供我的构建代理处理。因此,我的方法是启动一个 linux 虚拟机,运行 在那里构建,然后将生成的 docker 镜像推送到我的容器注册表。
为此,我使用 Azure CLI task 向 VM 发出命令(例如 az vm start
、az 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 中设置的服务连接的名称。
我正在 运行我的 Azure 管道中进行相当大的构建,这涉及处理大量数据,因此需要太多内存供我的构建代理处理。因此,我的方法是启动一个 linux 虚拟机,运行 在那里构建,然后将生成的 docker 镜像推送到我的容器注册表。
为此,我使用 Azure CLI task 向 VM 发出命令(例如 az vm start
、az 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 中设置的服务连接的名称。