You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现Jenkins Pipeline阶段在requestState为PENDING时每2分钟重复执行?

Jenkins Pipeline 实现基于requestState的阶段重复执行

需求:当requestState处于PENDING状态时,每隔2分钟重复执行指定任务阶段;当状态非PENDING时,停止重复并执行清理操作。以下是修改后的完整Pipeline脚本:

pipeline {
    agent { label "$label" }

    environment {
        TEMPWORKSPACE = '/data/home/sbeops/tempstats/'
    }

    parameters {
        string(name: 'CORELATIONID', defaultValue: '', description: '关联ID')
        string(name: 'JARPATH', defaultValue: '', description: 'JAR文件路径')
        string(name: 'JAR_FILE_NAME', defaultValue: '', description: 'JAR文件名(*.jar)')
    }

    stages {
        stage('循环执行目标任务') {
            steps {
                script {
                    def requestState = ''
                    while (true) {
                        // 替换为真实的requestState获取逻辑,比如调用接口、查询数据库或执行特定命令
                        requestState = sh(
                            script: 'echo PENDING', // 示例模拟,实际替换为真实获取命令
                            returnStdout: true
                        ).trim()

                        if (requestState != 'PENDING') {
                            echo "当前requestState为${requestState},终止循环执行"
                            break
                        }

                        echo "当前requestState为PENDING,执行目标任务..."
                        // 执行原任务逻辑
                        sh '''
                            gcloud config set project ${PROJECT}

                            gcloud compute ssh comm-sbe-mds-1 --zone us-east1-b --internal-ip \\
                            --command="sudo su - sbeops bash -c '
                                mkdir -p ${TEMPWORKSPACE}
                                cd ${TEMPWORKSPACE}
                                wget ${JARPATH}
                                if [ $? -ne 0 ]; then exit 1; fi
                                gsutil cp gs://dprep-preppedzone-cat-int-ga/${CORELATIONID}/COMMERCIAL_MARKETING/stats/aggregated-stats.avro .
                                /usr/lib/jvm/jdk-17.0.2/jdk-17/bin/java -jar ${JAR_FILE_NAME} aggregated-stats.avro aggregated-stats.xlsx ${CORELATIONID}
                                if [ $? -ne 0 ]; then exit 1; fi
                                gsutil cp aggregated-stats.xlsx gs://usis-mds-dev-dataflow-npe/${SUPPLIER}/${CORELATIONID}/
                                mutt -s \\\"统计报告汇总 - ${SUPPLIER} - 关联ID - ${CORELATIONID}\\\" -a aggregated-stats.xlsx -- \\\"$EMAIL\\\" < /dev/null
                                if [ $? -ne 0 ]; then exit 1; fi
                            '
                        '''

                        echo "等待2分钟后再次检查状态..."
                        sleep 120 // 等待120秒(2分钟)
                    }
                }
            }
        }

        stage('清理VM工作目录') {
            steps {
                script {
                    sh """
                        gcloud config set project ${PROJECT}
                        gcloud compute ssh comm-sbe-mds-1 --zone us-east1-b --internal-ip \\
                        --command="sudo -u sbeops rm -rf ${TEMPWORKSPACE}"
                    """
                }
            }
        }
    }
}

关键修改说明

  • 状态获取逻辑:脚本中用echo PENDING模拟状态获取,需替换为真实的状态查询方式(如调用REST接口、查询数据库)。
  • 循环控制:通过while(true)构建循环,每次迭代先检查状态,非PENDING则直接跳出循环。
  • 间隔等待:任务执行完成后,用sleep 120实现2分钟的等待间隔,避免频繁执行。
  • 清理保障:无论循环因状态变更终止还是任务执行异常,后续的清理阶段都会执行,确保资源被回收。

内容的提问来源于stack exchange,提问作者Manohar.Robot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 15:00:06