如何让Jenkins流水线单个阶段的部分代码在Docker容器外执行
问题原因
你当前在pipeline全局配置了docker类型的agent,所有步骤默认都会继承这个配置:哪怕手动切换到master节点,Jenkins仍然会尝试在master节点上启动你指定的Docker容器来运行代码,所以会出现两个问题:
- Windows master未安装Docker时,直接报找不到docker程序的错误
- 安装Docker后卡住,大概率是你指定的是Linux容器镜像,Windows Docker环境无法正常启动该容器,导致流程阻塞。
实现方案
方案1:全局不指定默认agent,按需给不同执行块指定运行环境(推荐)
这种方式优先级最高,不会出现配置继承的问题,示例配置如下:
pipeline { agent none // 全局不指定默认执行环境 stages { stage('Testing') { steps { script { // 先在指定Docker容器内执行代码 docker.image('<docker-image-path>').withRun('') { // 可按需补充容器启动参数 println "以下代码在容器内执行" sh '''pwd hostname -i ''' } // 再切换到Windows master节点原生执行 node('master') { println "以下代码在Windows master节点原生执行" bat 'dir' } } } } } }
方案2:保留全局Docker agent,切节点时明确指定不需要容器
如果你必须保留全局的Docker agent配置,可以在切换到master执行的块中,显式声明使用原生节点执行,不继承全局Docker配置:
pipeline { agent { docker { label "<node-name>" image "<docker-image-path>" } } stages { stage('Testing') { steps { script { // 容器内执行的代码保持不变 println "以下代码在容器内执行" sh '''pwd hostname -i ''' // 切换到master原生执行 node('master') { println "以下代码在Windows master节点原生执行" // 直接执行bat命令即可,无需额外启动容器 bat 'dir' } } } } } }
注意事项
- 如果你需要在不同节点/容器间共享文件,需要使用Jenkins的
stash/unstash命令传递文件,或者配置共享存储同步工作区 - Windows节点执行bat命令时,注意路径分隔符需要用反斜杠,特殊场景要做转义处理
内容的提问来源于stack exchange,提问作者Alpha
相关产品推荐
相关产品推荐

