多Jenkins Agent环境下Docker Pipeline的代码跨Agent问题解决尝试
Jenkins Pipeline 跨Agent代码复用问题
需求目标
在任意Jenkins Agent上完成AccuRev代码拉取,后续构建阶段复用同一Agent的本地工作空间,且构建阶段的Docker容器能直接访问已拉取的代码。
问题现象
当Jenkins配置多个Agent时,代码拉取阶段会在某一个Agent上执行,但构建阶段会在另一个Agent启动容器,导致构建无法访问已拉取的代码。
可行场景(单Agent环境)
仅配置单个Agent时,以下Pipeline脚本可正常运行:
pipeline { agent none stages { stage('Checkout') { agent any steps { checkout accurev(depot: 'MyDepot', serverName: 'AccuRev', stream: 'SomeStream', wspaceORreftree: 'none') } } stage('Compile') { agent { docker { image 'ubuntu' } } steps { sh '''#!/bin/bash make -j16 ''' } } } }
尝试过的不可行方案(多Agent环境)
1. 全局使用Docker Agent
该方案要求容器内安装AccuRev,扩展性差,在旧操作系统的容器中易出现兼容性问题,还存在容器权限管控问题,脚本如下:
pipeline { agent { docker { image 'ubuntu' } } stages { stage('Checkout') { steps { checkout accurev(depot: 'MyDepot', serverName: 'AccuRev', stream: 'SomeStream', wspaceORreftree: 'none') } } stage('Compile') { steps { sh '''#!/bin/bash make -j16 ''' } } } }
2. Docker Agent添加reuseNode true
pipeline { agent none stages { stage('Checkout') { agent any steps { checkout accurev(depot: 'MyDepot', serverName: 'AccuRev', stream: 'SomeStream', wspaceORreftree: 'none') } } stage('Compile') { agent { docker { image 'ubuntu' reuseNode true } } steps { sh '''#!/bin/bash make -j16 ''' } } } }
其他疑问
了解到Jenkins有“自动SCM拉取”功能,但无法指定拉取的目标流/分支,因此单独设置了拉取阶段。不确定该方式是否无需指定Agent即可完成拉取,也不清楚具体操作方法。
疑似可行方案(待测试)
以下脚本似乎能实现需求:在任意Agent完成代码拉取,复用同一Agent启动Docker容器执行构建:
pipeline { agent any stages { stage('Checkout') { steps { checkout accurev(depot: 'MyDepot', serverName: 'AccuRev', stream: 'SomeStream', wspaceORreftree: 'none') } } stage('Compile') { agent { docker { image 'ubuntu' reuseNode true } } steps { sh '''#!/bin/bash make -j16 ''' } } } }
内容的提问来源于stack exchange,提问作者Absent Link
相关产品推荐
相关产品推荐

