🛠 Laminar: примитивный сервер Continuous Integration
Тот самый случай, когда от отчаяния начал изобретать очередной среднемасштабный велосипед, но остановился на полпути из-за вовремя найденной подходящей альтернативы. Laminar CI — редкий в нынешнее время написанный на C++ проект, состоящий из простого сервера и ещё более простого клиента. Установка и настройка в действительности занимает не дольше пяти минут.
Прежде всего опишу свои требования к серверу CI:
- Простая установка: сейчас этот вопрос почти полностью и повсеместно закрыт благодаря Docker и его публичному Container Registry, в суровой же реальности же может потребоваться закатить вручную не одно солнце чтобы разобраться в хитросплетении переменных окружения для правильного запуска контейнера, не говоря уже о подключении и настройке базы данных. Laminar же требует настроить всего три параметра для корректной работы(все три из которых можно оставить значениями по умолчанию): хост/порт веб-интерфейса, директория с данными сервера и адрес RPC-сокета для клиента. Такой незамысловатый конфиг позоляет получить рабочий инстанс всего за одну минуту.
- Простой интерфейс: тут проекты, тут джобы, тут логи. Логи, кстати, цветные. Опять же чек по всем пунктам.
- Возможность расширенного скриптинга: тут мою свободу никто не ограничивает. Всё, что Laminar от меня требуется — это положить в директорию проекта запускаемый файл, который может быть также симлинком на какой-то общий для всех скрипт. Да, конечно у меня не будет красивых интерактивных пайплайнов с кнопочками, моргалочками и бейджиками, но для моих линейных проектов оно не сильно-то и надо
В итоге у меня удалось скрестить Laminar и Gitea и заставить их работать вместе на одной машине.
В каждом проекте в хуке post-receive
у меня лежит такой скрипт:
#!/usr/bin/env bash
ln -sf /usr/local/bin/laminar.run /var/lib/laminar/cfg/jobs/${GITEA_REPO_NAME}.run
export LAMINAR_HOST="10.0.0.6:28001"
JOB_ID=$(laminarc queue ${GITEA_REPO_NAME} REPO_NAME=${GITEA_REPO_NAME})
echo "Watch your job status at https://ci.domain.tld/jobs/$(echo ${JOB_ID} | sed 's/:/\//g')"
В скрипте же /usr/local/bin/laminar.run
у меня записано следующее:
#!/usr/bin/env bash
set -e
if [[ ${REPO_NAME} = 'blog' || ${REPO_NAME} = 'rcmd.space' ]]; then
git clone git@git.rcmd.space:rcmd/${REPO_NAME}.git
else
git clone --depth 1 git@git.rcmd.space:rcmd/${REPO_NAME}.git
fi
cd ${REPO_NAME} && sudo /usr/bin/make
Каждый проект у меня начинается с мейкфайла, но далеко не каждый проект нуждается в полном копировании истории.
В планах сделать возможной сборку на удалённых машинах, но пока что я очень доволен и тем, что есть.
Tue, 9 Feb 2021 16:24:24 +0300