Jenkins: build, install, test, notify: Чеклист

…или как при помощи дворецкого приготовить суп из змей, скорлупы и капельки кофе.

Прежде чем готовить кастрюлю

Воскресный вечер, туманище за окном, а дома тепло и уют. Дело портило только пустое брюхо, которое отчаяно хотелось наполнить чем-то съедобным. В холодильнике было найдено множество недогрызенных ранее остатков колбасы, сыра, кетчупа и прочих компонентов, поотдельности сложно усвояемых. Было решено сделать пиццу, как наиболее простой вариант «собрать всё вместе и будет вкусно» за небольшое количество времени.

Примерно к концу поглощения кулинарного творения, вдруг пришло понимание, в каком ключе стоит рассказать о том, как избавиться от противного ощущения в животе, когда дело доходит до очередного момента сборки пакета.

Эта статья является вводной к серии, в которой будут описаны опорные шаги для построения цепочки, способной по клику собрать, установить, протестировать пакет, а затем, еще и уведомить об этом. В процессе будут небольшие отвлечения, с описанием очевидных граблей и скрытых хинтов, которые помогут вам не оступиться и сэкономить чуточку времени.

Статьи из этой серии:

  • [Рубим скорлупу] - билд пакета, установка на машину
  • [Чистим змей] - быстрое прототипирование и python
  • [Варим кофе] - есть место и для java
  • [Смешиваем] - как все это превратить в цепочку

Нам потребуется

  1. Дворецкий. Дворецкого зовут Jenkins. Jenkins - это свободный продукт, с огромным и развитым коммьюнити. Много рассказывать про него не буду, так как общей информации про него более чем достаточно. В двух словах - это CI сервер, с плагинной архитектурой, который благодаря им, умеет делать почти всё. Если чего то еще не умеет - значит просто никто не заставлял его готовить суп вроде нашего, и просто-напросто не добавил своих плагинчиков в коллекцию. О необходимых плагинах для нашей цели, я расскажу в процессе готовки. Их полный список можно будет найти в заключительной статье.
  2. [Скорлупа][shell]. Тут речь идет о shell-скриптах. Ничего сложного - азы. awk, grep, sed
  3. [Змеи][snakes]. Самым простым способом быстрого прототипирования для нас оказался Python. Дженкинс - это java продукт, и плагины для него пишутся на java. Но разработка плагина без особой тренировки - это сложный процесс, и о нем обязательно будут статьи позже (когда научимся сами ^_^). На питоне же, оказалось довольно быстро поднять черновую реализацию любого функционала, который существующие плагины решить не смогли. В статье «[Варим кофе][coffee]» есть небольшой хинт, о том как быстро состряпать прототипчик на java, не прибегая к написанию плагина.
  4. [Кофе][coffee]. По причине, указанной выше, приглядности и легкости конфигурации составных частей отдельных шагов, питоновским скриптам не догнать плагины. Кроме того, бывает масса плагинов, реализующих 95% функций. А тебе нужно лишь оставшиеся 5% - тогда гораздо легче подпилить существующий плагин. Благо это опенсорс и все доступно. Конечно, бывают и случаи, когда плагины содержат баги (да-да, их тоже пишут люди). Здесь уж приходится вооружаться дебаггером и править код. Можно конечно просто завести issue и ждать фикса, но тогда решение этой проблемы может затянуться, а мы же хотим быстрое решение? Да к тому же контрибьют - это отличный шанс потренироваться в написании тестиков к чужому коду и получить славу и известность.

Разжигаем огонь, наливаем воду

Сперва, нужно определиться со структурой. Очевидно, что когда делаешь много действий, нужно закладывать запас гибкости в конструкцию. Каждую толику работы нужно совершать отдельно и независимо. Тогда в случае поломок будет всегда легко определить, где течь, и что нужно делать чтобы ее устранить.

Хозяйке на заметку:

Если ваш дворецкий уже делает много-много всего, стоит присмотреться к плагинам, организующим внешний вид ваших джоб. Мы использовали плагин Nested View. После создания, он предлагает добавить в себя другие, более простые (или более сложные) виды. Клацаем по ссылке сбоку «Новый вид» и добавляем другие виды. В конце концов, можно получить аккуратную разбивку по папкам:

вид по папочкам - nested view

У нас, для простоты описания, будет 4 джобы (в терминах jenkins). Первая будет собирать пакет, вторая ставить его на машинку, третья запускать тесты, четвертая - информировать обо всем окружающих. При этом все будут идти последовательно, кроме четвертой, которая будет инициироваться каждой.

build-pack
|     └── notify-by-tracker 
install-pack
|     └── notify-by-tracker
run-tests
      └── notify-by-tracker

Нужно не забыть

Чтобы удобнее всего организовать процесс, на каждой машинке, куда нужно ходить дженкинсу, лучше завести специального пользователя jenkins, и прописать ему ключ, секретная часть которого хранится на мастере. Тогда можно будет без опаски управлять правами, а самому дженкинсу без проблем оперировать текущим воркспейсом - для этого он создаст в своей домашней папке workspace директорию, и в ней, для каждой джобы подкаталог.

Немного о sudo

Не очень понятно, насколько хорошая практика давать судо без пароля на установку пакета дворецкому, но у нас - виртуальное изолированное окружение, с четкими доступами к каждой машине, а сам пользователь jenkins не имеет пароля, только ключ. Дженкинсу разрешили делать судо без пароля, отредактировав файл /etc/sudoers:

   #-----  jenkins  -----#
   jenkins ALL, ALL = NOPASSWD: /usr/bin/yum clean metadata
   jenkins ALL, ALL = NOPASSWD: /usr/bin/yum install *
   jenkins ALL, ALL = NOPASSWD: /bin/rpm --verify *
   jenkins ALL, ALL = NOPASSWD: /usr/bin/yum remove *
   jenkins ALL, ALL = NOPASSWD: /usr/bin/yum list *
   #-----  jenkins  -----#