【发布时间】:2021-03-02 15:26:46
【问题描述】:
我正在尝试设置一个 Jenkins 声明式管道以在其执行期间使用两个不同的代理。代理由 Kubernetes 插件动态生成。为了论证和简单起见,假设我想这样做:
在代理 1 上(云名称:“ubuntu”):
- 运行 apt-get 并进行一些安装
- 运行 shell 脚本
- 其他步骤
在代理 2 上(云名称:“fedora”):
- 运行 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 ....
"""
}
}
【问题讨论】:
-
您可以在完成后让代理保持活动状态以供重用(并使其等待 x 分钟以等待其他工作接受它 - 但我不确定您是否可以指定 - 完全接受这个代理,它会更多如果您需要上一个,可能会选择第一个可用的所以不是真的“稳定”。另外我想问你一个问题 - 你是否知道如何同时产生多个具有多个资源配额的代理? atm . 我很少有工作需要 9gb 的内存,而所有其他工作都需要 500mb 的最高容量 - 运行所有具有高限制的工作有点浪费
-
@potatopotato 可能我能想到的唯一方法是使用不同的“云”定义:
标签: jenkins kubernetes