1

让我从我想要实现的用例的简要描述开始。

语境

  • 我正在使用 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步骤中调用此脚本吗?
  • 有没有更好的方法来满足我的要求?
4

2 回答 2

0

我是否应该实现一个简单的 shell 脚本,在循环中向我的应用程序 REST 端点之一发出 HTTP 请求,并在应用程序发送响应后立即完成?我应该在waitUntil步骤中调用此脚本吗?

是的,这是一种合法的方法。

您也可以简单地将其折叠到运行测试的脚本中。为了使 Pipeline 脚本简短明了,并使单独测试逻辑片段变得更容易,将该脚本存储在 SCM 中。假设它在 Bash 中(但 Python 或任何可以正常工作的东西):

while :
do
  if curl http://endpoint/
  then
    echo Up and running
    break
  else
    echo Still waiting
  fi
done
make test

然后你的 Pipeline 脚本可以读到类似

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 '…'),在真实语言中更容易。

于 2016-03-14T16:45:16.430 回答
0

我最终在我的 Jenkinsfile 中做了这样的事情:

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"
于 2016-03-14T18:13:17.703 回答