Давным давно, в далёкой-далёкой галактике у меня уже был недобложек.
Представлял он из себя wordpress, поднятый на бесплатном хостинге, тормозил и в целом перестал меня удовлетворять, как только из недобложика, служащего определённой цели я попытался сделать просто личный недобложик.
В итоге назрела необходимость его переделать, принципиальным в которой был только один пункт: держать новый я хотел на Github Pages. Впрочем на пути стояло одно препятствие. Я не люблю web. Не люблю, не понимаю и никогда полноценно не занимался. Однако, хэй! Есть же генераторы статических веб-сайтов. Первый раз я ткнулся в Madoko. Миленько, гибрид $\LaTeX$ и Markdown, но поднять его у меня не получилось. К счастью, вторая попытка сработала в разы лучше. Познакомьтесь с Hugo.
Hugo - это статический генератор сайтов, написанный, как легко можно понять, на Golang. Из плюсов: с ним просто работать, если умеешь во что-то в вебе. Из больших плюсов: с ним просто работать, если не особо умеешь во что-то в вебе.
Теперь о процессе
Я поднимал всё это добро под Windows по весьма простой причине: Linux на текущей рабочей машине у меня на данный момент отсутствует. Для этого мне понадобились:
- Сам Hugo;
- Неплохая тема с поддержкой MathJax (частично $\LaTeX$) и весьма приличным видом;
- Скрипты для деплоя на личную страницу от этого чувака. Их я, впрочем, слегка подредачил;
- Очевидно, аккаунт на GitHub;
- Git. Вроде этот.
Саму схему реализации можно подсматривать вот тут. Разберёмся, что есть что:
- Hugo генерирует сайтик по содержимому репозитория в папку
public; - Вот здесь лежит тема;
- В конфиге прописана она и ещё кое-какая информация;
- Вот так выглядит первый пост;
- Вот здесь лежит всё то добро, которое потом попадает в корень сайта;
- Вот этот скрипт инициализирует репозиторий.
- Вот этот обновляет версию сайта.
Теперь, когда всё это разложено по полочкам, можно разобраться со скриптами от славного Hjdskes.
Первый
#!/usr/bin/env bash
# This script does the required work to set up your personal GitHub Pages
# repository for deployment using Hugo. Run this script only once -- when the
# setup has been done, run the `deploy.sh` script to deploy changes and update
# your website. See
# https://hjdskes.github.io/blog/deploying-hugo-on-personal-github-pages/index.html
# for more information.
# GitHub username
USERNAME=timecatler
# Name of the branch containing the Hugo source files.
SOURCE=hugo
msg() {
printf "\033[1;32m :: %s\n\033[0m" "$1"
}
msg "Deleting the \`master\` branch"
git branch -D master
git push origin --delete master
msg "Creating an empty, orphaned \`master\` branch"
git checkout --orphan master
git rm --cached $(git ls-files)
msg "Grabbing one file from the \`$SOURCE\` branch so that a commit can be made"
git checkout "$SOURCE" README.md
git commit -m "Initial commit on master branch"
git push origin master
msg "Returning to the \`$SOURCE\` branch"
git checkout -f "$SOURCE"
msg "Removing the \`public\` folder to make room for the \`master\` subtree"
rm -rf public
git add -u
git commit -m "Remove stale public folder"
msg "Adding the new \`master\` branch as a subtree"
git subtree add --prefix=public \
https://github.com/$USERNAME/$USERNAME.github.io.git master --squash
msg "Pulling down the just committed file to help avoid merge conflicts"
git subtree pull --prefix=public \
https://github.com/$USERNAME/$USERNAME.github.io.git master- Удаляет ветку
master; - Создаёт пустую ветку
master; - Создаёт стартовый коммит из
README.mdи пушит его в репозиторий; - Возвращается на исходную ветку (в нашем случае
hugo); - Удаляет папку
public; - Делает хитрый финт ушами, в результате которого папкой
publicстановится веткаmaster; - Вытягивает из репозитория стартовый коммит ветки
master.
Для чего это нужно? Личные сайты хранятся в корне ветки master.
Весь этот грязный хак позволяет хранить сырцы в одной ветке (например hugo), а готовый сайт в ветке master.
Второй
#!/usr/bin/env bash
# This script allows you to easily and quickly generate and deploy your website
# using Hugo to your personal GitHub Pages repository. This script requires a
# certain configuration, run the `setup.sh` script to configure this. See
# https://hjdskes.github.io/blog/deploying-hugo-on-personal-github-pages/index.html
# for more information.
# Set the English locale for the `date` command.
export LC_TIME=en_US.UTF-8
# GitHub username.
USERNAME=timecatler
# Name of the branch containing the Hugo source files.
SOURCE=hugo
# The commit message.
MESSAGE="Site rebuild $(date)"
msg() {
printf "\033[1;32m :: %s\n\033[0m" "$1"
}
msg "Pulling down the \`master\` branch into \`public\` to help avoid merge conflicts"
git subtree pull --prefix=public \
https://github.com/$USERNAME/$USERNAME.github.io.git origin master -m "Merge origin master"
msg "Building the website"
hugo
msg "Pushing the updated \`public\` folder to the \`$SOURCE\` branch"
git add public
git commit -m "$MESSAGE"
git push origin "$SOURCE"
msg "Pushing the updated \`public\` folder to the \`master\` branch"
git subtree push --prefix=public \
https://github.com/$USERNAME/$USERNAME.github.io.git master- Вытягиваем ветку
masterв папкуpublic, чтобы избежать конфликтов; - Пересобираем сайт;
- Пушим обновлённый сайт в исходную ветку (в нашем случае
hugo); - Пушим обновлённый сайт в ветку
master.
Всё. Вот такая вот прелесть.
upd 28.05.2018
Сайт переехал на Gitlab Pages и большая часть текста выше попросту не нужна.
Дело в том, что у Gitlab в отличие от Github размещение статичных сайтов происходит несколько умнее.
Они используют приёмы непрерывной интеграции и собирают через докер сайт, а затем хостят результат сборки.
Так что место этой кучи костылей занял этот файл конфигурации.
В нём, кстати, тоже есть костыль, чтобы тема нормально работала, но он не настолько грязный.