Рассказываю как запустить Jenkins локально внутри Kubernetes и настроить сборку. Полезно если хотите тестировать пайплайны локально или желаете разобраться в том как устроен CI/CD (непрерывная интеграция и поставка)
Jenkins
Jenkins это компьютерная программа для автоматизации процесса разработки (сборка, тестирование, деплой). Для расширения функционала используются плагины. Для настройки, установки плагинов и создания автоматизаций у Jenkins есть графический веб-интерфейс. Процессы сборки и тестирования бывают ресурсоемкими и мощности одной машины может не хватить. Jenkins можно настроить работать с несколькими машинами для распределения нагрузки между ними. Jenkins написан на Java и требует для запуска JVM.
Способы установки Jenkins
Ручной. Устанавливаем JVM, скачиваем с официального сайта пакет для вашей операционной системы, устанавливаем, запускаем, открываем браузер, добавляем необходимые плагины по вкусу, создаем вручную скрипты автоматизаций, готово. Долго, мучительно, можно совершить ошибку, установить не те версии софта и в результате может работать не так как надо. Грусть, тоска, безысходность.
Автоматический. За вас все шаги проделает специальная программа (Ansible, Docker, Helm). Можно сконфигурировать установку полностью вплоть до установки нужных версий Jenkins, плагинов, софта, настройки скриптов автоматизации. Такой способ позволяет быстрее получить гарантируемый результат. Далее рассмотрим вариант c установкой Jenkins в Kubernetes.
Kubernetes
Kubernetes это компьютерная программа представляет собой оркестратор контейнеров и позволяет управлять кластером машин. Kubernetes позволяет равномерно распределять нагрузку, перезапускать контейнеры если они упали, управлять безопасностью и многое другое. Таким образом Kubernetes предоставляет среду в которой можно запускать не только сам Jenkins со сборками, но и деплоить в тот же Kubernetes-кластер собранное приложение.
Благодаря контейнерам повышается использование оборудования, потому что на одной машине
можно запустить несколько приложений, а не одно как в случае с виртуальными машинами.
Сборки внутри контейнеров позволяет однозначно задавать условия в которых ожидается
что приложение будет собрано успешно.
Установка Docker и Kubernetes
Идем сюда скачиваем и устанавливаем Docker Desktop под вашу платформу.
Запускаем Docker Desktop, заходим в Dashboard, настройки (справа сверху шестеренка), вкладка Kubernetes, ставим обе галки, жмакаем кнопку "Apply & Restart", ждем пока позеленеет.
Открываем консоль и пишем:
kubectl get nodes
NAME STATUS ROLES AGE VERSION
docker-desktop Ready control-plane 24h v1.27.2
Радуемся, Docker и Kubernetes у нас установлены и работают:)
Установка Jenkins
Установим Jenkins в Kubernetes. Для начала создадим в Kubernetes неймспейс. Чтобы сгруппировать все остальные настройки. Неймспейс изолирует ресурсы находящиеся внутри от ресурсов в других неймспейсах. Удобно создавать неймспейс на проект или на команду.
Для удобства можете создать на компьютере папку jenkins, в ней будем размещать необходимые для установки файлы.
Создадим в ней первый файл: namespace.yaml с содержимым:
apiVersion: v1
kind: Namespace
metadata:
name: jenkins
Выполните в терминале:
kubectl apply -f namespace.yaml
Результат:
namespace/jenkins created
Создадим в ней второй файл: volume.yaml с содержимым:
apiVersion: v1
kind: PersistentVolume
metadata:
name: jenkins-pv
namespace: jenkins
spec:
storageClassName: jenkins-pv
accessModes:
- ReadWriteOnce
capacity:
storage: 10Gi
persistentVolumeReclaimPolicy: Retain
hostPath:
path: /data/jenkins-volume/
Выполните в терминале:
kubectl apply -f volume.yaml
Результат:
persistentvolume/jenkins-pv created
Выполните в терминале:
helm repo add jenkins https://charts.jenkins.io
helm repo update
helm install myjenkins \
-f https://mekhanikov.pro/excercises/jenkins_kubernetes/values.yaml \
jenkins/jenkins --namespace jenkins
Результат:
NAME: myjenkins
LAST DEPLOYED: Thu Sep 7 23:59:42 2023
NAMESPACE: jenkins
STATUS: deployed
REVISION: 1
NOTES:
1. Get your 'admin' user password by running:
kubectl exec --namespace jenkins -it svc/myjenkins -c jenkins \
-- /bin/cat /run/secrets/additional/chart-admin-password && echo
2. Get the Jenkins URL to visit by running these commands in the same shell:
echo http://127.0.0.1:8080
kubectl --namespace jenkins port-forward svc/myjenkins 8080:8080
3. Login with the password from step 1 and the username: admin
4. Configure security realm and authorization strategy
5. Use Jenkins Configuration as Code by specifying configScripts
in your values.yaml file, see documentation:
http://127.0.0.1:8080/configuration-as-code
and examples:
https://github.com/jenkinsci/configuration-as-code-plugin/tree/master/demos
For more information on running Jenkins on Kubernetes, visit:
https://cloud.google.com/solutions/jenkins-on-container-engine
For more information about Jenkins Configuration as Code, visit:
https://jenkins.io/projects/jcasc/
NOTE: Consider using a custom image with pre-installed plugins
Дождемся пока Jenkins запустится (STATUS станет Running):
kubectl get pods --namespace jenkins --watch
NAME READY STATUS RESTARTS AGE
myjenkins-0 2/2 Running 0 2m43s
Теперь можно нажать Ctrl+C. Из выше сказанного следует чтоб получить пароль надо выполнить в терминале:
kubectl exec --namespace jenkins -it svc/myjenkins -c jenkins \
-- /bin/cat /run/secrets/additional/chart-admin-password && echo
Результат:
Bcd9e2qcvV8qbnOu5Mxkt8
У вас значение будет скорее всего другое. Теперь сделаем Jenkins доступным на порту 8080:
kubectl --namespace jenkins port-forward svc/myjenkins 8080:8080
Теперь можно открыть браузер http://127.0.0.1:8080/ и сконфигурировать следующий небольшой скрипт.
podTemplate(containers: [
containerTemplate(name: 'maven', image: 'openjdk:17-alpine', command: 'sleep', args: '99d')
]
) {
node(POD_LABEL) {
stage('Build java') {
container('maven') {
sh """
ls -lah
pwd
java -version
"""
}
}
}
}
Для этого выполним слелующие шаги как на скриншотах (можно листать)
Спасибо, что заглянули,
добавляйтесь в
Telegram
канал и будьте в курсе новинок.
Если Вам было интересно, можете поддержать автора