В предыдущей заметке мы установили Drone CI, в этой настроим автоматическую сборку и публикацию блога при пуше в git-репозиторий.
После настройки Drone и авторизации в нем вы должны увидеть доступные вам репозитории. Для того чтобы Drone начал обрабатывать пайплайны необходимо активировать репозиторий. Для это в секции Repositories
заходим в нужный репозиторий и нажамаем Activate repository
. На странице настроек можно отключить вебхуки которые будут отслеживаться, настроить режим приватности, максимальное время выполнения пайплайна и название файла в котором Drone будет искать описание пайплайна (по умолчанию .drone.yml). Нажимаем Save changes
.
Дальше практически все настройки делаются в .drone.yml. Файл описывает последовательность шагов которые вы хотите выполнить. Если один из шагов завершился неудачно - пайплайн прерывается с ошибкой. Если вам необходимо выполнить какой-то шаг в любом случае, например для отправки уведомлений о результатах сборки, - можно указать дополнительные условия для конкретного шага.
Приведу простой пайплайн для блога публикации блога hugo:
kind: pipeline
type: docker
name: default
platform:
os: linux
arch: amd64
steps:
- name: submodules
image: alpine/git
commands:
- git submodule update --init --recursive
- name: build
image: alpine
commands:
- apk add --no-cache libc6-compat libstdc++ npm
- wget -qO- https://github.com/gohugoio/hugo/releases/download/v0.110.0/hugo_extended_0.110.0_Linux-64bit.tar.gz | tar xzv -C /usr/local/bin hugo
- hugo
- name: deploy
image: alpine
environment:
HOST: blog.example.ru
USER: droneci
WEB_DIR: /var/www/blog.example.ru/
SSH_KEY:
from_secret: ssh_key
commands:
- apk add --no-cache rsync openssh
- mkdir ~/.ssh/
- chmod 0700 ~/.ssh
- echo -e "$SSH_KEY" > ~/.ssh/id_rsa
- chmod 0600 ~/.ssh/id_rsa
- echo StrictHostKeyChecking no >> ~/.ssh/config
- chmod 0600 ~/.ssh/config
- rsync -rvzc --chmod=g=rwX --delete public/ $USER@$HOST:$WEB_DIR
- name: telegram notification
image: appleboy/drone-telegram
settings:
token:
from_secret: telegram_token
to:
from_secret: telegram_to
format: markdown
when:
status:
- success
- failure
message: >
{{#success build.status}}
✅ Build #{{build.number}} of `{{repo.name}}` succeeded.
📝 Commit by {{commit.author}} on `{{commit.branch}}`:
```
{{commit.message}}
```
🌐 {{ build.link }}
{{else}}
❌ Build #{{build.number}} of `{{repo.name}}` failed.
📝 Commit by {{commit.author}} on `{{commit.branch}}`:
```
{{commit.message}}
```
🌐 {{ build.link }}
{{/success}}
Этот пайплайн состоит из 4 шагов, но при его выполнении будет выполнено 5, т.к. в начале каждого пайплайна drone автоматически создает еще один под названием Clone в котором клонирует указанный репозиторий.
Каждый шаг в пайплайне запускает отдельный контейнер к которому подключается том с клонированным репозиторием, где вы можете совершать какие-то действия с вашим кодом: компилировать, запускать тесты и т.д. В данном примере выполняется следующее:
- Клонирование репозитория. Выполняется автоматически
- submodules - запускаем контейнер alpine/git и выполняем команду
git submodule update --init --recursive
для установки подмодулей репозитория. - build - запускаем контейнер alpine, устанавливаем необходимые библиотеки для работы hugo, скачиваем нужный релиз hugo с github, распаковываем архив и запускаем hugo для сборки блога.
- deploy - через переменные окружения получаем секрет с приватным ключом для пользователя от имени которого будем делать деплой на удаленный холст. Помещаем ключ в
~/.ssh/id_rsa
и настраиваем права. Далее с помощью rsync заменяем на удаленном хосте код блога на тот который был собран на предыдущем шаге. - telegram notification - отправляем уведомление в ТГ о результатах сборки.
Теперь при новом пуше drone будет прогонять сборку и публикацию блога.
Секреты
Тут важно обратить внимание, что в пайплайне может использоваться чувствительная информация такая как токены, пароли и ключи. В drone существует специальный механизм для хранения подобной информации под названием Secrets. Вы можете устанавливать параметры или переменные окружения используя секреты и далее использовать эти переменные в ваших командах и скриптах, но вы не сможете вывести их в консоль, drone будет отслеживать попытки вывода чувствительной информации и скрывать её. Секреты могут быть глобальными и локальными для каждого отдельного проекта.
Для создания секрета надо перейти в настройки проекта в раздел Secrets. Далее жмем New secret, указываем имя и содержимое секрета и жмем Create. В пайплайне устанавливаем переменную окружения. Например так:
environment:
SSH_KEY:
from_secret: ssh_key
Отложенная публикация в Hugo
Я хотел иметь возможность планировать время публикации записей блога как это можно делать в том же wordpress.
В постах hugo есть возможность указать дату и время поста (date) в будущем, при сборке блога hugo проверяет дату и время и если они еще не наступили - исключает пост из сборки (при необходимости можно принудить делать сборки и таких постов ключом -F, –buildFuture). Но как запустить пайплайн в нужное время? Самый простой способ - настроить Cron Jobs
доступный в drone, который будет запускать пайплайн с определенной периодичностью. Самый маленький период запуска - раз в час, для моих задач такая точность достаточна. Если вам надо запускать задачи в более точное время - можно использовать Drone CLI для запуска задач из внешних систем.
Чтобы настроить cron заходим в настройки проекта, далее в разделе Cron Jobs
нажимаем New Cron Job
, вводим название задачи и периодичность.
Всё, теперь достаточно написать новую заметку, сделать пуш в репозиторий и она опубликуется в блоге автоматически.