В предыдущей заметке мы установили 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 в котором клонирует указанный репозиторий.

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

  1. Клонирование репозитория. Выполняется автоматически
  2. submodules - запускаем контейнер alpine/git и выполняем команду git submodule update --init --recursive для установки подмодулей репозитория.
  3. build - запускаем контейнер alpine, устанавливаем необходимые библиотеки для работы hugo, скачиваем нужный релиз hugo с github, распаковываем архив и запускаем hugo для сборки блога.
  4. deploy - через переменные окружения получаем секрет с приватным ключом для пользователя от имени которого будем делать деплой на удаленный холст. Помещаем ключ в ~/.ssh/id_rsa и настраиваем права. Далее с помощью rsync заменяем на удаленном хосте код блога на тот который был собран на предыдущем шаге.
  5. 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, вводим название задачи и периодичность.

Всё, теперь достаточно написать новую заметку, сделать пуш в репозиторий и она опубликуется в блоге автоматически.