О чем это
Автоматизация сборки Java-приложения с помощью Jenkins в кластере Kubernetes
Вариация на тему туториалов:
Установка Jenkins в кластер Kubernetes
Настройка 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 Templates → Containers → EnvVars по-умолчанию прописана единственная переменная - JENKINS_URL. Ей нужно либо дать актуальное значение (внешний URL, на котором доступна master-нода, либо актуальный Jenkins URL сервиса в кластере), либо просто удалить, потому как Jenkins URL в текущей версии задается на уровне плагина.
- Также нужно обратить внимание на значение Pod Templates → Labels. Метки должны быть одинаковые в Pod Templates и в конфигурации конвейера.
Проверка работоспособности плагина Jenkins kubernetes
Freestyle project
При использовании типа Freestyle Project пайплайн конфигурируется из web-интерфейса.
- На главной страничке web-интерфейса Jenkins жмем New Item.
- Даем проекту имя (например - test)
- Выбираем тип - Freestyle project.
- На вкладке General ставим галку Restrict where this project can be run, а в поле Label Expression вводим метку, указанную в параметре Pod Templates → Labels. Если метка введена корректная, то под полем будет напись примерно такая:
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
Также можно протестировать работу пайплайна в проектах типа 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 Templates → Labels.
Однако, можно переопределить параметры контейнера (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).
Discussion