我试图设置一个Jenkins声明性管道,使其在执行过程中使用两个不同的代理。代理由Kubernetes插件动态生成。为了论证和简单起见,让我们假设我想这样做:
在代理1(云名称:"ubuntu"):
- 运行apt-get和一些安装程序
- 运行shell脚本
- 其他步骤
在代理2(云名称:"软呢帽"):
- 运行dnf和一些安装
- 运行shell脚本
- 其他步骤
我遇到的问题是,如果我使用全局代理声明:
pipeline {
agent {
kubernetes {
cloud 'ubuntu'
label "ubuntu-agent"
containerTemplate {
name 'support'
image 'blenderfox/support'
ttyEnabled true
command 'cat'
}
}
}
...
}
那么它会在所有阶段使用如果我不在每个阶段声明一个代理的话。
如果使用agent none
:
pipeline {
agent none
...
}
然后,我必须为每个阶段声明一个代理规范,例如:
stage ("apt update") {
agent {
kubernetes {
cloud 'ubuntu'
label "ubuntu-agent"
containerTemplate {
name 'support'
image 'blenderfox/support'
ttyEnabled true
command 'cat'
}
}
}
steps {
sh """
apt update
"""
}
}
虽然这对我来说很有效,因为我可以在每个阶段声明我想要哪个代理,但这个方法引起的问题是,它为 * 每个 * 阶段生成一个新代理,这意味着状态不在这两个阶段之间传递:
stage ("apt-update") {
agent {
....
}
steps {
sh """
apt update
"""
}
}
stage ("apt-install") {
agent {
....
}
steps {
sh """
apt install -y ....
"""
}
}
我可以跨阶段重用同一个代理吗?例如,如下所示:
stage ("provision agent") {
agent {
...
label "ubuntu-agent"
...
}
steps {
sh """
echo "Provisioning agent"
"""
}
}
stage ("apt-update") {
agent {
label "ubuntu-agent" //reuse agent from previous stage
}
steps {
sh """
apt update
"""
}
}
stage ("apt-install") {
agent {
label "ubuntu-agent" //reuse agent from previous stage
}
steps {
sh """
apt install -y ....
"""
}
}
2条答案
按热度按时间vecaoik11#
找到了一个解决办法。很老套但很管用:
代理程序的yamls各不相同,但您可以执行以下操作:
然后像这样使用代理:
iszxjhcz2#
使用sequential stages可以解决这个问题-您可以使用代理定义一个stage,然后可以在其中嵌套其他stage