我尝试结合我在语法中找到的东西,但这已经是我能得到的最接近的了。它创建了多个阶段,但表示它们没有步骤。
如果我将代理语法向下移动到定义“测试”阶段的位置,我可以让它在同一个代理上运行一堆并行步骤,但我想为每个代理启动单独的 pod,以便我可以实际使用kubernetes 集群有效地完成我的工作。
附上一个Jenkinsfile示例供引用
def parallelStagesMap
def generateStage(job) {
return {
stage ("$job.key") {
agent {
kubernetes {
cloud 'kubernetes'
yaml """
apiVersion: v1
kind: Pod
spec:
containers:
- name: name
image: image
command:
- sleep
args:
- infinity
"""
}
}
steps {
sh """
do some important stuff
"""
}
}
}
}
pipeline {
agent none
stages {
stage('Create List of Stages to run in Parallel') {
steps {
script {
def map = [
"name" : "aparam",
"name2" : "aparam2"
]
parallelStagesMap = map.collectEntries {
["${it.key}" : generateStage(it)]
}
}
}
}
stage('Test') {
steps {
script {
parallel parallelStagesMap
}
}
}
stage('Release') {
agent etc
steps {
etc
}
}
}
}
最佳答案
要并行运行动态创建的作业,您必须使用脚本化管道语法。
脚本化管道中声明性 kubernetes
代理的等效语法是 podTemplate
和 node
(请参阅完整的 Doucumentation ):
podTemplate(yaml: '''
apiVersion: v1
kind: Pod
spec:
containers:
- name: maven
image: maven:3.8.1-jdk-8
command:
- sleep
args:
- 99d
''') {
node(POD_LABEL) {
...
}
}
注意,podTemplate
除了 yaml 之外,还可以接收 cloud
参数,但它默认为 kubernetes
,所以不需要传递它。
因此,在您的情况下,您可以使用此语法在不同代理上并行运行作业:
// Assuming yaml is same for all nodes - if not it can be passed as parameter
podYaml= """
apiVersion: v1
kind: Pod
spec:
containers:
- name: name
image: image
command:
- sleep
args:
- infinity
"""
pipeline {
agent none
stages {
stage('Create List of Stages to run in Parallel') {
steps {
script {
def map = ["name" : "aparam",
"name2" : "aparam2"]
parallel map.collectEntries {
["${it.key}" : generateStage(it)]
}
}
}
}
}
}
def generateStage(job) {
return {
stage(job.key) {
podTemplate(yaml:podYaml) {
node(POD_LABEL) {
// Each execution runs on its own node (pod)
sh "do some important stuff with ${job.value}"
}
}
}
}
}
关于jenkins - 如何在 jenkins 上并行运行动态阶段,并为每个阶段使用单独的 kubernetes 代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70808071/