Основы Jenkins
Введение | |
Простейший Freestyle project | |
Запустить скрипт из репозитория | |
Jenkins Docker Agent | |
Автоматический запуск заданий | |
Переменные окружения | |
Сборщики проектов | |
Статьи про Jenkins |
Введение
Jenkins — программная система с открытым исходным кодом на
Java
, предназначенная для обеспечения процесса непрерывной интеграции
программного обеспечения.
Ответвлена в 2008 году от проекта Hudson, принадлежащего компании Oracle, основным его автором — Косукэ Кавагути.
Распространяется под лицензией MIT.
Позволяет автоматизировать часть процесса разработки программного обеспечения, в котором не обязательно участие человека, обеспечивая
функции непрерывной интеграции.
Работает в сервлет-контейнере, например, Apache Tomcat.
Поддерживает инструменты системы управления версиями, включая AccuRev, CVS,
Subversion
,
Git
, Mercurial, Perforce, Clearcase и RTC.
Может собирать проекты с использованием Apache Ant и
Apache Maven
, а также выполнять произвольные сценарии оболочки и пакетные файлы
Windows
.
Сборка может быть запущена разными способами, например, по событию фиксации изменений в системе управления версиями, по расписанию,
по запросу на определённый URL, после завершения другой сборки в очереди.
Возможности Jenkins можно расширять с помощью плагинов.
Контроль доступа реализуется двумя способами: проверкой подлинности пользователя и авторизацией.
Поддерживается защита от внешних угроз, в том числе от
CSRF-атак
и вредоносных сборок.
В 2011 году Jenkins получил награду InfoWorld как лучший проект с открытым исходным кодом.
По умолчанию слушает
TCP порт
8080
Простейший Freestyle project
Чтобы создать простой Freestail job нужно выполнить следующие действия:
New Item → Enter an item name → Freestyle project → Build Steps → Add build step → Execute shell → Command → Save
Затем этот job можно немедленно запустить нажав
Build Now
Подробнее про Freestyle проекты Jenkins читайте в статье Freestyle job
Запустить скрипт из репозитория
В простейшем случае это можно сделать из Freestyle проекта
New Item → Enter an item name → Freestyle project → Source Code Management → Git → Repositories → Repository URL → Build Steps → Add build step → Execute shell → Command → Save
Credentials в публичном репозитории не нужны. Если репозиторий частный - можно настроить аутентификацию с помощью токена. Подробнее можно прочитать здесь
Когда с аутентификацией всё готово (либо если она не нужна) можно переходить к Build Steps
Jenkins Docker Agent
Относительно новый способ создавать агентов - запускать их в Docker контейнерах. Для этого в Jenkins нужно добавить плагин Docker
Plugin Manager → Cloud Providers → Docker
Настройка происходит через
Manage Jenkins → Manage nodes and clouds → Configure Clouds
Настроим Docker сервер на отдельном Ubuntu хосте в локальной сети и затем вернёмся к настройке Jenkins
IP адрес
моего
Ubuntu
хоста 10.15.253.223
Первым делом на нём нужно
установить Docker
Затем на Docker сервере нужно разрешить подлючения к Docker API.
Для этого нужно открыть порт 2375
(см. список стандартных TCP/UDP портов)
Также нужно открыть порты от 32768 до 60999 которые будут использоваться для агентов
(
инструкция для Ubuntu
)
sudo vi /lib/systemd/system/docker.service
# ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
sudo vi /lib/systemd/system/docker.service
sudo service docker status -l
● docker.service - Docker Application Container Engine Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled) Active: active (running) since Mon 2023-01-09 12:00:07 EET; 3min 47s ago TriggeredBy: ● docker.socket Docs: https://docs.docker.com Main PID: 7709 (dockerd) Tasks: 10 Memory: 29.9M CPU: 862ms CGroup: /system.slice/docker.service └─7709 /usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock Apr 26 06:56:10 andrei-virtual-machine dockerd[7709]: time="2023-01-09T12:00:05.488100986+02:00" level=info msg="ClientConn switching balancer to \"pick_first\"" module=grpc Apr 26 06:56:10 andrei-virtual-machine dockerd[7709]: time="2023-01-09T12:00:05.850772393+02:00" level=info msg="[graphdriver] using prior storage driver: overlay2" Apr 26 06:56:10 andrei-virtual-machine dockerd[7709]: time="2023-01-09T12:00:05.934673941+02:00" level=info msg="Loading containers: start." Apr 26 06:56:10 andrei-virtual-machine dockerd[7709]: time="2023-01-09T12:00:06.450509708+02:00" level=info msg="Default bridge (docker0) is assigned with an IP address 172.17.0.0/16. Daemon option --bip can be used to set a preferred IP address" Apr 26 06:56:10 andrei-virtual-machine dockerd[7709]: time="2023-01-09T12:00:06.689935636+02:00" level=info msg="Loading containers: done." Apr 26 06:56:10 andrei-virtual-machine dockerd[7709]: time="2023-01-09T12:00:06.990191356+02:00" level=info msg="Docker daemon" commit=20.10.12-0ubuntu4 graphdriver(s)=overlay2 version=20.10.12 Apr 26 06:56:10 andrei-virtual-machine dockerd[7709]: time="2023-01-09T12:00:06.990408478+02:00" level=info msg="Daemon has completed initialization" Apr 26 06:56:10 andrei-virtual-machine systemd[1]: Started Docker Application Container Engine. Apr 26 06:56:10 andrei-virtual-machine dockerd[7709]: time="2023-01-09T12:00:07.109669043+02:00" level=info msg="API listen on [::]:2375" Apr 26 06:56:10 andrei-virtual-machine dockerd[7709]: time="2023-01-09T12:00:07.122519364+02:00" level=info msg="API listen on /var/run/docker.sock"
Проверим, доступен ли Docker API с помощью curl
curl http://localhost:2375/version
{"Platform":{"Name":""},"Components":[{"Name":"Engine","Version":"20.10.12","Details":{"ApiVersion":"1.41","Arch":"amd64","BuildTime":"2022-03-07T15:57:50.000000000+00:00","Experimental":"false","GitCommit":"20.10.12-0ubuntu4","GoVersion":"go1.17.3","KernelVersion":"5.15.0-57-generic","MinAPIVersion":"1.12","Os":"linux"}},{"Name":"containerd","Version":"1.5.9-0ubuntu3.1","Details":{"GitCommit":""}},{"Name":"runc","Version":"1.1.0-0ubuntu1.1","Details":{"GitCommit":""}},{"Name":"docker-init","Version":"0.19.0","Details":{"GitCommit":""}}],"Version":"20.10.12","ApiVersion":"1.41","MinAPIVersion":"1.12","GitCommit":"20.10.12-0ubuntu4","GoVersion":"go1.17.3","Os":"linux","Arch":"amd64","KernelVersion":"5.15.0-57-generic","BuildTime":"2022-03-07T15:57:50.000000000+00:00"}
Проверим доступность из сети
curl http://10.15.253.223:2375/version
{"Platform":{"Name":""},"Components":[{"Name":"Engine","Version":"20.10.12","Details":{"ApiVersion":"1.41","Arch":"amd64","BuildTime":"2022-03-07T15:57:50.000000000+00:00","Experimental":"false","GitCommit":"20.10.12-0ubuntu4","GoVersion":"go1.17.3","KernelVersion":"5.15.0-57-generic","MinAPIVersion":"1.12","Os":"linux"}},{"Name":"containerd","Version":"1.5.9-0ubuntu3.1","Details":{"GitCommit":""}},{"Name":"runc","Version":"1.1.0-0ubuntu1.1","Details":{"GitCommit":""}},{"Name":"docker-init","Version":"0.19.0","Details":{"GitCommit":""}}],"Version":"20.10.12","ApiVersion":"1.41","MinAPIVersion":"1.12","GitCommit":"20.10.12-0ubuntu4","GoVersion":"go1.17.3","Os":"linux","Arch":"amd64","KernelVersion":"5.15.0-57-generic","BuildTime":"2022-03-07T15:57:50.000000000+00:00"}
Вернёмся в Jenkins и настроим облако
Теперь настроим агента с оглядкой на
Tребования:
The docker container's mapped SSH port, typically a port on the docker host, has to be accessible over network from the master. Docker image must have sshd installed. Docker image must have Java installed. Log in details configured as per ssh-slaves plugin.
Название можно придумать любое, например demo-docker-slave
Docker Image я использую свой. Код можно изучить
здесь
.
Вы можете либо использовать ссылку на мой образ andreissh/jenkins-docker-slave:latest либо
сделать свой образ, и запушить его в свой докерхаб по
инструкции
Не забудьте указать Remote File System Root. В данном примере это
/home/jenkins
Также советую задать параметр Instance Capacity. Для примера можно ограничить двумя. Если не задавать этот параметр Jenkins будет запускать столько агентов, сколько сможет. При каких-то неполадках вы обнаружите список из большого числа неактивных агентов.
В качесте Connect Method можно выбрать SSH и подключиться по паролю.
Теперь нужно создать или обновить существующее задание так, чтобы оно выполнялось на агенте
Само задание элементарное - вывести текст командой echo
После успешного завершения в логах можно увидеть, что задание было выполнено удалённо на агенте demo-docker-slave-xxxxxxxxxxxxx
id агента генерируется при создании.
Started by user andrei Running as SYSTEM Building remotely on demo-docker-slave-000gd8ottq9e0 on docker (demo-docker-slave) in workspace /home/jenkins/workspace/job_for_docker_agent [job_for_docker_agent] $ /bin/sh -xe /tmp/jenkins17605261416739110587.sh + echo Job for docker agent is done! Job for docker agent is done! Finished: SUCCESS
Добавим ещё один шаблон для докер агента. Теперь подключение будет не по SSH а с помощью JNLP
Manage Jenkins → Manage nodes and clouds → Configure Clouds → Docker Agent Template → Add Docker Template
Будем использовать образ jenkins/jnlp-slave
Старый образ jenkinsci/jnlp-slave устарел и не рекомендуется к использованию
Требования:
Jenkins master has to be accessible over network from the container.
Docker image must have Java installed.
Docker image must launch agent.jar by itself or using the EntryPoint Arguments below.
В Jenkins мастере
Configure Global Security → Agents → TCP port for inbound agents
Нужно установить Fixed 50000
Порт 50000 был заранее открыт в контейнере параметром ports в
docker-compose.yml
файле
Автоматический запуск заданий
Рассмотрим задание, которое использует репозиторий на GitHub
Первым делом нужно указать этот репозиторий.
Configure → Source Code Management → Git → Repository URL
Там же указать Credentials
Затем нужно выбрать способ, которым будет триггерится задание.
Configure → Source Code Management → Build Triggers
Для начала выберем Poll SCM
Частота выполнения проверок обновления репозитория задаётся в стиле
cron
H/5 * * * *
Затем нужно сделать коммит в репозиторий подключённый к этому заданию и подождать около пяти минут.
Started by an SCM change Running as SYSTEM Building remotely on docker_slave_ssh-000i0w2937lrg on docker_ubuntu_esxi2 (docker_slave_ssh) in workspace /home/jenkins/workspace/my_python_job The recommended git tool is: NONE No credentials specified Cloning the remote Git repository Cloning repository https://github.com/yourrepojenkins-docker-slave > git init /home/jenkins/workspace/my_python_job # timeout=10 Fetching upstream changes from https://github.com/yourrepojenkins-docker-slave > git --version # timeout=10 > git --version # 'git version 2.34.1' > git fetch --tags --force --progress -- https://github.com/yourrepojenkins-docker-slave +refs/heads/*:refs/remotes/origin/* # timeout=10 > git config remote.origin.url https://github.com/yourrepojenkins-docker-slave # timeout=10 > git config --add remote.origin.fetch +refs/heads/*:refs/remotes/origin/* # timeout=10 Avoid second fetch > git rev-parse refs/remotes/origin/master^{commit} # timeout=10 Checking out Revision f0943b9194a48bafebf77280e1a848af92c6d6c3 (refs/remotes/origin/master) > git config core.sparsecheckout # timeout=10 > git checkout -f f0943b9194a48bafebf77280e1a848af92c6d6c3 # timeout=10 Commit message: "QA: adds ! to helloworld.py" > git rev-list --no-walk 09810fbbf97a812d396aca02e50c443ce999fa8f # timeout=10 [my_python_job] $ /bin/sh -xe /tmp/jenkins8662150179336980601.sh + python3 helloworld.py Hello World! Finished: SUCCESS
Если ваше задание - это Multibranch Pipleline, то можно использовать
Configure → Scan Multibranch Pipeline Triggers → Periodically if not otherwise run → Interval
Где можно задать нужный интервал.
Эта функция может работать вместе в вебхуками из удалённого репозитория, и обычно
используется для подстраховки на случай если вебхук не сработал.
Для того чтобы вместо Poll SCM использовать Web Hook нужны более высокие права доступа к репозиторию
чем базовые. Также нужно иметь возможность указать
IP адрес
через который будет осуществляться доставка сообщения до Jenkins.
Переменные окружения
Изучить доступные переменные окружения можно на странице
http://jenkins_url/env-vars.html
Например, в моём примере это
http://jenkins.andrei.com:8080/env-vars.html/
Пример с выводом переменных окружения
BUILD_ID
и
BUILD_URL
В просто
Freestyle проекте Jenkins
напишите скрипт вида
echo "Thank you reading eth1.ru!" echo "The build ID of this job is ${BUILD_ID}" echo "The build URL of this job is ${BUILD_URL}"
Сборщики проектов
pipeline { agent any tools { gradle 'Gradle-6.2' } stages { stage("run frontend") { steps { echo 'executing yarn…' nodejs('Node-10.17') { sh 'yarn install' } } } stage("run backend") { steps { echo 'executing gradle…' sh './gradlew -v' } } } }
Jenkins | |
Установка Jenkins | |
Основы Jenkins | |
Jenkins Freestyle project | |
Jenkins Pipeline | |
Credentials | |
Задания по расписанию | |
Плагины | |
Разбор ошибок | |
DevOps | |
Docker | |
Make |