在Jenkins管道中按顺序运行多个异步步骤的最佳方法
让我从我想要实现的用例的简要描述开始 上下文在Jenkins管道中按顺序运行多个异步步骤的最佳方法,jenkins,jenkins-workflow,jenkins-pipeline,Jenkins,Jenkins Workflow,Jenkins Pipeline,让我从我想要实现的用例的简要描述开始 上下文 我正在用SpringBoot开发一个服务器应用程序,并使用maven来构建它 该应用程序需要一个Redis数据库,因此我可以在构建应用程序并且Redis DB启动并运行后启动该应用程序 我正在用JavaScript编写RESTAPI测试,一旦我的应用程序启动,我就可以运行它们 实施 构建应用程序时,无需任何特殊要求。我只需执行mvn清洁安装。我还可以使用mvn包来创建一个可执行的jar,我可以在Docker映像中使用它 为了运行应用程序,我使用
- 我正在用SpringBoot开发一个服务器应用程序,并使用maven来构建它
- 该应用程序需要一个Redis数据库,因此我可以在构建应用程序并且Redis DB启动并运行后启动该应用程序
- 我正在用JavaScript编写RESTAPI测试,一旦我的应用程序启动,我就可以运行它们李>
- 构建应用程序时,无需任何特殊要求。我只需执行
。我还可以使用mvn清洁安装
来创建一个可执行的jar,我可以在Docker映像中使用它mvn包
- 为了运行应用程序,我使用Docker Compose来表示我的应用程序和Redis之间的依赖关系。我可以使用
启动我的环境这很好,但这是一个异步步骤:我不知道所有服务完全启动并接受请求需要多长时间docker compose up
- 当我知道应用程序准备就绪时,我就可以启动用JavaScript编写的API测试了
- 在这个过程的最后,我可以做一个
来分解测试环境docker-compose-down
- 我正在寻找有关处理异步步骤的建议。在这个简化的示例中,有一个步骤:我如何处理redis和应用程序完全启动需要一些时间(比如5-15秒)这一事实
- Jenkins管道插件是否有一个功能可以用于此场景?我在教程或文档中找不到很多信息。我已经看到了waitUntil的
步骤,但我正在寻找一些指导
- 我是否应该实现一个简单的shell脚本,在循环中向我的应用程序REST端点之一发出HTTP请求,并在应用程序发送响应后立即完成?我应该在
步骤中调用此脚本吗waitill
- 有更好的方法满足我的要求吗
waitill
步骤中调用此脚本吗
是的,这是一种合法的做法
您也可以简单地将其折叠到运行测试的脚本中。为了使管道脚本简短、切中要害,并使隔离测试逻辑片段更容易,请将该脚本存储在SCM中。假设它在Bash中(但Python或其他任何东西都可以正常工作):
然后您的管道脚本可以读取如下内容
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中可靠地进行清理很棘手(可以使用陷阱退出“…”
),在实际语言中更容易
我是否应该实现一个简单的shell脚本,在循环中向我的应用程序REST端点之一发出HTTP请求,并在应用程序发送响应后立即完成?我应该在waitill
步骤中调用此脚本吗
是的,这是一种合法的做法
您也可以简单地将其折叠到运行测试的脚本中。为了使管道脚本简短、切中要害,并使隔离测试逻辑片段更容易,请将该脚本存储在SCM中。假设它在Bash中(但Python或其他任何东西都可以正常工作):
然后您的管道脚本可以读取如下内容
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中可靠地进行清理很棘手(可以使用陷阱退出“…”
),用真实的语言更容易。我在Jenkins文件中完成了类似的操作:
stage 'Validation'
dir("microservice") {
sh "docker-compose down"
sh "docker-compose up &"
}
waitUntil {
def appIsReady = false
try {
echo "Checking Spring Boot status page via ${GAMEDOCK_URL}"
sh "set +e; curl -f -sL -w \"%{http_code}\\n\" ${GAMEDOCK_URL} -o /dev/null; echo \$? > springBootAppStatus; return 0"
def status = readFile('springBootAppStatus').trim()
echo 'status: ' + status
appIsReady = (status == '0')
} catch (e) {
echo 'exception: ' + e
appIsReady = false
}
echo 'return appIsReady'
return appIsReady == true
}
echo "application is ready"
我最终在我的Jenkins文件中做了类似的事情:
stage 'Validation'
dir("microservice") {
sh "docker-compose down"
sh "docker-compose up &"
}
waitUntil {
def appIsReady = false
try {
echo "Checking Spring Boot status page via ${GAMEDOCK_URL}"
sh "set +e; curl -f -sL -w \"%{http_code}\\n\" ${GAMEDOCK_URL} -o /dev/null; echo \$? > springBootAppStatus; return 0"
def status = readFile('springBootAppStatus').trim()
echo 'status: ' + status
appIsReady = (status == '0')
} catch (e) {
echo 'exception: ' + e
appIsReady = false
}
echo 'return appIsReady'
return appIsReady == true
}
echo "application is ready"
非常感谢你的回答!同时,我设法找到了一个解决方案(找到waitUntil步骤的信息不是那么容易),在这里我实现了Jenkins文件中的逻辑,该文件存储在我的git repo中。非常感谢您的回答!与此同时,我设法找到了一个解决方案(找到waitUntil步骤的相关信息并不是那么容易),在这个解决方案中,我实现了存储在git repo中的Jenkins文件中的逻辑。