让我首先简要描述一下我想要实现的用例。
上下文
- 我正在使用 Spring Boot 开发一个服务器应用程序,并使用 Maven 来构建它。
- 应用程序需要 Redis 数据库,因此我可以在构建应用程序并且 Redis 数据库启动并运行后启动应用程序。
- 我正在用 JavaScript 编写 REST API 测试,一旦我的应用程序启动,我就可以运行它们。
实现
- 构建应用程序不需要任何特殊操作。我可以简单地执行
mvn clean install
。我还可以执行mvn package
来创建可执行 jar,我可以在 Docker 镜像中使用它。 - 为了运行应用程序,我使用 Docker Compose 来表达应用程序和 Redis 之间的依赖关系。我可以使用 docker-compose up 来启动我的环境。 这很好,但这是一个异步步骤:我不知道需要多少时间才能让所有服务完全启动并接受请求。
- 当我知道应用程序已准备就绪时,我就可以启动用 JavaScript 编写的 API 测试。
- 在此过程结束时,我可以执行
docker-compose down
来拆除测试环境。
问题
- 我正在寻找有关处理异步步骤的建议。在这个简化的示例中,有一个步骤:如何处理 Redis 和应用程序完全启动需要一些时间(例如 5-15 秒)这一事实?
- Jenkins Pipeline 插件是否有可用于此场景的功能?我在教程或文档中找不到很多信息。我已经看到了
waitUntil
步骤,但我正在寻找一些指导...... - 我是否应该实现一个简单的 shell 脚本,在循环中向我的应用程序 REST 端点之一发出 HTTP 请求,并在应用程序发送响应后立即完成?我应该在
waitUntil
步骤中调用此脚本吗? - 有更好的方法来满足我的要求吗?
最佳答案
Should I implement a simple shell script that issues an HTTP request to one of my app REST endpoints in a loop and that completes as soon as the app sends a response? Should I invoke this script in the
waitUntil
step?
是的,这是一种合法的方法。
您也可以简单地将其折叠到运行测试的脚本中。为了使管道脚本简短明了,并更容易地单独测试逻辑片段,请将该脚本存储在 SCM 中。假设它是在 Bash 中(但 Python 或其他任何语言都可以正常工作):
while :
do
if curl http://endpoint/
then
echo Up and running
break
else
echo Still waiting
fi
done
make test
然后你的管道脚本可以读取类似的内容
node {
stage 'build'
checkout scm
sh 'mvn clean install'
stage 'test'
sh 'docker-compose up'
try {
sh './run-tests-when-ready'
finally {
sh 'docker-compose down'
}
}
当然,如果您愿意,甚至可以将对 docker-compose 的调用放入这样的外部脚本中。在 Bash 中可靠地进行清理很棘手(可以使用trap EXIT '...'
),在真正的语言中更容易。
关于jenkins - 在 Jenkins 管道中按顺序运行多个异步步骤的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35966711/