Jenkins管道:等待其他作业暂停

问题描述 投票:0回答:1

我有几个测试项目(API测试,UI Selenium测试等),它们测试同一应用程序。现在,应用程序的步骤。部署在每个jenkins文件中重复。

目标是拥有一个常见的[[app-deployment作业,该作业将在服务器上准备应用程序:

    从特定版本或标签中获取;
  • 定义各种环境变量,例如许可证等;
  • 生成WAR文件;
  • 将它们复制到Tomcat构建目录;
  • 启动Tomcat并等待上下文准备就绪。
  • 我不能在此之后结束构建,因为Jenkins将杀死所有创建的进程,包括启动的Tomcat。我为Tomcat尝试了doNoKillMe cookie,但是这引起了其他一些与重新启动应用程序和数据库连接有关的问题。因此,在应用程序准备就绪时,我将input步骤与ID放在同一位置:

    node { properties([ parameters([ string(name: 'REVISION', defaultValue: '', ), string(name: 'TAG_NAME', defaultValue: ''), ]), ]) withEnv(buildEnvVariables()) { stage('Checkout') { } stage('Prepare file system') { } stage('Prepare database') { } stage('Builds WAR files') { } stage('Tomcat deploy') { // Delete previous WAR files from Tomcat // Copy generated files to tomcat sh "$TOMCAT_DIR/bin/startup.sh" waitForTokenFileOrFail() } input(id: 'IsBuilt', 'Application is ready... ') } }

    现在,我希望从其他几个

    testing-specific

  • jenkins文件中调用此作业:node { properties([ parameters([ string(name: 'TESTS_SUITE', defaultValue: '', ), string(name: 'OTHER_PARAM', defaultValue: ''), ]), ]) withEnv(buildEnvVariables()) { stage('Checkout') { } stage('Stop any running application builds') { def jenkinsQueue = Jenkins.instance.queue jenkinsQueue.items.findAll { it.task.name.startsWith(contextDeployBuildName) }.each { echo "Found pending $contextDeployBuildName job. Cancelling: ${it.getId()}" jenkinsQueue.doCancelItem(it.getId()) } Jenkins.instance.getItemByFullName(contextDeployBuildName) .getAllJobs().first().getBuilds() ?.each { build -> if (build.isBuilding()) { try { echo "Found running $contextDeployBuildName job. Stopping: ${build.number}" httpRequest( httpMode: 'POST', authentication: 'credentialsID', url: "${JENKINS_URL}job/$contextDeployBuildName/${build.number}/stop") } catch (any) { println any.message } } } } stage('Build the app') { build(wait: true, job: contextDeployBuildName, parameters: [ string(name: 'REVISION', value: env.BRANCH_NAME), string(name: 'TAG_NAME', value: env.TAG_NAME)]) // How to wait for a specific input/condition here??? } stage('Run tests') { } stage('Report, cleanup') { } } }
    我在jenkins build step条件下使用wait,但似乎只能等待作业完成。更改部署作业的状态将被忽略(我相信,因为不会触发构建侦听器):

    currentBuild.rawBuild.@result = hudson.model.Result.SUCCESS

    问题:

    如何正确地通知

    特定测试

    作业有关app-deployment作业中触发输入的信息?是否有解决这种“部署测试”问题的标准方法? 目前,除了管道工具外,我还有两种丑陋的方法来检查状态:

      等待Tomcat /应用程序文件夹中的某些特定文件
    1. 当触发具有指定ID的输入时,可以通过该ID访问它的页面,因此我可以ping输入的页面,直到它返回200状态而不是404。
    tomcat jenkins continuous-integration jenkins-pipeline cloudbees
    1个回答
    2
    投票
    一段历史:几年前,詹金斯(Jenkins)有固定的工作,人们过去常常将这些工作视为基石,并互相触发。这不是很方便,长话短说,一条管道诞生了。

    管道不应该互相触发,因为如果您在两个作业之间有如此大的依赖性,而其中一个作业必须等待并发信号通知另一个作业,那么将它们视为单个管道的一部分可能会更好。] >

    代码重复是一个问题,但是,如果您将所有步骤视为更大的管道的一部分,则可以解决。与此相关的一些事情(将代码从代码复制粘贴到声明性管道中):

    pipeline { agent any parameters { string(name: 'REVISION', defaultValue: '') string(name: 'TAG_NAME', defaultValue: '') choice(name: 'TEST_SUITE', choices: ['selenium', 'api', 'etc']) } stages { stage('Checkout') { } stage('Prepare file system') { } stage('Prepare database') { } stage('Builds WAR files') { } stage('Tomcat deploy') { agent { label "tomcat" } steps { script { sh "$TOMCAT_DIR/bin/startup.sh" }}} // start testing stage('Testing') { parallel { stage('Selenium') { when { equals expected: "selenium", actual: params.TEST_SUITE }} agent { label "selenium-slave" } steps { echo "Doing selenium tests" } } stage('API') { when { equals expected: "api", actual: params.TEST_SUITE }} agent { label "api-slave" } steps { echo "Doing api tests" } } } } stage('Cleanup') { agent { label "tomcat" } steps { script { sh "$TOMCAT_DIR/bin/shutdown.sh" }}} } }

    编辑:使您的“开始tomcat”和“停止tomcat”完全位于同一节点上可能是一个问题,但是一点并行化和post { }块也可以解决该问题。
    © www.soinside.com 2019 - 2024. All rights reserved.