Bitbucket, Docker и tclssg
С недавних пор этот сайт генерится из markdown-шаблонов в полностью статическое содержимое (html-файлы). Делается это при помощи tcl-ssg https://github.com/tclssg/tclssg. И вот решил я на примере моего сайта показать механизм непрерывной интеграции и доставки (да, то самое CI/CD).
Т.е. генерировать html и "выкатывать" результат на сайт будем в автоматическом режиме при помощи docker и bitbucket pipelines.
Код сайта (md-файлы) "лежит" в каталоге input, т.е. структура каталогов с кодом выглядит так:
../
input/
pages/
static/
templates/
website.conf
bitbucket-pipelines.yml
README.md
pages - это и есть содержимое сайта в формате markdown static - это каталон с неизменяемыми файлами (картинки, архивы, и т.д.) templates - шаблоны website.conf - настройки для генератора (заголовок, адрес, описание, команды для деплоя, и т.д.)
У tcl-ssg богатые возможности (предварительно советую ознакомиться с документацией), но для нас сейчас важны пара команд:
ssg.tcl build input output
ssg.tcl deploy-ftp input output
Соответсвенно, сборка проекта и его "раскатывание" по ftp. Tcl-ssg на вход принимает управляющую команду (build, deploy-ftp, и т.д.) и имена каталогов.
Для ускорения сборки при изменениях в репозитории сайта (чтобы не обновлять и не ставить пакеты каждый раз) я сделал свой образ и разместил его в реестре докерхаба. Ниже приведен Dockerfile:
FROM debian:buster-slim
RUN apt-get update \
&& apt-get install -y tcl libtcl tcllib libsqlite3-tcl git
WORKDIR /home/builder
RUN git clone https://github.com/tclssg/tclssg.git
Т.е. образ будем делать на основе стандартного Debian, доустановив туда требуемые пакеты. Tclssg берем из репозитория на гитхабе.
Далее в bitbucket для нашего репозитория настраиваем pipeline. Делается это просто созданием файла bitbucket-pipelines.yml в корне репозитория:
image: svk28/tclssg:latest
pipelines:
default:
- step:
script:
- mkdir output
- /home/builder/tclssg-master/ssg.tcl build input output
- /home/builder/tclssg-master/ssg.tcl deploy-ftp input output
На этом все настройки закончены и теперь при внесении изменений в репозитарий сайт будет автоматически обновляться.