Блог Олега Сердюкова

Домашний Continuous Delivery

Одолжил на неделю-другую домой серверочек Intel NUC на i5. Давно хотел иметь дома железку для разнообразных локальных задач и экспериментов.

До этого пытался использовать Raspberry Pi, BeagleBone (обычный и Black), затем CubieBoard (на A10 и A20). Самым удачным были последние, потому как мне нужен был достаточный объём и скорость, и это достигалось подключением 2.5” HDD к SATA порту. Работать с SD Card можно, но требует терпения из-за неторопливости. Везде использовал либо Debian, либо Ubuntu, Android мне не подходил.

Однако ARM — не лучшее решение для привычных мне задач. И вроде бы Debian работает хорошо, а как доходит дело до реальной работы, то стабильность оставляет желать лучшего. Например, захотел использовать BTSync. Начал синхронизировать 5 GB — а скорость какая-то слишком медленная (на HDD). Начал разбираться, оказалось, что есть множество ошибок ext3. Кроме того оказалось, что некоторые пакеты в сборке Debian под ARM в принципе недоступны. Если я правильно помню, то столкнулся с этим, когда пытался поствить GitLab. А ещё некоторые программы просто сваливались в segfault.

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

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

Поэтому захотелось взять нормальное решение на человеческом процессоре, а не на ARM’е. Собирать полноценный компьютер не хотелось из-за шумности и габаритов, в итоге остановился на Intel NUC, пока развлекаюсь с одолженным. Операционная система - Ubuntu Server 15.04, что-то Debian Jessy не захотел ставить, привык к комфорту “из коробки”.

Первая задача, которую я сделал, это “Домашний Continuous Delivery”. Если быть откровенным, то до “Delivery” тут далеко. Даже до “Deployment” и “Integration” не дотягивает. Но цель хорошая, и название осталось.

По сути дела это автоматизация публикации блога. Я использую движок Octopress для статической генерации. Хотелось иметь возможность отвязаться от настроенной среды на ноутбуке с конкретными версиями ruby и набором gem’ов. Публиковать сайт с телефона я не собирался, упаси господь. Просто было интересно.

Схема такая:

  1. Сайт лежит на Github. Хоть с ноутбука, хоть с рабочего компьютера делаю новый файл статьи, работаю над ней, потом делаю commit и push в Github
  2. На репозитории в Github стоит webhook, посылающий запрос на домашний сервер
  3. На сервере в Docker’е стоит Jenkins с фронтендом nginx (тоже в Docker), он принимает запрос на плагин git
  4. К Jenkins подключен build-сервер (и он в Docker’е). Webhook триггерит билд, билд запускается на build-сервере
  5. В build-сервере в окружении плагинов ssh-agent и rvm запускаются задачи:
    1. cтаскивания репозитория с Github
    2. установки gem’ов Octopress
    3. генерации сайта
    4. для “Continuous Delivery” нужно было бы запустить Unit-тесты здесь, а потом после публикации провести интеграционные тесты, это “на потом”
    5. записи результатов на мой web-сервер на Digital Ocean по rsync
    6. обновления файлов изображений по rsync - каталог с картинками размером в пару GB подмонтирован как VOLUME в контейнер
    7. информирование по email о каждом (в том числе успешном) билде

Сделал push - через минуту блог обновлён. Все операции проходят достаточно быстро, те же установки плагинов при повторном запуске не начинаются с нуля.

Все docker-контейнеры запускаются автоматически из systemd при старте системы. Вот уже вторую заметку так публикую, всё в порядке.

Отвечу на вопросы, которые у вас, наверное, возникли:

  1. Почему бы просто не взять сервер на Digital Ocean и не городить огород с домашним сервером? Для комфортной работы мне нужно много памяти. Тому же GitLab нужно минимум 1 GB (512 с ограничением количества воркеров слишком нетороплив). А желание поэкспериментировать с Jenkins и другими Java-сервисами потребовало бы ещё польше места. Не хочу тратить на Digital Ocean больше $10 в месяц. А ещё хочется этот серверочек использовать для бекапов, поэтому нужно побольше дискового пространства. Внутренний диск на 750 GB (WB Black для быстроты) и NAS/NFS RAID1 на 3 TB вопрос решают.
  2. Почему не Travis? Как-нибудь попробую. Мне кажется, что могут возникнуть сложности с публикацией результатов по rsync, но могу ошибаться. В моём варианте всё работает и так хорошо.

Кстати, rtorrent+rutorrent я тоже запустил для пробы в docker, работало нормально. Но у меня дома интернет всего 100 Mbps, и со стаскиванием торрентов вполне справляется Synology. На нём скорость 6 MBps, на серверочке 11 MBps (ограничение канала), разница для меня несущественна, зато не забивается диск. NFS на серверочке пришлось запустить на уровне операционной системы, в docker’е что-то не завелось.

Comments