Jenkins kubernetes-plugin Распараллелить декларативный Jenkinsfile - PullRequest
0 голосов
/ 29 апреля 2019

Использование kubernetes-plugin Parallelise декларативный Jenkinsfile, как вы выполняете этапы параллельно, когда каждый этап использует один и тот же контейнер? (например, анализ sonar_qube и модульное тестирование выполняются на контейнере maven.

Я попробовал следующее в Jenkinsfile:

def label = "my-build-${UUID.randomUUID().toString()}"

podTemplate(label: label, containers: [
  containerTemplate(name: 'maven', image: 'maven:3.5.3-jdk-8-alpine', command: 'cat', ttyEnabled: true),
  containerTemplate(name: 'maven2', image: 'maven:3.5.3-jdk-8-alpine', command: 'cat', ttyEnabled: true),
],
volumes: [
  hostPathVolume(mountPath: '/var/run/docker.sock', hostPath: '/var/run/docker.sock'),
  hostPathVolume(mountPath: '/root/.m2/repository', hostPath: '/root/.m2'),
  hostPathVolume(mountPath: '/tmp', hostPath: '/tmp')
]) {

node(label) {
    def myRepo = checkout scm
    def gitCommit = myRepo.GIT_COMMIT
    def gitBranch = myRepo.GIT_BRANCH

    def didFail = false
    def throwable = null

    try {        
        stage('Tests In Parallel') {
            parallel StaticCodeAnalysis: {
                container('maven'){
                    withSonarQubeEnv('sonarqube-cluster') {
                      // requires SonarQube Scanner for Maven 3.2+
                      sh " mvn help:evaluate -Dexpression=settings.localRepository"

                      sh "mvn clean"
                      sh "mvn compiler:help jar:help resources:help surefire:help clean:help install:help deploy:help site:help dependency:help javadoc:help spring-boot:help org.jacoco:jacoco-maven-plugin:prepare-agent"
                      sh "mvn org.jacoco:jacoco-maven-plugin:prepare-agent package sonar:sonar -Dsonar.host.url=$SONAR_HOST_URL -Dsonar.login=$SONAR_AUTH_TOKEN -Dsonar.exclusions=srcgen/**/* -Dmaven.test.skip=true"
                    }
                }
            }, unitTests: {
                container('maven2') {
                  sh "mvn clean package"

                  junit allowEmptyResults: true, testResults: '**/surefire-reports/*.xml'
                }
            },
            failFast: true
        }       
    } catch (e) {
        didFail = true
        throwable = e
    } finally {
        sh "rm -rf /tmp/${label}"
    }
    if (didFail) {
        echo "Something went wrong."
        error throwable
    }        

  }
}

Кажется, все работает, и в интерфейсе пользователя Blue Ocean я вижу, что эти два этапа работают правильно одновременно. Однако, когда один из этапов этапа parralell завершается, другой завершается неудачно с 'java.lang.NoClassDefFoundError's' для классов, которые определенно уже использовались и где выполнялся этап.

Похоже, что все рабы, которые работают, используют одну и ту же директорию рабочего пространства, то есть: / home / jenkins / workspace / job_name /

Команды maven создают папку - / home / jenkins / workspace / job_name / target / classes - но когда вы видите сбой, он спрашивает, использует ли используемый контейнер весь свой контент из папки классов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...