Домашний 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«ов. Публиковать сайт с телефона я не собирался, упаси господь. Просто было интересно.

Схема такая:

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

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

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

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

Полный текст статьи читайте на TheAppleGeek