Понимание шагов Jenkinsfile для Docker agent

#docker #jenkins #jenkins-pipeline

#docker #дженкинс #дженкинс-конвейер

Вопрос:

У меня есть Jenkinsfile со следующими шагами:

 stage('build') {
      agent {
           docker {
               image 'maven:3-alpine'
               args '-v /ec2-user/.m2:/root/.m2'
           }
      }
      steps {
        git(url: 'https://github.com/user/project.git', branch: 'master')
        sh 'cp /home/application-prod.properties src/main/resources'
        sh 'mvn clean install'
      }
    }
  

Согласно документам, Дженкинс должен выполнить шаги на этом этапе во вновь созданном контейнере, используя этот образ.

Если это так, то почему команда sh второго шага выполнена успешно? Как он может получить доступ к файлу на хосте Jenkins?

Для меня это выглядит так, как будто команды выполняются на хосте Jenkins. Тогда почему чистая установка mvn работает нормально? На хосте Jenkins не установлен Maven.

Ответ №1:

Поскольку это обычный случай, когда вы хотите получить доступ к содержимому вашей рабочей области, Jenkins автоматически монтирует его как том в контейнер. В противном случае, вероятно, в 99% всех заданий пришлось бы указывать, что извлеченный репозиторий должен быть смонтирован в контейнер.

Вы должны быть в состоянии видеть -v параметры в выходных данных сборки, когда она выдает docker run команду.

Комментарии:

1. Спасибо, я вижу это в журналах. Но каталог / home с файлом props не находится внутри отображенного каталога workspace и по умолчанию не сопоставлен с контейнером. Как контейнер получает к нему доступ?

2. Понятно, каков результат сборки?

3. Сборка успешно выполняется, и я получаю действительный артефакт jar с предполагаемым приложением-prod.properties внутри каталога / target в Jenkins workspace. Кроме того, я заметил, что в журналах каталог Jenkins workspace отображается не с флагом -v , а с -w (как workdir), но я все еще не могу понять, как осуществляется доступ к каталогу / home.

4. Наверное, я понял. Мой хост Jenkins также запущен в контейнере. И когда запускается контейнер Maven, есть также опция —volumes-from (наряду с -w ), которая отображает все тома контейнера Дженкинса в контейнер Maven. Спасибо за вашу помощь!