Jenkins kubernetes-plugin Распараллелить декларативный Jenkinsfile
Использование 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 - но когда вы видите сбой, он спрашивает, использует ли используемый контейнер весь свой контент из папки классов.