jenkins - 在 Jenkins 管道中按顺序运行多个异步步骤的最佳方法

标签 jenkins jenkins-workflow jenkins-pipeline

让我首先简要描述一下我想要实现的用例。

上下文

  • 我正在使用 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/

相关文章:

Jenkins管道插件: set the build description

shell - 当搜索到的字符串不存在时,Jenkins shell 脚本返回退出代码 1

Jenkins 通过 ssh 发布显示错误 "jenkins.plugins.publish_over.BapPublisherException: Failed to add SSH key."

Jenkins - 将脚本化管道导出到共享库中

git - 如何在 Jenkins 作业中克隆 github 组织的私有(private)存储库

Maven 和 Jenkinsfile - 跳过之前的阶段

git - 配置 Jenkins 以使用 Git Bitbucket 存储库的身份验证错误

控制台日志中的Jenkins声明性管道掩码参数密码

groovy - 使用工作流插件同时启 Action 业多次

git - 如何在 Jenkins Workflow 插件中使用 SSH key