Упрощение публикации статического сайта

17 November 2013 #jekyll #server #git

О недостатках Jekyll мы уже говорили, теперь давайте рассмотрим, как можно перенести процесс генерации сайта на рабочий сервер.

Во-первых, сделать это можно и совершенно бесплатно. Достаточно размещать код своего сайта на Github, а генерацию производить с использованием Travis CI, с последующей публикацией результата на Github Pages.

Во-вторых, если используется свой сервер, можно генерировать сайт непосредственно с его помощью. Это вариант сейчас и рассмотрим.

Post-Receive Hooks

Для оповещения сервера о проведенных изменениях в репозитории кода используется Post-Receive Hooks. Довольно долго и безрезультатно пытался найти что-нибудь работоспособное для использования триггеров, пока наконец, не наткнулся на разработку Александра Соловьева под названием Webhooker. Устанавливаем Golang:

$ sudo apt-get install python-software-properties  # 12.04
$ sudo add-apt-repository ppa:duh/golang
$ sudo apt-get update
$ sudo apt-get install golang
$ echo 'export GOPATH=$HOME' >> ~/.profile
$ echo 'export PATH=$PATH:$GOPATH/bin' >> ~/.profile

Теперь устанавливаем сам Webhooker:

$ go get github.com/piranha/webhooker

По привязке webhooker к nginx есть описание на официальной странице приложения, поэтому в данной статье я останавливаться на этом моменте не буду. Расскажу лишь об автоматизации запуска Webhooker при старте системы. Александр предлагает использовать для запуска и мониторинга его состояния работы Supervisor. Но я нашел использование Upstart в Ubuntu наиболее приемлемым вариантом, тем более, что он сейчас используется в системе по умолчанию.

Необходимо создать файл конфигурации /etc/init/webhook.conf в котором прописываем всего несколько строк:

description	"Webhook for Gihub"

start on startup
stop on shutdown

console none
respawn

exec su usename -c "~/bin/webhooker -p 5010 -i 127.0.0.1 -c ~/hooks/webhook.conf"

Теперь для запуска достаточно дать команду:

$ sudo start webhook

Для остановки:

$ sudo stop webhook

Файл ~/hooks/webhook.conf я использую для описания правил работы триггеров, и если правило всего одно, его можно прописывать непосредственно в строке запуска. На данный момент в файле ~/hooks/webhook.conf у меня одна строка:

Juev/juev.ru:master='/home/username/hooks/juevru.sh'

Александр задумывал использовать триггеры для запуска нескольких команд максимум, и при этом использует для запуска командный интерпретатор sh. А так как у меня на сервере используется Ruby, установленный с использованием rbenv, то приходиться запускать целый скрипт, в котором помимо запуска команд, необходимо еще установить рабочее окружение:

#!/bin/bash
export LANG="en_US.UTF-8"
export LC_ALL="en_US.UTF-8"
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"

cd ~/Projects/juev.ru
git pull
rake
rsync -az --delete public/ ~/web/juevru/

Хочу обратить внимание на тот факт, что генерация сайта производиться во временной директории. И только по окончанию работы осуществляется синхронизация этой временной директории с рабочим каталогом веб-сайта с использованием команды rsync. Это позволяет избежать моментов отсутствия страниц на сайте во время генерации.

Теперь для публикации статьи достаточно будет получить доступ к веб-браузеру, в котором с использованием веб-редактора файлов создаем статью, а публикация будет проведена автоматически после сохранения результатов работы.

Единственная проблема, которая остается при использовании Jekyll – это работа с изображениями. Влад Гороховский предложил вариант решения в статье Автоматизация обработки картинок, но он использует для этого одновременно несколько довольно дорогих программ, что делает публикацию возможной только при использовании своего компьютера, что не всегда возможно.

Но уже сейчас работать с Jekyll стало гораздо проще.