对于我的应用程序,我使用的是Kafka,我希望有一种方法可以确保在尝试在CI测试套件中运行应用程序e2e测试之前,正确地等待它准备就绪。为此,我使用了until
bash关键字,并在日志中查找一行代码来表明它已经就绪,started (kafka.server.KafkaServer)
。完整的设置是:
until docker compose logs kafka 2>/dev/null | grep -q "started (kafka.server.KafkaServer)"; do
sleep 1
done
我发现,如果这个循环在Kafka完全启动并准备好之前运行,那么until会像预期的那样循环,直到Kafka完全准备好。然而,如果这个循环在Docker容器启动后运行,那么这个循环永远不会结束,从我的测试中,我得到了一个一致的255错误代码。然而,如果我在循环中添加相同的grep行,我确实看到这行始终被找到,我得到$? = 0
,所以我不确定问题出在哪里。
作为参考,下面是我运行的解决问题的完整CircleCI命令:
- run:
name: 'Start background services'
working_directory: services
background: true
command: docker-compose up
- run:
name: 'Build images for app'
working_directory: app
command: docker-compose build
- run:
name: 'Wait for services'
working_directory: services
command: |
until docker compose logs kafka | grep -q "started (kafka.server.KafkaServer)"; do
sleep 1
done
echo "Kafka is ready"
如果构建图像的步骤花费>= 1分钟,我在until
循环中得到一个错误,而如果图像被完全缓存,则循环工作正常。
2条答案
按热度按时间llycmphe1#
-q告诉grep一旦找到匹配模式的行就以success退出,如果在任何输入中都没有找到匹配的行则以失败退出,否则不会在标准输出上打印任何内容。
gojuced72#
您可以在撰写中添加健康检查。你不需要grep日志。
当代理运行正常时创建主题的示例
可以随意将init服务更改为您的测试容器