如何在声明的詹金斯管道中在隔离的Pod中运行并行阶段

时间:2019-03-27 07:52:47

标签: jenkins jenkins-pipeline jenkins-declarative-pipeline parallel-testing jenkins-kubernetes

我正在尝试在声明性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在同一吊舱上同时运行两个阶段。

3 个答案:

答案 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 {},以在每个阶段启动一个广告连播。