我正在尝试在声明性jenkins管道上的 Different kubernetes pod上并行运行一些端到端测试,但是jenkins似乎尝试运行 SAME kubernetes窗格上的并行阶段。这会导致数据库死锁,因为两个进程都尝试插入/截断/更新/查询相同的表。有没有一种方法可以为每个并行阶段旋转不同的吊舱?
kubernetes-plugin配置:
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`"
}
}
}
}
}
期望:我希望詹金斯在每个平行阶段都旋转两个不同的吊舱。这样我就可以为每个测试使用不同的数据库。
实际结果: Jenkins在同一吊舱上同时运行两个阶段。
答案 0 :(得分:1)
尝试类似的方法
stage("Run additional parallel tests") {
parallel(
"parallel stage 1": {
[INSERT YOUR CODE HERE]
},
"parallel stage 2": {
[INSERT YOUR CODE HERE]
}
)
}
}
答案 1 :(得分:1)
您有__________:stage > parallel > stage > steps
。
您还需要:stage > parallel > stage > agent
。
不要重复两次pod定义,建议将pod定义放在一个单独的文件中,并使用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/
下绘制管道,那么您可以通过键入[Cmd + s]复制Jenkinsfile代码
答案 2 :(得分:0)
您可以为每个并行阶段设置agent {}
,以在每个阶段启动一个广告连播。