О чем это

Установка Jenkins в кластер Kubernetes

https://www.oracle.com/webfolder/technetwork/tutorials/obe/oci/configure_jenkins_kubernetes_plugin/configurekubernetesplugin.html

Если разворачивание jenkins осуществлялось с помощью helm, то в кластере kubernetes уже все настроено (service account и прочее).
Чтобы запускать конвейеры в кластере kubernetes достаточно в разделе Cloud настроить:

  • В поле Name - kubernetes.
  • В поле Kubernetes URL указать URL, где доступен Kubernetes API,
kubectl cluster-info | grep 'Kubernetes master'
  • Если кластер развернут с самоподписанными сертификатами - нужно добавить корневой сертификат /etc/kubernetes/pki/ca.crt с master-ноды kubernetes в docker-образ jenkins и прописать в Kubernetes server certificate key - сертификат master-ноды kubernetes. ИЛИ просто поставить галочку Disable https certificate check
cat ~/.kube/config | grep certificate-authority-data: | cut -d: -f2 | tr -d ' ' | base64 -d
  • нажать Test Connection. В ответ будет Connection test successful
  • В поле Jenkins URL вставить URL, на котором доступна master-нода Jenkins (внешний URL, на котором доступна master-нода, либо актуальный URL сервиса jenkins в кластере). Если там будет неверный URL, то в логах запускаемых pod'ов будут ошибки типа SEVERE: Failed to connect to http://jenkins.jenkins.svc.cluster.local:8080/tcpSlaveAgentListener/: connect timed out)
  • В разделе Pod TemplatesContainersEnvVars по-умолчанию прописана единственная переменная - JENKINS_URL. Ей нужно либо дать актуальное значение (внешний URL, на котором доступна master-нода, либо актуальный Jenkins URL сервиса в кластере), либо просто удалить, потому как Jenkins URL в текущей версии задается на уровне плагина.
  • Также нужно обратить внимание на значение Pod TemplatesLabels. Метки должны быть одинаковые в Pod Templates и в конфигурации конвейера.

При использовании типа Freestyle Project пайплайн конфигурируется из web-интерфейса.

  • На главной страничке web-интерфейса Jenkins жмем New Item.
  • Даем проекту имя (например - test)
  • Выбираем тип - Freestyle project.
  • На вкладке General ставим галку Restrict where this project can be run, а в поле Label Expression вводим метку, указанную в параметре Pod TemplatesLabels. Если метка введена корректная, то под полем будет напись примерно такая:
Label TEST is serviced by no nodes and 1 cloud. Permissions or other restrictions provided by plugins may prevent this job from running on those nodes.

А если нод/агентов с такой меткой не найдено, то подсказочка:

There’s no agent/cloud that matches this assignment. Did you mean ‘TEST’ instead of ‘TEST2’?
  • Затем нужно на вкладке (в разделе) Build кликнуть Add build step и выбрать Execute shell, а затем ввести:
echo 'hello world'

Теперь можно нажать Save и запустить конвейер - Build Now, а затем наблюдать за прогрессом.
Слева в меню появится выполняющееся задание. Можно нажать на него и выбрать Console Output, где будет видно yaml-декларация pod'а и в конце:

Building remotely on jenkins-agent-kdslp (TEST) in workspace /home/jenkins/agent/workspace/test2
[test2] $ /bin/sh -xe /tmp/jenkins5492002065026255241.sh
+ echo hello world
hello world
Finished: SUCCESS

Также можно протестировать работу пайплайна в проектах типа Pipeline. В этом случае конвейер описывается с помощью Jenkinsfile.

  • На главной страничке web-интерфейса Jenkins жмем New Item.
  • Даем проекту имя (например - test)
  • Выбираем тип - Pipeline.

Декларативный стиль

  • Листаем вниз и в разделе Pipeline выбираем Pipeline Script и вставляем туда скрипт пайплайна в декларативном стиле:
pipeline {
   agent {
    node {
        label 'kube'
    }
   }

   stages {
      stage('Hello') {
         steps {
            echo 'Hello World'
         }
      }
   }
}

Тут важна строка с меткой:

label 'kube'

Эта же метка должна быть в настройках плагина Kubernetes - Pod TemplatesLabels.
Однако, можно переопределить параметры контейнера (containerTemplate), указав их в декларации:

pipeline {
   agent {
     kubernetes {
       label 'build-service-pod'
       containerTemplate {
         name 'jnlp'
         image 'jenkins/jnlp-slave:3.27-1'
         ttyEnabled true
        }
      }
    }

   stages {
      stage('Hello') {
         steps {
            echo 'Hello World'
         }
      }

Императивный стиль

Также можно протестировать скрипт в императивном стиле:

node('kube') {
  stage('test') { 
    echo 'Hello World'
  }
}

Тут важна строка с меткой:

node('kube')

Исходники приложения

Я буду тренироваться на тренировочном java-приложении - https://github.com/jenkins-docs/simple-java-maven-app
Нужно взять эти исходники и загрузить на доступный вам git-репозиторий. У меня развернут GitLab и в нем создан пустой проект, но можно обойтись и без сервера git, указывая в качестве адреса локальную папку.

git clone https://github.com/jenkins-docs/simple-java-maven-app
cd simple-java-maven-app/
git remote add autosys https://git.autosys.tk/username/simple-java-maven-app.git
git push -u autosys master

Затем нужно в GitLab сгенерировать для этого проекта Deploy Token (Settings → Repository → Deploy Tokens).

Создание Jenkins-файла

Enter your comment. Wiki syntax is allowed:
U C F A T
 
  • devops/java_app_cd_pipeline_with_jenkins.txt
  • Last modified: 2019/11/18 14:53
  • by admin