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

Jenkins声明式流水线中如何实现手动构建步骤?

针对Jenkins Declarative Pipeline Input步骤的痛点解决方案

我完全理解你碰到的这些痛点——Declarative Pipeline的input步骤在处理人工确认环节时确实有不少棘手的问题,尤其是在资源占用、超时续跑和代理调度上。结合我做Jenkins流水线的实战经验,给你几个可行的解决方案:

方案1:优化多代理场景下的工作区复用与代理调度

既然你已经试过流水线级agent none+阶段单独指定代理的方案,核心痛点就是每次启动slave的耗时和工作区持久化问题,可以通过以下方式优化:

  • 用stash/unstash传递必要文件:在需要人工干预的阶段前,把构建依赖、中间产物等用stash暂存,确认后再unstash到新代理的工作区,避免重复拉取代码或构建依赖;
  • 指定固定工作区:在阶段的agent配置里通过customWorkspace指定固定路径,让同一项目的构建复用同一个工作区,减少环境初始化时间:
    pipeline {
      agent none
      stages {
        stage('Pre-approval Prep') {
          agent { label 'build-slave' }
          steps {
            sh 'git pull && mvn dependency:resolve'
            stash includes: '**/*', name: 'prep-files'
          }
        }
        stage('Wait for Manual Approval') {
          agent none
          steps {
            input message: '确认继续构建?', submitter: 'dev-team'
          }
        }
        stage('Build & Package') {
          agent {
            label 'build-slave'
            customWorkspace '/opt/jenkins/workspaces/my-project'
          }
          steps {
            unstash 'prep-files'
            sh 'mvn clean package'
          }
        }
      }
    }
    
  • 提前指定代理:借助Node and Label Parameter Plugin,让审批人在input步骤中选择后续要用的slave,提前完成代理调度,减少等待时间。

方案2:用脚本化Input实现超时后的灵活流程控制

原生Declarative的input超时后会直接终止构建,你可以嵌入script块用脚本化input逻辑,实现超时不终止、后续可手动续跑的效果:

pipeline {
  agent none
  stages {
    stage('Build Prep') {
      agent { label 'build-slave' }
      steps {
        sh 'echo "准备构建环境完成"'
        stash includes: '**/*', name: 'build-resources'
      }
    }
    stage('Manual Approval') {
      agent none
      steps {
        script {
          // 设置1小时超时,超时后默认返回"TIMEOUT"
          def approvalResult = input(
            message: '请审批本次构建',
            parameters: [string(name: 'Approval_Note', description: '审批备注(可选)')],
            submitter: 'admin,dev-lead',
            timeout: time(1, 'HOURS')
          ) ?: 'TIMEOUT'
          // 将审批结果存入环境变量,供后续阶段判断
          env.APPROVAL_STATUS = approvalResult
        }
      }
    }
    stage('Execute Build') {
      agent { label 'build-slave' }
      when {
        expression { env.APPROVAL_STATUS != 'TIMEOUT' && env.APPROVAL_STATUS != 'REJECTED' }
      }
      steps {
        unstash 'build-resources'
        sh 'mvn clean deploy'
      }
    }
    stage('Handle Timeout/Rejection') {
      agent none
      when {
        expression { env.APPROVAL_STATUS == 'TIMEOUT' || env.APPROVAL_STATUS == 'REJECTED' }
      }
      steps {
        echo "构建状态:${env.APPROVAL_STATUS},触发通知流程..."
        // 这里可以添加邮件、企业微信等通知逻辑
      }
    }
  }
}

如果超时后需要继续推进构建,只需通过「Build with Parameters」重新触发流水线,手动传入审批通过的参数即可跳过input步骤。

方案3:联动外部审批系统,彻底摆脱Jenkins资源阻塞

如果团队有现成的外部审批工具(如Jira、自定义审批平台),可以把审批环节移出Jenkins,彻底解决执行器占用和超时问题:

  • 在流水线中调用外部API发起审批请求,然后进入轮询状态(用sleep定期查询审批结果);
  • 轮询阶段用agent none,完全不占用Jenkins执行资源;
  • 示例代码片段:
    stage('External Approval') {
      agent none
      steps {
        script {
          // 发起外部审批请求
          def approvalId = sh(
            script: "curl -X POST https://your-approval-system/api/request -d 'project=my-proj&build=$BUILD_NUMBER'",
            returnStdout: true
          ).trim()
          env.APPROVAL_ID = approvalId
    
          // 每5分钟轮询一次审批状态
          def isApproved = false
          while (!isApproved) {
            sleep time: 5, unit: 'MINUTES'
            def status = sh(
              script: "curl https://your-approval-system/api/status/$APPROVAL_ID",
              returnStdout: true
            ).trim()
            if (status == 'APPROVED') {
              isApproved = true
            } else if (status == 'REJECTED') {
              error('构建已被外部系统驳回')
            }
          }
        }
      }
    }
    

额外小技巧

  • 确保input步骤所在阶段使用agent none,避免占用执行器;
  • 添加options { skipDefaultCheckout() }跳过默认代码拉取,减少不必要的资源消耗;
  • 若团队支持,优先使用Docker代理,容器启动速度远快于传统slave,且可复用镜像缓存加速构建。

内容的提问来源于stack exchange,提问作者Ridic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:46:55