Jenkins Pipeline容器内调用Build Job失效,任务跑在容器外求助
问题原因
build job步骤的作用是触发另一个独立的Jenkins任务,这个子任务的运行环境完全由它自身的代理配置决定,和当前Pipeline的容器代理没有关联。当前stage的容器仅用于执行当前Pipeline里的sh这类本地步骤,触发子job时会启动全新的执行流程,不会复用这个容器。
解决方案
方案1:把子Job逻辑整合到当前容器Stage
如果子Job的逻辑不复杂,直接将它的步骤移到当前使用容器代理的Stage中,所有操作就会在容器内执行:
pipeline { agent { label "master" } stages { stage('Test') { agent { docker { image 'node:16.13.1-alpine' } } steps { // 原jobTest里的步骤直接放在这里 sh 'node --version' sh 'npm install' // 其他子Job的命令 } } } }
方案2:让子Job自己配置容器代理
如果必须保留子Job的独立性,修改子Jobbuilds/jobTest的Pipeline,让它自身配置容器代理,触发后它会在自己的容器里运行:
// 子jobTest的Pipeline代码 pipeline { agent { docker { image 'node:16.13.1-alpine' } } stages { stage('Build') { steps { sh 'node --version' // 子Job的原有步骤 } } } }
方案3:通过docker exec在当前容器执行子Job命令(不推荐)
如果一定要在当前Pipeline的容器里执行子Job逻辑,且无法修改子Job,可以先获取当前容器ID,再用docker exec执行命令,但这种方式需要额外处理容器生命周期,维护成本较高:
pipeline { agent { label "master" } stages { stage('Test') { agent { docker { image 'node:16.13.1-alpine' } } steps { script { // 获取当前容器ID def containerId = sh(script: 'cat /proc/self/cgroup | grep docker | tail -1 | awk -F/ \'{print $NF}\'', returnStdout: true).trim() // 用docker exec执行子Job的命令 sh "docker exec ${containerId} node --version" // 其他子Job的命令 } } } } }
内容的提问来源于stack exchange,提问作者Lucas Araujo
相关产品推荐
相关产品推荐

