Как запустить Jenkins?

время 3 МИН
звезда звезда звезда СРЕДНЕ
Основы
Jenkins
CI/CD
Автоматизация

Рассказываю как запустить 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 канал и будьте в курсе новинок.
Если Вам было интересно, можете поддержать автора

Что еще почитать?

Что такое Jenkins-пайплайны?

2023, 19 АВГУСТА
время 5 МИН
звезда звезда звезда СРЕДНЕ
Jenkins
CI/CD
Автоматизация
Рассказываю, как правильно готовить Jenkins. В этой статье разберем, как именно делать автоматизацию сборок в Jenkins, поделюсь лучшими практиками

Как пишут программы?

2023, 19 АВГУСТА
время 4 МИН
звезда звезда звезда ЛЕГКО
Основы
Расскажу о проессе разработке программного обеспечения
на главную