賞金將在 3 天后到期。此問題的答案有資格獲得 300聲望賞金。 Digital Powers希望引起對這個問題的更多關注。
我嘗試結合我在語法上找到的東西,但這已經盡可能接近了。它創建了多個階段,但表示它們沒有步驟。
如果我將代理語法下移到定義“測驗”階段的位置,我可以讓它在同一個代理上運行一堆并行步驟,但我想為每個單獨的 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
}
}
}
}
uj5u.com熱心網友回復:
要并行運行動態創建的作業,您必須使用腳本化的管道語法。腳本化管道中宣告性代理
的等效語法是and (參見完整檔案):kubernetespodTemplatenode
podTemplate(yaml: '''
apiVersion: v1
kind: Pod
spec:
containers:
- name: maven
image: maven:3.8.1-jdk-8
command:
- sleep
args:
- 99d
''') {
node(POD_LABEL) {
...
}
}
請注意,除了 yaml 之外,它還podTemplate可以接收引數,但它默認為,因此無需傳遞它。cloudkubernetes
因此,在您的情況下,您可以使用此語法在不同的代理上并行運行作業:
// 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}"
}
}
}
}
}
uj5u.com熱心網友回復:
如本答案所述:
動態并行階段只能通過使用腳本管道來創建。API 內置的宣告式管道不可用(如代理)。
因此,您不能在不同的代理上并行運行動態階段。
為了實作您想要做的事情,一種解決方案是觸發另一個在新 kube pod 上運行的管道,并在下一步之前等待其完成。
這是 Jenkinsfiles 以獲得更多理解:
- 主要作業Jenkinsfile:
def parallelJobsMap
def triggerJob(item) {
return {
build job: 'myChildJob', parameters: [string(name: 'MY_PARAM', value: "${item.value}")], wait: true
}
}
pipeline {
agent none
stages {
stage('Create List of Stages to run in Parallel') {
steps {
script {
def map = [
"name" : "aparam",
"name2" : "aparam2"
]
parallelJobsMap = map.collectEntries {
["${it.key}" : triggerJob(it)]
}
}
}
}
stage('Test') {
steps {
script {
parallel parallelJobsMap
}
}
}
stage('Release') {
agent any
steps {
echo "Release stuff"
}
}
}
}
- 子作業Jenkinsfile:
pipeline {
agent none
parameters {
string(
name: 'MY_PARAM',
description: 'My beautiful parameter',
defaultValue: 'A default value',
trim: true
)
}
stages {
stage ("Job") {
agent {
kubernetes {
cloud 'kubernetes'
yaml """
apiVersion: v1
kind: Pod
spec:
containers:
- name: name
image: image
command:
- sleep
args:
- infinity
"""
}
}
steps {
echo "Do some important stuff with the parameter " params.MY_PARAM
}
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/422203.html
標籤:
