Как стать автором
Обновить

Запуск сервера сборки Jenkins

Уровень сложностиПростой
Время на прочтение8 мин
Количество просмотров14K

Итак, в вашем репозитории накопилось количество сборок превысившее число 1. Настало время задуматься о DevOps(е). В этом тексте я напишу как развернуть локальный сервер сборки на основе Jenkins.

Пролог

Зачем все это? Дело в том, что сам по себе репозиторий с кодом это Филькина грамота, если поверх кода нет работающего сервера сборки, который даст гарантию, что "это что-то" вообще хотя бы собирается компилятором без ошибок.

Потом, сами артефакты это Филькина грамота, если отсутствуют модульные тесты, которые дадут гарантию, что *.bin(ари) вообще работают.

Классический способ дать гарантию качества исходников это запустить поверх него сервер сборки. Есть множество готовых технологий для серверов сборки. Среди тех кто в теме на слуху такие программы как CircleCI, Jenkins и GitLab.

Идея проста. Сервер сборки это просто инфраструктурный прикладной процесс\утилита, который периодически запускает скрипты построения конкретных сборок и затем сохраняет результат (артефакты) в конкретную папку или архив. Обычно сервер сборки работает автономно 24/7 и собирает артефакты из репозитория с кодом сразу после новых коммитов.

Когда кому-то понадобится артефакты (прошивка), можно зайти в Web GUI и там выбирать, то, что нужно прямо как в супермаркете.

Достоинство серверов сборки

  • Всегда есть артефакт для отгрузки. Если не вчерашний, то позавчерашний.

  • Есть сортировка сборок по различным атрибутам. Размер бинаря, время сборки.

  • Сразу видны конфликты. Какие сборки с чем конфликтуют. Можно не глядя на код уже примерно понять в каком программном компоненте ошибки.

  • Можно анализировать полный лог сборки

  • Экономия времени на разработку и ускорение разработки в общем. Вам не придется больше ждать пока локально соберется код (3....7мин по 20 раз в день). Вы локально будете только редактировать код и делать коммиты. Вам даже не обязательно локально устанавливать ToolChain. Всё будет происходить на сервере сборки. Сервер сборки сэкономит вам 2...2,5 часа в день.

  • Быстрая отгрузка артефактов. Например вас попросили собрать артефакт для какой-то конкретной платы. Вы просто дадите готовый артефакт из сервера сборки.

  • Контроль прохождения модульных тестов

  • Сервер сборки нужен для контроля качества работы программистов. Тут всё просто. У хороших программистов сборки собираются, а модульные тесты проходят. У плохих программистов сборки не собираются, а тесты не проходят.

  • Простой контроль целостности репозитория

  • Азарт при разработке софтвера. Появляется желание исправить все конфликты в кодовой базе и построить по-настоящему модульный код.

Недостатки сервера сборки

  • При неправильной сборке могут переполнить жесткий диск. Всегда в настройках Jenkins Job(а) указывайте максимальное количество сборок, которое будет храниться на PC для каждой конкретной сборки. В противном случае вы просто переполните себе жесткий диск. У меня был случай как за полтора года Jenkins сохранил 79GByte артефактов и мне пришлось его сносить.

  • Желателен отдельный PC(NetTop) для работы сервера

  • Нужно вручную мышкой конфигурировать каждую сборку в Web интерфейсе

Пошаговое руководство запуска Jenkins на Win

Какой понадобится софтвер?

Программа

Назначение

*jdk-11.0.16.1_windows-x64_bin.exe

Виртуальная машина для работы сервера сборки

Notepad++.exe

Текстовый редактор для изменения конфигов

*Windows 10

Операционная система для сервера сборки

git.exe

Система контроля версий исходных кодов

gcc.exe

Компилятор С кода. Входит в состав CygWin

make.exe

Культовая утилита сборки сорцов. Входит в состав CygWin

TeamViewer.exe

Удаленный доступ к NetTop для коллективного доступа к серверу сборки

*Tor Browser

Для скачивания JDK на санкционных территориях

Chrome.exe

Браузер для просмотра таблицы сборок

*jenkins.exe

Сервер сборки

Звездочной * отмечены ключевые программные компоненты. Остальное можно и заменить альтернативами.

Фаза 1: Установка Java Runtime Environment

Дело в том, что Jenkins работает поверх виртуальной машины Java. Так сделано специально, чтобы программа была переносима между различными операционными системами. Поэтому перед установкой Jenkins надо установить Java Runtime Environment(JRE). JRE это виртуальная машина для исполнения байт-кода, который генерирует компилятор Java. JRE входит в состав Java Development Kit(JDK). Это компилятор языка Java и Java Runtime Environment.

Если у вас нет java, то консоль Windows напишет это

C:\Users\xxx>java -version
'java' is not recognized as an internal or external command,
operable program or batch file.
C:\Users\xxx>

Всю JDK можно скачать по этой ссылке

https://www.oracle.com/java/technologies/javase/jdk11-archive-downloads.html

Сразу хочу отметить, что скачивать что-либо с сайта www.oracle.com следкет через Tor браузер так как РФ у них числится санкционной территорией. Плюс нужна регистрация сайте oracle. Надо скачать файл jdk-11.0.16.1_windows-x64_bin.exe

Скачивается jdk-11.0.16.1_windows-x64_bin.exe очень долго. Порядка часа. Получив дистрибутив запускаем установку

Запоминает адрес установки C:\Program Files\Java\jdk-11.0.16.1\ Он нам пригодится при установке Jenkins.

Признаком того, что Java установилась служит сообщение версии Java

C:\Users\xxxx>java -version
java version "11.0.16.1" 2022-08-18 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.16.1+1-LTS-1)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.16.1+1-LTS-1, mixed mode)

C:\Users\xxxx>

Фаза 2: Установка Jenkins

Прежде всего Jenkins надо установить на NetTop. Допустим у вас Windows. Скачать дистрибутив можно с официального сайта https://www.jenkins.io/download/

Указываем путь установки

Надо указать, что сервер будет работало локально

Указывает порт на котором будет работать Jenkins. По умолчанию 8080

Вот тут как раз следует прописать путь к JDK. C:\Program Files\Java\jdk-11.0.16.1


Признаком работы Jenkins служит его появление в диспетчере задач

Как же открыть Jenkins? Надо в браузере и набрать этот URL

 http://localhost:8080

придется настроить Jenkins. Jenkins попросит admin password из файла C:\Program Files\Jenkins\jenkins.err.log

Также придется еще подождать пока произойдет настройка плагинов. Это примерно 30 мин.

осталось только придумать логин и пароль

Открыть браузер и указать снова URL http://localhost:8080

и вот долгожданное сообщение. Jenkins установился.

Теперь остается только наполнить сервер задачами. Тут их называют Job(ами)

Фаза 4: Создание задачи Job(а)

Как же создать Jenkins Job, первую сборку?

Открывает URL http://localhost:8080/. Нажимаем New Item,

Надо придумать название сборки.

Пишем название сборки nrf5340_dk_headset_app_cmake, выбираем Freestyle project

А вот тут очень важно. Надо активировать опцию удаления устаревших сборок (Discard old builds). Иначе Jenkins увеличит папку C:\Windows\System32\config\systemprofile\AppData\Local\Jenkins\.jenkins\jobs до запредельных размеров. У меня как-то за полтора года набралось 79 GByte артефактов.

Надо указать адрес Workspace в котором данный Job будет искать скрипты сборки. То есть заполнить поле Use custom workspace

Надо указать при каких событиях будет происходить сборка. Самое простое это сказать, что надо собирать каждые 2 часа. Написать H H/2 * * *

Надо создать команду самой сборки. Нажимаем на кнопку Add build step

При работе в Windows выбираем Execute Windows batch command

Прописываем путь к скрипту сборки относительно корня репозитория. Тут как раз важно подчеркнуть, что сборки должны инициироваться скриптом. Даже если вы собираете из-под IDE вам придется разобраться как вызывать сборку IDE(шного) проекта из скрипта.

Последний шаг это сохранить артефакты. Нажимаем Add post-build action.

и выбираем вариант Archive the artefacts

И указывает конкретные расширения, которые надо сохранить

source/projects/board_build_cmake/build/**/*.elf, source/projects/board_build_cmake/build/**/*.hex, source/projects/board_build_cmake/build/**/*.bin, source/projects/board_build_cmake/build/**/*.dts, source/projects/board_build_cmake/build/**/*.map

надо прописать это в поле Archive the artifacts

Сборка настроена. Нажимаем Save.

Чтобы инициировать сборку надо нажать на кнопку Build Now. Как видно сборка собралась.

Тут сразу появилось множество интересных метрик: длительность сборки, размер прошивки, лог сборки, *.elf файл для отладки.

После всего этого вы можете конечно написать: "я не буду пользоваться сервером сборки потому, что у меня нет отдельного компьютера, а при работе в моём Workspace работающий Jenkins будет мне только мешать".

Разруливается эта ситуация очень просто. Вы организуете на своем локальном компьютере 2 репозитория: workspace и release. Workspace для редактирования кода, а release для генерации release(ных) артефактов. Release репозиторий он, как бы, только read only. Release репозиторий пополнять только из git pull(ами). Это важно, чтобы гарантировать, что все зависимости проиндексированы и находятся в репозитории c кодом.

