Jenkins流水线失败时如何保留Slave Pod?
在Jenkins流水线失败时保留Slave Pod的解决方案
针对你遇到的podRetention: onFailure()仅识别Pod自身状态而非流水线任务状态的问题,以下是几种可行的解决方法:
方法一:在流水线失败阶段手动标记Pod保留
在流水线的post失败块中,通过kubectl命令给当前Slave Pod添加自定义注解,阻止Jenkins的清理逻辑删除它。
示例代码:
pipeline { agent { kubernetes { yaml ''' apiVersion: v1 kind: Pod metadata: labels: jenkins-slave: pipeline-slave spec: containers: - name: jnlp image: jenkins/inbound-agent:latest - name: docker image: docker:latest command: ["sleep", "infinity"] ''' podRetention never() // 默认不保留,避免资源浪费 } } stages { stage('Build') { steps { // 替换为你的实际流水线步骤,这里用exit 1模拟失败 sh 'exit 1' } } } post { failure { script { // 从节点名称提取Pod名称(Jenkins节点名格式通常为pod-name-随机后缀) def podName = env.NODE_NAME.split('-')[0..-2].join('-') // 添加注解标记Pod需保留 sh "kubectl patch pod ${podName} -p '{\"metadata\":{\"annotations\":{\"jenkins.io/retention\":\"keep\"}}}' -n ${env.JENKINS_NAMESPACE}" } } } }
注意:需确保Jenkins代理的ServiceAccount拥有操作Pod的权限,后续需手动清理这些保留的Pod。
方法二:动态切换PodRetention策略
通过try-catch捕获流水线失败状态,动态调整PodRetention策略,确保流水线失败时保留Pod。
示例脚本化流水线:
def podRetention = 'never' try { podTemplate( yaml: ''' apiVersion: v1 kind: Pod spec: containers: - name: jnlp image: jenkins/inbound-agent:latest ''', podRetention: podRetention ) { node { stage('Build') { sh 'exit 1' // 模拟流水线失败 } } } } catch (Exception e) { podRetention = 'onFailure' throw e // 重新抛出异常,维持流水线失败状态 }
方法三:自定义插件扩展(进阶)
如果上述方法无法满足需求,可基于Jenkins Kubernetes插件进行二次开发,扩展PodRetention的判断逻辑,让其识别流水线任务的失败状态。这种方式需要具备Jenkins插件开发能力。
内容的提问来源于stack exchange,提问作者Bryan Chen
相关产品推荐
相关产品推荐

