簡體   English   中英

如何在隔離的 Pod 中為聲明性 jenkins 管道運行並行階段

[英]How to run parallel stages in isolated pods for a declarative jenkins pipeline

我正在嘗試在聲明性 jenkins 管道上的不同kubernetes pod 上並行運行一些端到端測試,但是 jenkins 似乎嘗試在SAME kubernetes pod 上運行並行階段。 這會導致數據庫死鎖,因為兩個進程都嘗試插入/截斷/更新/查詢相同的表。 有沒有辦法可以為每個並行階段啟動不同的吊艙?

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 為每個並行階段啟動兩個不同的 pod。 這將允許我為每個測試使用不同的數據庫。

實際結果: Jenkins 在同一個 Pod 上同時運行兩個階段。

嘗試這樣的事情

stage("Run additional parallel tests") {
        parallel( 
            "parallel stage 1": {
                [INSERT YOUR CODE HERE]
            },

            "parallel stage 2": {
                [INSERT YOUR CODE HERE]
            }
        )
    }
}

您可以為每個並行階段設置agent {}以在每個階段啟動一個 pod。

你有__________: 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 代碼

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM