Azure devops 如何在Azure Devops中的发布管道上触发STDERR

Azure devops 如何在Azure Devops中的发布管道上触发STDERR,azure-devops,azure-cli,azure-container-instances,Azure Devops,Azure Cli,Azure Container Instances,我们有一个angular应用程序,上面有一些e2e测试。我们使用e2e测试创建一个独立的docker映像,一个用于应用程序 当我们使用azure devops发布管道部署应用程序时,我们在部署后有一个应该运行e2e测试的后期步骤 我们运行以下命令: az container create --resource-group $(DEV_RG) --name $(E2E_IMAGE_NAME) --image $(E2E_IMAGE_REGISTRY) --registry-username $(R

我们有一个angular应用程序,上面有一些e2e测试。我们使用e2e测试创建一个独立的docker映像,一个用于应用程序

当我们使用azure devops发布管道部署应用程序时,我们在部署后有一个应该运行e2e测试的后期步骤

我们运行以下命令:

az container create --resource-group $(DEV_RG) --name $(E2E_IMAGE_NAME) --image $(E2E_IMAGE_REGISTRY) --registry-username $(REGISTRY_USERNAME) --registry-password $(REGISTRY_PASSWORD) --vnet $(VNET_LOCATION) --subnet $(E2E_SUBNET) --subnet-address-prefix $(E2E_IP_GROUP) --command-line ./rune2e.sh 
然后,我们希望看到输出:

az container logs --resource-group $(DEV_RG) --name $(E2E_IMAGE_NAME)
我也试过了

az container attach --resource-group $(DEV_RG) --name $(E2E_IMAGE_NAME)
无论这些日志中发生了什么,该步骤始终为绿色


如何捕获容器正在输出的
stderr
事件,并在Azure devops中将步骤标记为红色?

Docker容器日志都是同一个流上的stdout/stderr,因此在使用
az container logs
命令查看它们时无法进行区分

你可以采取两种方法

1) grep查找错误日志中的已知关键字(例如,[error]),如果您希望在某些STDERR或错误日志上失败

2) 更新docker容器(或容器入口点)内的进程,将其stderr流重定向到容器中的本地文件。(例如start.sh 2>stderr.log)管道运行E2E后,只需运行一个tasks来运行
az container exec
,并检查容器内是否有任何日志写入
stderr.log


在这两种情况下,您都应该返回非0退出代码以强制管道失败

Docker容器日志都是同一流上的stdout/stderr,因此使用
az container logs
命令查看它们时无法区分

你可以采取两种方法

1) grep查找错误日志中的已知关键字(例如,[error]),如果您希望在某些STDERR或错误日志上失败

2) 更新docker容器(或容器入口点)内的进程,将其stderr流重定向到容器中的本地文件。(例如start.sh 2>stderr.log)管道运行E2E后,只需运行一个tasks来运行
az container exec
,并检查容器内是否有任何日志写入
stderr.log


在这两种情况下,您都应该返回非0退出代码以强制管道失败

我最终将其添加到记录容器的Azure CLI任务中

#!/bin/bash

az container logs --resource-group $(DEV_RG) --name  $(E2E_IMAGE_NAME) --only-show-errors | grep Error\:

if [ $? -eq 0 ]
then
  echo "Failure: I found error in file. Test failed."
  exit 1
else
  echo "Success: I did not find error in file. Test passed." >&2
  exit 0
fi

最后,我将其添加到记录容器的Azure CLI任务中

#!/bin/bash

az container logs --resource-group $(DEV_RG) --name  $(E2E_IMAGE_NAME) --only-show-errors | grep Error\:

if [ $? -eq 0 ]
then
  echo "Failure: I found error in file. Test failed."
  exit 1
else
  echo "Success: I did not find error in file. Test passed." >&2
  exit 0
fi

我现在正在使用Azure CLI任务,它不支持grep和启动脚本吗?我必须在管道中使用Bash任务来实现这一点?正确,您需要使用Bash任务来更好地控制您需要执行的自定义脚本。无法使用Bash,不知何故,使我们能够部署到云的服务主体不支持它。我现在正在使用Azure CLI任务,它不支持grep和启动脚本吗?我必须使用管道中的Bash任务来实现这一点?正确,您将需要使用Bash任务来更好地控制您需要执行的自定义脚本。使用Bash是不可能的,不知何故,使我们能够部署到云中的服务主体不支持它。非常感谢您在这里分享的解决方案。如果你能接受这个答案,那么其他人就可以直接知道这个有效的方法了:-)非常感谢你在这里分享的解决方案。如果你能接受这个答案就太好了,那么其他人就可以直接知道这个有效的方法:-)