Как запускать параллельные этапы в изолированных модулях для декларативного конвейера Дженкинса

Я пытаюсь запустить несколько сквозных тестов параллельно и на РАЗНЫХ модулях кубернетов на декларативном конвейере Дженкинса, однако Дженкинс, похоже, пытается запустить параллельные этапы на ЖЕ капсула Кубернетес. Это приводит к взаимоблокировкам базы данных, поскольку оба процесса пытаются вставить / усечь / обновить / запросить одни и те же таблицы. Есть ли способ раскрутить разные поды для каждого из параллельных этапов?

Конфигурация плагина 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`"
                }
              }
            }
        }
      }

ОЖИДАНИЕ: Я хотел бы, чтобы Дженкинс запустил два разных модуля для каждого из параллельных этапов. Это позволило бы мне использовать разные базы данных для каждого теста.

ФАКТИЧЕСКИЙ РЕЗУЛЬТАТ: Дженкинс одновременно выполняет оба этапа в одном и том же модуле.


comment
Привет, Марк, вы определили только один модуль с двумя контейнерами. В соответствии с вашим этапом вы используете тот же контейнер. Я считаю, что вам следует проверить вариант для боковой машины (или двух боковых автомобилей), также известных как контейнеры инициализации, чтобы удовлетворить ваши потребности.   -  person Chen    schedule 27.03.2019
comment
@Chen Что, если бы я определил 5 контейнеров (из одного изображения) в одном модуле. Решит ли это проблему параллелизма?   -  person martinkaburu    schedule 29.03.2019
comment
Я думаю, вы упускаете суть. Я предлагаю вам изменить файлы yaml и jenkinsfile. В Jenkinsfile используйте разные контейнеры вместо одного и того же onr   -  person Chen    schedule 01.04.2019


Ответы (3)


Попробуйте что-то вроде этого

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

            "parallel stage 2": {
                [INSERT YOUR CODE HERE]
            }
        )
    }
}
person George Cimpoies    schedule 27.03.2019

Вы можете установить agent {} для каждого параллельного этапа, чтобы запускать модуль на каждом этапе.

person Morgan Christiansson    schedule 17.07.2019
comment
дайте шаблон, например Джордж Ответ. У меня есть gist here, чтобы представить все способы параллелизма. - person Abdennour TOUMI; 14.09.2019

У вас есть __________: 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]

person Abdennour TOUMI    schedule 14.09.2019