为主管道和底层管道保留相同的 jenkins agent pod
keep the same jenkins agent pod for the main and underneath pipelines
我正在使用 jenkins 和 kubernetes,
每次我触发一个工作时,都会创建一个新的入站代理 pod 来执行该工作,到目前为止一切顺利。
但是,管道在管道下方是一个问题:
pipeline {
agent { label 'kubernetePod' }
stages {
stage('Building') {
steps{
build job: 'Build', parameters: []
}
}
stage('Testing') {
steps{
build job: 'Test', parameters: []
}
}
}
在这种情况下,我们有三个管道
- 'main' 管道具有 'building' 阶段和“测试”阶段
- 'build'管道
- 'test'管道
所以创建了一个pod 'A'来执行主管道,
然后创建一个 pod 'B' 以检查并构建解决方案
最终创建了一个 pod 'C' 来执行解决方案测试 但是它崩溃了 因为解决方案包含在 pod 'B'.
我的问题是如何保留 pod 'A' 以执行下面的管道!
感谢您的帮助。
此致
我认为 Kubernetes slaves 被设计成无状态的,并且是单次使用的。
我认为在某些情况下可能有用的唯一解决方法是使用 idleMinutes
设置 Pod
应处于 Running
状态的时间。
在您的情况下,如果您使用具有适当值的 idleMinutes
,您将能够使用相同的 Pod
(podB
从你的例子)。
我创建了一个示例来说明它是如何工作的。
这是管道片段:
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'
}
}
因此我们可以看到创建了两个 Pods(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_file
由 Build
作业创建:
# kubectl exec test-99sfv-vth3j -- cat /home/jenkins/test_file
123abc
我正在使用 jenkins 和 kubernetes, 每次我触发一个工作时,都会创建一个新的入站代理 pod 来执行该工作,到目前为止一切顺利。
但是,管道在管道下方是一个问题:
pipeline {
agent { label 'kubernetePod' }
stages {
stage('Building') {
steps{
build job: 'Build', parameters: []
}
}
stage('Testing') {
steps{
build job: 'Test', parameters: []
}
}
}
在这种情况下,我们有三个管道
- 'main' 管道具有 'building' 阶段和“测试”阶段
- 'build'管道
- 'test'管道
所以创建了一个pod 'A'来执行主管道,
然后创建一个 pod 'B' 以检查并构建解决方案
最终创建了一个 pod 'C' 来执行解决方案测试 但是它崩溃了 因为解决方案包含在 pod 'B'.
我的问题是如何保留 pod 'A' 以执行下面的管道!
感谢您的帮助。
此致
我认为 Kubernetes slaves 被设计成无状态的,并且是单次使用的。
我认为在某些情况下可能有用的唯一解决方法是使用 idleMinutes
设置 Pod
应处于 Running
状态的时间。
在您的情况下,如果您使用具有适当值的 idleMinutes
,您将能够使用相同的 Pod
(podB
从你的例子)。
我创建了一个示例来说明它是如何工作的。
这是管道片段:
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'
}
}
因此我们可以看到创建了两个 Pods(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_file
由 Build
作业创建:
# kubectl exec test-99sfv-vth3j -- cat /home/jenkins/test_file
123abc