Плагин K8s для Jenkins: всегда запускать два отдельных контейнера внутри модуля - PullRequest
0 голосов
/ 31 мая 2018

Я создал Dockerfile (для узла JNLP , который можно использовать с Kubernetes Plugin of Jenkins ).Я продолжаю с официального изображения jenkinsci/jnlp-slave

FROM jenkinsci/jnlp-slave

USER root


MAINTAINER Aryak Sengupta <aryak.sengupta@hyland.com>
LABEL Description="Image for NodeJS slave"

COPY cert.crt /usr/local/share/ca-certificates
RUN update-ca-certificates

RUN curl -sL https://deb.nodesource.com/setup_8.x | bash \
    && apt-get install -y nodejs

ENTRYPOINT ["jenkins-slave"]

Я сохранил это изображение в своем шаблоне Pod (в конфигурации плагина K8s).Теперь, когда я пытаюсь запустить сборку на этом slave , я обнаруживаю, что внутри Pod появляются два контейнера (снимок экрана, подтверждающий то же самое).

enter image description here

Мой шаблон Pod выглядит следующим образом:

enter image description here

И моя конфигурация Kubernetes выглядит следующим образом:enter image description here

Теперь, если я сделаю простое docker ps, я обнаружу, что запустились два контейнера (почему?):

enter image description here

Теперь, внутри конфигурации Jenkins Job в Jenkins, все, что я добавляю на этапе сборки, выполняет шаги в первом контейнере.

Даже если я использую официальный контейнер Node внутри моего PodTemplate, результат все тот же:

enter image description here

Я попытался напечатать версию Node внутри моей работы Jenkins, и выдается "Node not found" .Кроме того, чтобы проверить, что я догадался, я сделал docker exec во втором контейнере и попытался напечатать Node версию.В этом случае все работает абсолютно нормально.

Вот так выглядит мой шаг сборки:

enter image description here

Итак, чтобы свести его к минимуму, у меня есть два основных вопроса:

  1. Почему два отдельных (один для JNLP и один со всеми пользовательскими изменениями) контейнера запускаются всякий раз, когда я запускаю задание Jenkins?
  2. Почему моя работа выполняется в первом контейнере, где Node не установлен?Как мне добиться желаемого поведения при построении моего проекта с помощью Node с использованием этой конфигурации?

Чего мне не хватает?

PS - Пожалуйста, дайте мне знать, если вопрос окажется неясным в некоторых частях.

Редактировать: Я понимаю, что это можно сделать с помощью плагина Pipeline Jenkins, где я могу явно указать имя container, но мне нужно сделать это из пользовательского интерфейса Jenkins.Есть ли способ указать имя контейнера вместе с именем ведомого, которое я уже делаю так:

enter image description here

Ответы [ 3 ]

0 голосов
/ 27 июня 2018

Чтобы установить шаблон контейнера -> имя как jnlp.https://issues.jenkins -ci.org / просмотр / JENKINS-40847

0 голосов
/ 12 ноября 2018

Хорошо, так что я нашел решение. mhang li ответ был ключом, но он не объяснил это ни капли.

По сути, вам нужно изменить официальное изображение Jenkins Slave, найденное здесь иизмените его, чтобы включить изменения для вашего ведомого.По сути, вы объединяете контейнеры JNLP и Slave в один и создаете объединенный образ.

Формат модификации будет выглядеть следующим образом (получение из связанного с Dockerfile файла)

FROM jenkins/slave:3.27-1
MAINTAINER Oleg Nenashev <o.v.nenashev@gmail.com>
LABEL Description="This is a base image, which allows connecting Jenkins agents via JNLP protocols" Vendor="Jenkins project" Version="3.27"

COPY jenkins-slave /usr/local/bin/jenkins-slave

**INCLUDE CODE FOR YOUR SLAVE. Eg install node, java, whatever**

ENTRYPOINT ["jenkins-slave"] # Make sure you include this file as well

Теперь назовите подчиненный контейнер jnlp (Причина - ошибка ).Так что теперь у вас будет один контейнер, который будет вашим JNLP + Slave.В общем, ваш шаблон модуля плагинов Kubernetes будет выглядеть примерно так.Обратите внимание на пользовательский URL-адрес образа докера, который я вставил. Также убедитесь, что вы не включили Command To Run, если он вам не нужен.

enter image description here

Готово!Ваши сборки должны теперь работать в этом контейнере и работать точно так же, как вы запрограммировали Dockerfile!

0 голосов
/ 31 мая 2018

Плагин Jenkins kubernetes всегда создает подчиненный контейнер JNLP внутри модуля, который создается для выполнения сборки.PodTemplate - это место, где вы определяете другие контейнеры, необходимые для выполнения вашей сборки.

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

На самом деле вам не важно, где работает Pod.Все, что вам нужно сделать, это убедиться, что вы добавили контейнер, который имеет необходимые ресурсы (например, Node в данном случае).Вы можете добавить столько контейнеров, сколько хотите в шаблон podTemplate.У меня есть несколько с 10 или более контейнерами для таких шагов, как PMD, Maven, curl и т. Д.

Я использую Jenkinsfile с конвейерами.

podTemplate(cloud: 'k8s-houston', label: 'api-hire-build', 
  containers: [
    containerTemplate(name: 'maven', image: 'maven:3-jdk-8-alpine', ttyEnabled: true, command: 'cat'),
    containerTemplate(name: 'pmd', image: 'stash.company.com:8443/pmd:pmd-bin-5.5.4', alwaysPullImage: false, ttyEnabled: true, command: 'cat')
  ],
  volumes: [
    persistentVolumeClaim(claimName: 'jenkins-pv-claim', mountPath: '/mvn/.m2nrepo')
  ]
)
{
  node('api-hire-build') {
    stage('Maven compile') {
      container('maven') {
        sh "mvn -Dmaven.repo.local=/mvn/.m2nrepo/repository clean compile"
      }
    }
    stage('PMD SCA (docker)') {
      container('pmd') {
        sh 'run.sh pmd -d "$PWD"/src -f xml -reportfile "$PWD"/target/pmd.xml -failOnViolation false -rulesets java-basic,java-design,java-unusedcode -language java'
        sh 'run.sh pmd -d "$PWD"/src -f html -reportfile "$PWD"/target/pmdreport.html -failOnViolation false -rulesets java-basic,java-design,java-unusedcode -language java'
        sh 'run.sh cpd --files "$PWD"/src --minimum-tokens 100 --failOnViolation false --language java --format xml > "$PWD"/target/duplicate-code.xml'
      }
      archive 'target/duplicate-code.xml'
      step([$class: 'PmdPublisher', pattern: 'target/pmd.xml'])
    }
  }
}
...