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

如何在Jenkinsfile中暂停阶段且不占用Agent?实现同Agent续存

问题

我正在尝试创建包含人工输入阶段的Jenkins流水线,但目前的问题是:等待用户点击“继续”或“终止”期间,Agent会一直保持在线,造成资源浪费。

我已经知道一种无需占用Agent即可暂停阶段的方法:

  • 在Jenkinsfile顶层设置agent none,默认所有阶段不分配Agent;
  • 为每个阶段单独指定Agent;
  • 在需暂停的阶段添加包含expression块(询问用户是否继续)的when子句,并添加beforeAgent确保该表达式在Agent启动前执行。

示例代码如下:

pipeline {
    agent none
    stages {
        stage ('Stage I want to Pause') {
            when {
                beforeAgent true
                expression {
                    input message: 'Do you want to continue?'
                    return true
                }
            }
            agent { label 'MyAgent' }
            steps {
                echo "Performing task..."
            }
        }
    }
}

但这种方法有明显弊端:每个阶段结束后Agent会被销毁,下一阶段需要重新启动新的Agent。如果某阶段安装了软件包,后续同标签阶段的新Agent不会包含这些包,导致环境无法复用。

想咨询是否有其他实现方式,或者如何让连续使用同一Agent标签的阶段保持Agent不重启?

解决方案

可以通过以下两种思路解决这个问题,兼顾「暂停时不占用Agent」和「复用Agent环境」的需求:

方法一:全局指定Agent,配合节点切换实现无占用暂停

这种方法让所有需要复用环境的阶段共享同一个Agent,在暂停前主动切换到无节点状态,避免占用Agent资源,等待用户输入后再回到原Agent继续执行(需确保Agent支持持久化工作空间):

pipeline {
    agent { label 'MyAgent' }
    stages {
        stage('Prepare Environment') {
            steps {
                echo "Installing dependencies..."
                // 执行依赖安装操作,如 apt install、npm install 等
            }
        }
        stage('Pause for Approval') {
            steps {
                script {
                    // 切换到无节点状态,释放当前Agent的占用
                    node(null) {
                        input message: 'Do you want to continue with the deployment?', submitter: 'admin'
                    }
                }
            }
        }
        stage('Continue Task') {
            steps {
                echo "Continuing task with existing environment..."
                // 可直接使用之前安装的依赖,工作空间未被销毁
            }
        }
    }
}

注意:该方法仅适用于持久化Agent(如固定虚拟机),云原生临时Agent(如Kubernetes Pod)会在空闲后自动回收,无法复用环境。

方法二:嵌套阶段划分,集中复用Agent的任务块

把需要共享环境的阶段放在同一个父阶段内并指定Agent,暂停阶段单独设置agent none,既保证暂停时不占用资源,又让同类任务复用同一个Agent环境:

pipeline {
    agent none
    stages {
        stage('Reusable Agent Workflow') {
            agent { label 'MyAgent' }
            stages {
                stage('Setup Environment') {
                    steps {
                        echo "Setting up dependencies..."
                        // 安装所需软件包
                    }
                }
                stage('Pre-Approval Task') {
                    steps {
                        echo "Performing pre-approval checks..."
                    }
                }
            }
        }
        // 完全不占用Agent的暂停阶段
        stage('Wait for Approval') {
            agent none
            steps {
                input message: 'Do you want to proceed to the final stage?', submitter: 'dev-team'
            }
        }
        // 复用同标签Agent,若Agent未被回收则直接使用原有工作空间
        stage('Final Deployment') {
            agent { label 'MyAgent' }
            steps {
                echo "Deploying with existing environment..."
                // 可直接使用之前安装的依赖
            }
        }
    }
}

这种方法的优势是灵活划分任务块,既避免了暂停时的资源浪费,又能让需要共享环境的任务集中复用Agent,减少重复安装操作。

额外提示:工作空间状态控制

如果需要精准控制工作空间的保留或清理,可以搭配Workspace Cleanup插件,在阶段开始时按需执行:

cleanWs() // 清理工作空间,根据业务需求选择是否启用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 06:21:01