首页 > 解决方案 > 为主管道和底层管道保留相同的 jenkins 代理 pod

问题描述

我正在使用 jenkins 和 kubernetes,每次触发作业时都会创建一个新的入站代理 pod 来执行作业,到目前为止一切都很好。

但是,具有下方管道的管道是一个问题:

pipeline {
    agent { label 'kubernetePod' }

  stages {
    
    stage('Building') {
        steps{
            build job: 'Build', parameters: []
        }
    }
    stage('Testing') {
        steps{
            build job: 'Test', parameters: []
         }
    }    
}

在这种情况下,我们有三个管道

因此创建了一个pod 'A'来执行主管道,

然后创建一个pod 'B'来检查和构建解决方案

最后创建了一个pod 'C'来执行解决方案测试,但它崩溃了,因为解决方案包含在pod 'B'中。

我的问题是如何保留 pod 'A' 来执行下面的管道!

感谢您的帮助。

此致

标签: kubernetesjenkins-pipelinekubernetes-pod

解决方案


我认为 Kubernetes slaves 被设计成无状态的并且是一次性使用的。

我认为在某些情况下可能会有所帮助的唯一解决方法是用于设置状态应该保持idleMinutes多长时间。 在您的情况下,如果您使用适当的值,您将能够使用相同的值运行和作业(来自您的示例)。PodRunning
idleMinutesBuildTestPodpodB


我创建了一个示例来说明它是如何工作的。

这是管道片段:

pipeline {

  agent { kubernetes { 
            label 'test'
            idleMinutes "60"
        }}

  stages {
    
    stage('Building') {
        steps{
            build job: 'Build'
        }
    }
    stage('Testing') {
        steps{
            build job: 'Test'
    }    
}
}
}

这是Build工作:

node('test') {
    stage('Run shell') {
        sh 'touch /home/jenkins/test_file'
        sh 'echo 123abc > /home/jenkins/test_file'
    }
}

这是Test作业:
注意:此作业读取作业创建的文件Build

node('test') {
    stage('Run shell') {
        sh 'cat /home/jenkins/test_file'
    }
}

结果,我们可以看到创建了两个 Pod(podA并且podB从您的示例中)并且它们仍处于Running状态:

# kubectl get pods
NAME               READY   STATUS    RESTARTS   AGE
test-99sfv-7fhw2   1/1     Running   0          4m45s
test-99sfv-vth3j   1/1     Running   0          4m25s

此外,test-99sfv-vth3j Pod还有test_fileBuild作业创建的:

# kubectl exec test-99sfv-vth3j -- cat /home/jenkins/test_file
123abc

推荐阅读