Как запустить параллельные этапы в изолированных модулях для декларативного конвейера Дженкинса
Я пытаюсь запустить несколько сквозных тестов параллельно и на разных модулях kubernetes в декларативном конвейере jenkins, однако jenkins, похоже, пытается запустить параллельные этапы на одном и том же модуле kubernetes. Это приводит к взаимоблокировке базы данных, поскольку оба процесса пытаются вставить / усечь / обновить / запросить одни и те же таблицы. Есть ли способ, которым я могу раскрутить разные капсулы для каждого из параллельных этапов?
Конфигурация плагина kubernetes:
agent {
kubernetes {
label 'my-label'
defaultContainer 'jnlp'
yaml """
apiVersion: v1
kind: Pod
metadata:
name: dind
spec:
containers:
- name: < default container >
image: < image >
securityContext:
privileged: true
fsGroup: 1000
command:
- cat
tty: true
volumeMounts:
- name: jenkins-bundle-gems
mountPath: /usr/local/bundle
- name: <tests-container-name>
image: < image >
securityContext:
privileged: true
fsGroup: 1000
volumeMounts:
- name: jenkins-bundle-gems
mountPath: /usr/local/bundle
command:
- cat
tty: true
"""
}
}
Параллельный этап:
stage('Test'){
parallel {
stage("Branch 1") {
steps {
container('<tests-container-name>') {
sh "jenkins/scripts/initdb.sh"
sh 'bundle exec rspec --exclude-pattern "spec/features/*_spec.rb" spec'
}
}
}
stage("Branch 2") {
steps {
container('<tests-container-name>') {
sh "jenkins/scripts/initdb.sh"
sh "bundle exec rspec `jenkins/scripts/split_features.sh 0`"
}
}
}
}
}
ОЖИДАНИЕ: Я бы хотел, чтобы Дженкинс раскрутил две разные капсулы для каждой из параллельных стадий. Это позволило бы мне использовать разные базы данных для каждого из тестов.
ФАКТИЧЕСКИЙ РЕЗУЛЬТАТ: Дженкинс запускает оба этапа одновременно на одном модуле.
1 ответ
У тебя есть__________: stage > parallel > stage > steps
.
Также необходимо иметь: stage > parallel > stage > agent
.
Не повторяйте определение модуля дважды, рекомендуется поместить определение модуля в отдельный файл и обращаться к нему с помощью yamlFile
вместо того yaml
:
stage('Test'){
parallel {
stage("Branch 1") {
agent {
kubernetes {
defaultContainer 'jnlp'
yamlFile 'Jenkins.pod.yaml'
}
}
steps {
container('<tests-container-name>') {
sh "jenkins/scripts/initdb.sh"
sh 'bundle exec rspec --exclude-pattern "spec/features/*_spec.rb" spec'
}
}
}
stage("Branch 2") {
agent {
kubernetes {
defaultContainer 'jnlp'
yamlFile 'jenkins.pod.yaml'
}
}
steps {
container('<tests-container-name>') {
sh "jenkins/scripts/initdb.sh"
sh "bundle exec rspec `jenkins/scripts/split_features.sh 0`"
}
}
}
}
}
Подсказка
если blueocean является одним из ваших плагинов, это поможет вам нарисовать ваш конвейер под http://HOST/blue/organizations/jenkins/pipeline-editor/
, затем вы можете скопировать код Jenkinsfile, набрав [Cmd + s]
Попробуйте что-то вроде этого
stage("Run additional parallel tests") {
parallel(
"parallel stage 1": {
[INSERT YOUR CODE HERE]
},
"parallel stage 2": {
[INSERT YOUR CODE HERE]
}
)
}
}
Вы можете установить agent {}
для каждого параллельного этапа запускать модуль на каждом этапе.