В идеале надо, конечно же, отдельный компьютер с сервером сборки (Зомбик), чтобы на него могли заходить все заинтересованный в артефактах: разработчики, тестировщики, интеграторы, клиенты. Общий доступ можно организовать через TeamViewer или RDP.

Вот теперь вы умеете накатывать Jenkins и можете даже учить этому других.

Возможные проблемы. (troubleshooting)
В один прекрасный день вы придете на работу откроете браузер и наберёте URL http://localhost:8080/

И у вас не откроется WEB GUI. Тут не надо предаваться судорогам конвульсиям и параличу.

Jenkins как шахматист записывает свои действия в файл C:\Program Files\Jenkins\jenkins.wrapper.log и можно проанализировать причину осечки.

Осечка в запуске сервера сборки может произойти по двум причинам.
1--При установки какой-то утилиты Вы переустановили виртуальную машину Java и теперь у вас java.exe оказался по другому пути в файловой системе. Например теперь он живёт тут
C:\Program Files\Java\jdk-11\bin\java.exe

2--TCP порт 8080 оказался занят каким-то другим приложением в операционной системе.

Можно открыть файл jenkins.xml и вручную прописать другой путь к java.exe и другой порт.

<!--
The MIT License

Copyright (c) 2004-2017, Sun Microsystems, Inc., Kohsuke Kawaguchi, Oleg Nenashev, and other Jenkins contributors

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
-->
<!--
  Windows service definition for Jenkins.

  To uninstall, run "jenkins.exe stop" to stop the service, then "jenkins.exe uninstall" to uninstall the service.
  Both commands don't produce any output if the execution is successful. 
-->
<service>
  <id>jenkins</id>
  <name>Jenkins</name>
  <description>This service runs Jenkins automation server.</description>
  <env name="JENKINS_HOME" value="%ProgramData%\Jenkins\.jenkins"/>
  <!--
    if you'd like to run Jenkins with a specific version of Java, specify a full path to java.exe.
    The following value assumes that you have java in your PATH.
  -->
  <executable>C:\Program Files\Java\jdk-11\bin\java.exe</executable>
  <arguments>-Xrs -Xmx256m -Dhudson.lifecycle=hudson.lifecycle.WindowsServiceLifecycle -jar "C:\Program Files\Jenkins\jenkins.war" --httpPort=8080 --webroot="%ProgramData%\Jenkins\war"</arguments>
  <!--
    interactive flag causes the empty black Java window to be displayed.
    I'm still debugging this.
  <interactive />
  -->
  <logmode>rotate</logmode>

  <onfailure action="restart"/>
  
  <!-- 
    In the case WinSW gets terminated and leaks the process, we want to abort
    these runaway JAR processes on startup to prevent corruption of JENKINS_HOME.
    So this extension is enabled by default.
  -->
  <extensions>
    <!-- This is a sample configuration for the RunawayProcessKiller extension. -->
    <extension enabled="true" className="winsw.Plugins.RunawayProcessKiller.RunawayProcessKillerExtension" id="killOnStartup">
      <pidfile>%ProgramData%\Jenkins\jenkins.pid</pidfile>
      <stopTimeout>10000</stopTimeout>
      <stopParentFirst>false</stopParentFirst>
    </extension>
  </extensions>
  
  <!-- See the referenced examples for more options -->
  
</service>

Затем открыть от имени администратора диспетчер задач и на вкладке Службы через контекстное меню перезапустить Jenkins.

Вывод

Надеюсь этот текст поможет сомневающимся начать практики коллективной разработки софтвера и развернуть соответствующий DevOps для этого. Пользуйтесь серверами сборки. В этом нет, ровным счетом, ничего сложного.

Links

https://www.jenkins.io/doc/book/installing/windows/

https://www.dmosk.ru/miniinstruktions.php?mini=jenkins-ubuntu

https://habr.com/ru/companies/southbridge/articles/741358/

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Вы пользуетесь серверами сборки?
80.95% да34
19.05% нет8
Проголосовали 42 пользователя. Воздержались 5 пользователей.
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Вы пользуетесь Jenkins?
68.75% да33
31.25% нет15
Проголосовали 48 пользователей. Воздержались 5 пользователей.
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
У вас сервер сборки работает локально?
27.27% да9
72.73% нет24
Проголосовали 33 пользователя. Воздержались 8 пользователей.
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
У вас сервер сборки работает удаленно?
83.87% да26
16.13% нет5
Проголосовал 31 пользователь. Воздержались 7 пользователей.
Теги:
Хабы:
Всего голосов 10: ↑3 и ↓7-3
Комментарии23

Публикации