Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Jenkins管道中按顺序运行多个异步步骤的最佳方法_Jenkins_Jenkins Workflow_Jenkins Pipeline - Fatal编程技术网

在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清洁安装
    。我还可以使用
    mvn包
    来创建一个可执行的jar,我可以在Docker映像中使用它
  • 为了运行应用程序,我使用Docker Compose来表示我的应用程序和Redis之间的依赖关系。我可以使用
    docker compose up
    启动我的环境这很好,但这是一个异步步骤:我不知道所有服务完全启动并接受请求需要多长时间
  • 当我知道应用程序准备就绪时,我就可以启动用JavaScript编写的API测试了
  • 在这个过程的最后,我可以做一个
    docker-compose-down
    来分解测试环境
问题:
  • 我正在寻找有关处理异步步骤的建议。在这个简化的示例中,有一个步骤:我如何处理redis和应用程序完全启动需要一些时间(比如5-15秒)这一事实
  • Jenkins管道插件是否有一个功能可以用于此场景?我在教程或文档中找不到很多信息。我已经看到了waitUntil的
    步骤,但我正在寻找一些指导
  • 我是否应该实现一个简单的shell脚本,在循环中向我的应用程序REST端点之一发出HTTP请求,并在应用程序发送响应后立即完成?我应该在
    waitill
    步骤中调用此脚本吗
  • 有更好的方法满足我的要求吗
我是否应该实现一个简单的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中可靠地进行清理很棘手(可以使用
陷阱退出“…”
),在实际语言中更容易

我是否应该实现一个简单的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文件中的逻辑。