Как сделать так, чтобы артефакты Maven сохранялись на трассах в трубопроводе Jenkins? - PullRequest
0 голосов
/ 25 февраля 2020

У нас есть проект Maven Java, который мы хотим запустить в конвейерах Jenkins BlueOcean.

Я следовал этому учебнику . Конвейер работает для выполнения нашего кода. Yay!

Однако каждый раз, когда этап сборки нашего конвейера выполняется под новым запуском Jenkins, он перезагружает все артефакты maven. Это значительно увеличивает время сборки.

Я запускаю контейнер 'jenkins- docker' с:

docker container run --name jenkins-docker --rm --detach \
  --privileged --network jenkins --network-alias docker \
  --env DOCKER_TLS_CERTDIR=/certs \
  --volume jenkins-docker-certs:/certs/client \
  --volume jenkins-data:/var/jenkins_home \
  --publish 2376:2376 docker:dind

А контейнер 'jenkins-blueocean' с:

docker container run --name jenkins-blueocean --rm --detach \
  --network jenkins --env DOCKER_HOST=tcp://docker:2376 \
  --env DOCKER_CERT_PATH=/certs/client --env DOCKER_TLS_VERIFY=1 \
  --volume jenkins-data:/var/jenkins_home \
  --volume jenkins-docker-certs:/certs/client:ro \
  --publish 8080:8080 --publish 50000:50000 jenkinsci/blueocean

Тогда наш конвейер Jenkinsfile выглядит так:

pipeline {
    agent {
        docker {
            image 'maven:3.6.3-jdk-8' 
            args '-v /root/.m2:/root/.m2'
        }
    }
    stages {
        stage('Build') {
            steps {
                sh 'mvn -B -DskipTests clean package'
            }
        }
        stage('Test') { 
            steps {
                sh 'mvn test' 
            }
            post {
                always {
                    junit 'target/surefire-reports/*.xml' 
                }
            }
        }
    }
}

Здесь Jenkins запускает новый образ 'maven: 3.6.3-jdk-8' docker для запуска. Как я понимаю, он также отображает том для сохранения каталога .m2.

Поскольку мой экземпляр 'jenkins- docker' не закрывается при сборке, я хотел бы иметь этот каталог .m2 сохранялось. Тогда каждый последующий прогон может использовать кэш загруженных артефактов и не тратить 5 минут на их повторную загрузку.

Кто-нибудь может подсказать, что я делаю неправильно?

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 26 февраля 2020

Наконец-то понял.

Экземпляр docker, который запускает сборку, автоматически не имеет переменной user.home. В результате каждый раз, когда сборка будет выполняться, она будет хранить артефакты .m2 по пути, включая ? в качестве одной из папок. Подобно тому, как описано в этом вопросе .

Из учебника Дженкинса , я смог выяснить, что Maven Docker images ожидайте загрузки артефактов в /root/.m2. Это предполагает, что maven docker images использует /root в качестве домашнего каталога.

Я обновил свой Jenkinsfile, добавив эту директиву вверху, чтобы экземпляр Maven Docker правильно использовал свой домашний каталог де-факто. .

environment {
  JAVA_TOOL_OPTIONS = '-Duser.home=/root'
}

Затем я попытался решить проблемы с разрешениями, пытаясь получить правильное сопоставление томов. В соответствии с настройкой Jenkins, я уже создал том jenkins-data, и он доступен на моих «хостовых» контейнерах Jenkins как /var/jenkins_home.

Все, наконец, сработало, когда я сопоставил этот том непосредственно с /root каталог в моем Maven docker изображение. Это отступление от настройки учебника Jenkins, которая показала, что она сопоставлена ​​с /root/.m2.

В итоге

Это мой рабочий Jenkinsfile

    environment {
      JAVA_TOOL_OPTIONS = '-Duser.home=/root'
    }
    agent {
        docker {
            image 'maven:3.6.3-jdk-8' 
            args '-v /var/jenkins_home:/root'
        }
    }
    stages {
        stage('Build') {
            steps {
                sh 'mvn -B -DskipTests clean compile'
            }
        }
        stage('Test') { 
            steps {
                sh 'mvn -X test'
                jacoco()
            }
            post {
                always {
                    junit 'target/surefire-reports/*.xml' 
                }
            }
        }
    }
0 голосов
/ 25 февраля 2020

РЕДАКТИРОВАТЬ: я прочитал вопрос о том, как сделать, чтобы производственные сборки Jenkins maven избегали загрузки артефактов путем совместного использования папки .m2. Вопрос в том, чтобы заставить работать учебник по запуску maven в локальном docker экземпляре. Не совсем то же самое.

—-

Существует несколько решений. Не делайте не разделяйте / сохраняйте папку .m2, Maven не безопасен для потоков (в прошлый раз, когда я действительно изучал это, возможно, уже исправлено)

Самое простое - настроить зеркало Maven хранилище (для этого хорошо работает Nexus) и сообщите вашей docker сборке Maven использовать ее как зеркало.

...