我有一个使用docker-compose和maven运行集成测试的应用程序。当我可以控制何时执行命令时,此应用程序可在本地工作。我首先运行docker-compose up
,然后等待一切完成。然后打开另一个窗口,然后对刚刚启动的docker-compose容器运行集成测试:mvn verify -P integration-test -DBASE_URL=http://localhost:8080
但是,当我在gitlab中运行时,我不知道如何等待运行mvn命令,直到容器旋转起来。有谁对我该怎么做有一个想法(请记住,我认为我必须在gitlab中运行docker-compose up -d,否则会阻止运行器)。我看到的错误日志是:org.springframework.web.client.ResourceAccessException: I/O error on GET request for "http://localhost:8080/health": Connection refused (Connection refused); nested exception is java.net.ConnectException: Connection refused (Connection refused)
完整的gitlab输出可以在这里找到:https://gitlab.com/connorbutch/trading-app/-/jobs/524923294
谢谢, 康纳
答案 0 :(得分:0)
如果http://localhost:8080/health
指示测试已准备就绪,可以运行,则可以考虑等待测试成功。从外壳执行docker-compose和mvn很自然,因此我将在此处提供bash。
wait_for_health() {
for i in $(seq 1 5); do
if curl -s 'http://localhost:8080/health'; then return 0; fi
sleep 2
done
echo "localhost was never ready"
exit 1
}
wait_for_health
如果您正在考虑清理,bash可以在退出时运行命令,也许像这样:
trap "docker-compose down" EXIT
最后,请记住在设置-e
的情况下运行脚本。您可以将其放在shebang #!/bin/bash -e
或set -e
上,但是如果您未设置-e
,则失败的命令会违反直觉,不会导致脚本失败。这通常不是您想要的。
或者,您可以从docker-compose内部运行mvn
。您必须在docker中描述您的Maven环境和辅助设备,但是您可以添加一个依赖于Web容器的容器。据我所知,这取决于您自己在这种情况下如何不在本地执行mvn
(Can you define optional docker-compose services?似乎是一个好的开始),但这可能会有所帮助为您处理容器依赖项。