本地无SCM部署Jenkins加载本地JenkinsFile如何在同一Agent运行流水线
方案1:复用加载JenkinsFile的Agent(最优解)
你当前出现双Agent占用的核心原因是你托管的jenkinsFile.groovy内部额外声明了node{}块,外层调用逻辑的node{}占了一个Agent,内层文件里的node{}又申请了第二个,两个锁到流水线结束才释放。
改造方式非常简单:把托管的jenkinsFile.groovy顶层的node{}包裹层删掉,只保留内部的流水线逻辑即可。
示例:
// 改造前的jenkinsFile.groovy(会触发双Agent占用) node { stage('代码拉取') { // 原有业务逻辑 } stage('构建') { // 原有业务逻辑 } } // 改造后的jenkinsFile.groovy stage('代码拉取') { // 原有业务逻辑完全不变 } stage('构建') { // 原有业务逻辑完全不变 }
改造后你原来的调用代码node { load "/path/to/local/jenkinsFile.groovy" }全程只会占用一个Agent,加载和运行逻辑都复用同一个Agent,完全解决资源浪费问题。
方案2:加载完成后立即释放Agent
如果你不方便修改托管的jenkinsFile.groovy内部的node{}声明,可以把加载逻辑放到Jenkins master的轻量级执行上下文运行,全程不占用业务Agent:
// 加载阶段不套node块,直接在master的轻量级执行器上运行,不占用业务Agent资源 def publicPipeline = load "/path/to/local/jenkinsFile.groovy" // 此时JenkinsFile已经加载完成,没有持有任何业务Agent,再分配Agent运行实际逻辑 node { publicPipeline() }
注意:该写法下load读取的是Jenkins master节点的本地文件路径,需要你把公共的jenkinsFile.groovy放到master节点对应路径下,保证master可读即可。load本身是非常轻量的文件解析操作,不会对master造成性能压力。
内容的提问来源于stack exchange,提问作者Aplantie
相关产品推荐
相关产品推荐

