· блог деплой hugo gitlab gitlab ci

Деплой блога на Hugo с использованием Gitlab CI

В связи с прошлым постом и переездом с плагина hugo для Caddy на “самодеплой” решил я сделать автодеплой блога после коммита в Git. Сделать это можно двумя способами:

  • С помощью git хуков
  • С помощью Gitlab CI.

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

Так как я использую Gitlab, я решил сделать тестирование генерации блога и его деплой с помощью Gitlab CI. Итак, приступим.

ВНИМАНИЕ: данный метод будет работать, скорее всего, только на вашем личном инстансе Gitlab. На gitlab.com и прочих публичных инстансах этот метод не проверялся!

Для Gitlab CI необходимо создать в корне вашего репозитория файлик .gitlab-ci.yml. Например, мой файл имеет следующее содержимое:

# Stages.
stages:
  - build
  - deploy

# Blog build.
hugo_build:
  stage: build
  script:
    # Get Hugo release binary.
    - wget https://github.com/gohugoio/hugo/releases/download/v0.32.3/hugo_0.32.3_Linux-64bit.tar.gz -O /tmp/hugo.tar.gz
    - tar -xf /tmp/hugo.tar.gz -C /tmp
    - cp /tmp/hugo ~/.go/workspace/bin
    - chmod +x ~/.go/workspace/bin/hugo
    # Build blog
    - ~/.go/workspace/bin/hugo

# Blog deploy
blog_deploy:
  stage: deploy
  script:
    # Build blog
    - ~/.go/workspace/bin/hugo
    - ssh pztrn@192.168.1.2 'rm -rf /srv/www/pztrn.name/@/public'
    - scp -r public pztrn@192.168.1.2:/srv/www/pztrn.name/@/
    - rm -rf public
    - rm /tmp/hugo /tmp/hugo.tar.gz /tmp/LICENSE.md /tmp/README.md

Итак, по порядку:

  • stages - указываем, какие этапы у нас есть. У меня используется только build и deploy, однако вам может быть удобнее переименовать build в test.
  • hugo_build - список команд, которые исполняются на этапе build.
  • blog_deploy - список команд, которые исполняются на этапе deploy.

Build.

На этапе build мой скрипт выкачивает релиз Hugo (а вдруг какой-то плохиш бинарь побил/подменил? :D), распаковывает архив, копирует файл в Go’шный workspace и просто собирает (генерирует HTML’ки) блог. Если этот этап успешен, значит я нигде в шаблонах, страницах и блогопостах не накосячил, что возможно и что легко пропустить в выводе hugo server.

Если этот этап успешен - переходим к deploy.

Deploy.

На этапе deploy Gitlab опять сгенерирует бложик, ибо при переходе между этапами все левые файлы и директории из склонированного репозитория вычищаются, после чего удалит на удаленном сервере старый блог и с помощью scp скопирует только что сгенерированные HTMLки и прочие файлы. После успешного копирования скрипт за собой подчищает.

Защита Gitlab Runner’a

У меня Gitlab Runner (который используется CI для, собственно, CI и CD), для обеспечения безопасности, “залочен” только на определенные проекты. Это позволяет мне держать публичный инстанс Gitlab и не опасаться, что кто-то меня понюкает. Видели “ВНИМАНИЕ” выше? Вполне вероятно, что gitlab.com не даст вам протащить бинарь Hugo в их систему для генерации блога. Поэтому я рекомендую делать это только на своем инстансе Gitlab.

ToDo.

Естественно, этот скрипт неидеален, хоть он и работает. Из явных проблем я бы хотел порешать очистку левых файлов, но это дело будущего.

Мааааленькое резюме.

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

И да, еще раз:

ВНИМАНИЕ: данный метод будет работать, скорее всего, только на вашем личном инстансе Gitlab. На gitlab.com и прочих публичных инстансах этот метод не проверялся!

(а еще вас могут забанить за то, что притащили левые бинари в чужую систему)

  • LinkedIn
  • Tumblr
  • Reddit
  • Google+
  • Pinterest
  • Pocket