Установка и настройка Drone в Ubuntu 20.04

Drone – это популярная система непрерывной интеграции, написанная на Go. Она может взаимодействовать с файлами YAML, JSON, JSONNet или Starlark, которые определяют несколько конвейеров сборки, состоящих из нескольких этапов.

Drone поддерживает интеграцию с платформами для управления исходным кодом. На данный момент их три: GitHub, BitBucket и Gitea. В целом, каждая платформа поддерживает все функции Drone.

Drone также поддерживает различные runner-серверы для выполнения задач. Эти runner-серверы не взаимозаменяемы (за исключением простейших конвейеров), поскольку они используют разные форматы конфигурации, функции и среды выполнения. Вот краткий список доступных вариантов:

  • Во-первых, есть два runner-сервера для работы с контейнерами:
    • Docker Runner – самый стабильный и наиболее часто используемый runner-сервер. Он выполняет каждый этап сборки в новом контейнере.
    • Kubernetes runner – это более новый (но еще экспериментальный) вариант. Его синтаксис похож на синтаксис Docker runner.
  • Во-вторых, есть два runner-сервера, которые запускают команды напрямую, без изоляции между сборками или репозиториями:
    • Exec runner выполняет команды непосредственно на хосте. Этот runner не обеспечивает изоляцию между сборками и должен работать только с доверенными репозиториями, которые не подходят для работы в Docker (прежде чем прибегать к этой опции, вы можете рассмотреть возможность использования привилегированных контейнеров Docker).
    • SSH runner похож на Exec, но он запускает команды через SSH на отдельном хосте (не там же, где запущен сам runner).
  • В-третьих, есть два runner-сервера, которые обрабатывают этапы сборки на облачной виртуальной машине. Они подходят для обслуживания рабочих нагрузок, которые должны выполняться непосредственно на хосте, но при этом быть изолированы друг от друга:
    • DigitalOcean runner создает новый сервер для каждой сборки и запускает на нем команды. Обратите внимание: если вам нужны только функции масштабирования, вы можете использовать Docker Runner, но с включенным автомасштабированием (подробнее об этом позже).
    • MacStadium runner позволяет выполнять сборку на облачных машинах MacOS. Этот вариант подходит только для специализированных рабочих нагрузок.

В этом мануале вы узнаете, как настроить сервер непрерывной интеграции Drone для обработки исходного кода на GitHub, добавить Docker runner, защитить сервер с помощью Let’s Encrypt, а затем создать конвейер YAML. Также мы рассмотрим масштабирование runner-а с помощью Drone Autoscaler и хранение логов на S3-совместимом сервере.

Требования

  • Сервер Ubuntu 20.04 (1ГБ RAM, 2ГБ свободного дискового пространства), а также пользователь с доступом к sudo и включенный брандмауэр (все инструкции вы найдете здесь).
  • Домен или поддомен с записью А, направленной на IP-адрес вашего сервера. В этом мануале мы используем условный домен drone.your_domain.
  • Установка Docker (Drone в основном распространяется как образ Docker). Читайте Установка и использование Docker в Ubuntu 20.04.
  • Настроенное s3-совместимое хранилище. Если у вас нет такой необходимости, просто пропустите раздел 3. Однако имейте в виду: пропускать этот раздел рекомендуется только в том случае, если вы не используете Drone в производстве (а только пробуете работать с ним) или если вы знаете наверняка, что сборка будет небольшая.
  • Аккаунт GitHub.
Система непрерывной интеграции Drone отлично заработает на VPS от 8HOST всего от 4 евро в месяц!

Примечание: Функция Drone Autoscaler позволяет автоматически создавать и удалять облачные серверы, но она доступна не для всех облачных провайдеров. Если Drone Autoscaler не поддерживает вашего провайдера или же вы решите не устанавливать функцию, вам понадобится как минимум еще 2 ГБ RAM и 10 ГБ свободного дискового пространства, чтобы вы могли запускать конвейеры.

1: Создание приложения на GitHub

Для доступа к коду, аутентификации пользователей, добавления веб-хуков и получения событий Drone требуется приложение OAuth для GitHub.

Примечание: Если вы используете другую платформу, ищите инструкции по этой ссылке.

Чтобы настроить приложение OAuth на GitHub, откройте свой аккаунт GitHub. Откройте меню в верхнем правом углу и выберите Settings. В меню слева выберите категорию Developer Settings. Найдите элемент OAuth applications. Также вы можете просто перейти на эту страницу.

Теперь создайте новое приложение. Для этого кликните New OAuth App в верхнем правом углу, после чего вы увидите регистрационную форму приложения OAuth:

Application name:
Drone
Homepage URL:
drone.your_domain
Application description:
A Drone CI/CD for your_domain
Authorization callback URL:
drone.your_domain/login

Примечание: Формы других провайдеров могут отличаться.

В качестве имени приложения укажите Drone. Вместо drone.your_domain укажите свой домен, добавьте краткое описание своего приложения, а в поле Authorization callback URL введите drone.your_domain/login.

Нажмите Register application, и вы увидите панель, содержащую информацию о вашем приложении. Здесь указаны Client ID и Client Secret вашего приложения. Скопируйте здесь Client ID и Client Secret: эти значения нужны для подключения Drone к аккаунту GitHub. На следующих этапах мануала их нужно указывать вместо your_github_client_id и your_github_client_secret.

Теперь, когда ваше приложение зарегистрировано на GitHub, можно приступать к настройке Drone.

2: Создание конфигурации Drone

Теперь нужно подготовить конфигурации Docker, которые соберут сервер Drone. Во-первых, сгенерируйте общий секретный ключ для аутентификации runner-ов с помощью основного экземпляра Drone. Создайте его с помощью команды openssl:

openssl rand -hex 16

openssl сгенерирует случайное 16-битное шестнадцатеричное число. Результат будет примерно таким:

918...46c74b143a1719594d010ad24

Скопируйте полученный вами вывод в буфер обмена. Мы будем использовать его в следующей команде (вместо your_rpc_secret).

Теперь создайте конфигурационный файл Drone. Чтобы постоянно не открывать и закрывать этот файл, мы будем использовать команду tee: она вернет вывод вашей команды на консоль, а также добавит его в конфигурационный файл Drone. После каждого блока команд в этом руководстве мы даем его разбор, но вы можете самостоятельно найти подробное описание всех доступных параметров Drone в официальной документации.

Теперь приступайте к созданию конфигурации вашего сервера Drone. Скопируйте следующую команду в свой терминал. Обязательно замените drone.your_domain своим доменом. Также замените your_github_client_id и your_github_client_secret своими учетными данными GitHub OAuth, а вместо your_rpc_secret укажите вывод вашей команды openssl. Замените my_user именем вашего пользователя GitHub. Это предоставит вам привилегии администратора:

cat << 'EOF' | sudo tee /etc/drone
DRONE_SERVER_HOST=drone.your_domain
DRONE_SERVER_PROTO=https
DRONE_GITHUB_CLIENT_ID=your_github_client_id
DRONE_GITHUB_CLIENT_SECRET=your_github_client_secret
DRONE_RPC_SECRET=your_rpc_secret
DRONE_USER_CREATE=username:my_user,admin:true
EOF

Эта команда использует heredoc. Heredoc использует оператор перенаправления <<, за которым следует произвольное слово, где обычно указывают EOF для обозначения конца файла. Это позволяет пользователю писать многострочный ввод, заканчивающийся EOF (или любым другим ключевым словом, которое выбрал пользователь). Кавычки в конце файла влияют на обработку текста в отношении замены переменных (аналогично тому, как они работают с литералами). Это очень полезный инструмент, который в данном случае позволяет нам создать файл, а затем добавлять в него строки. Только что мы создали свои первые конфигурации Drone и закончили их словом EOF. Этот ввод перенаправляется команде cat, а вывод команды cat затем передается команде tee с помощью оператора конвейера |. Heredocs – это отличный способ быстро создать файл или добавить текст в него.

Чтобы запретить посторонним пользователям входить на сервер Drone и заблокировать доступ к вашим runner-ам, составьте белый список пользователей или организаций. Чтобы добавить пользователей, выполните следующую команду, а вместо users укажите список пользователей или организаций GitHub (через запятую).

echo 'DRONE_USER_FILTER=users' | sudo tee -a /etc/drone

Если вы не пользуетесь внешним балансировщиком нагрузки или SSL-прокси, вам нужно включить Let’s Encrypt для HTTPS:

echo 'DRONE_TLS_AUTOCERT=true' | sudo tee -a /etc/drone

Флаг –a указывает, что команда tee должна добавлять этот вывод в конфигурации Drone, а не перезаписывать содержимое файла. А теперь давайте настроим систему хранения логов.

3: Настройка внешнего хранилища для логов сборки (опционально)

Если ваша сборка активно развивается, объем ее логов может довольно быстро увеличиться до нескольких гигабайт. По умолчанию логи хранятся в базе данных сервера, но для повышения производительности, масштабируемости и стабильности сборки рекомендуем рассмотреть возможность настройки внешнего хранилища для логов сборки. Для этого подойдет любое S3-совместимое хранилище.

Примечание: Вы также можете вообще не использовать такое хранилище, если вы пока еще только создаете прототип рабочего процесса CI/CD или если вы точно знаете, что сборка будет очень небольшого объема. В таком случае перейдите к разделу 4.

Чтобы хранить логи во внешнем хранилище, убедитесь, что вы выполнили предварительные условия, настроили корзину и сгенерировали необходимые ключи. Скопируйте ключ доступа и секретный ключ в буфер обмена, а затем добавьте в конфигурационный файл следующие данные:

cat << 'EOF' | sudo tee -a /etc/drone
DRONE_S3_ENDPOINT=your_s3_endpoint
DRONE_S3_BUCKET=your_s3_bucket_name
AWS_ACCESS_KEY_ID=your_s3_access_key
AWS_SECRET_ACCESS_KEY=your_s3_secret_key
EOF

Не забудьте заменить your_s3_endpoint URL-адресом вашего хранилища, your_s3_bucket_name – именем корзины, your_s3_access_key – своим ключом доступа, а your_s3_secret_key – секретным ключом. Если вы потеряли свой секретный ключ, вам нужно будет сгенерировать новую пару ключей.

Теперь конфигурационный файл Drone готов. Запустите команду cat, чтобы просмотреть его:

cat /etc/drone

Ваш файл конфигурации будет выглядеть примерно так, в зависимости от выбранных вами опций:

DRONE_SERVER_HOST=drone.your_domain
DRONE_SERVER_PROTO=https
DRONE_GITHUB_CLIENT_ID=your_github_client_id
DRONE_GITHUB_CLIENT_SECRET=your_github_client_secret
DRONE_RPC_SECRET=your_rpc_secret
DRONE_USER_CREATE=username:my_user,admin:true
DRONE_USER_FILTER= my_user_org
DRONE_TLS_AUTOCERT=true
DRONE_S3_ENDPOINT=your_s3_endpoint
DRONE_S3_BUCKET=your_s3_bucket
AWS_ACCESS_KEY_ID=your_s3_access_key
AWS_SECRET_ACCESS_KEY=your_s3_secret_key

После проверки этого файла вы можете установить и запустить Drone.

4: Установка и запуск Drone

Drone распространяется в виде контейнера Docker. Чтобы загрузить образ, введите:

docker pull drone/drone:1

Теперь создайте том для хранения базы данных SQLite:

docker volume create drone-data

Запустите сервер, настройте его автозапуск и перенаправьте на него порты 80 и 443:

docker run --name=drone --detach --restart=always --env-file=/etc/drone --volume=drone-data --publish=80:80 --publish=443:443 drone/drone:1

Если вы настраивали свой сервер согласно нашему мануалу по начальной настройке, вы включили брандмауэр ufw, и сейчас он пропускает только трафик OpenSSH. Теперь вам нужно открыть порты 80 и 443:

sudo ufw allow 80
sudo ufw allow 443

После этого перезапустите ufw и убедитесь, что правила обновились:

sudo ufw reload
sudo ufw status

Вы получите такой вывод:

Status: active
To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
80                         ALLOW       Anywhere
443                        ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
80 (v6)                    ALLOW       Anywhere (v6)
443 (v6)                   ALLOW       Anywhere (v6)

На этом этапе вы сможете получить доступ к своему серверу, войти в систему и управлять своими репозиториями. Перейдите по адресу https://drone.your_domain, введите свои учетные данные GitHub и авторизуйте свое новое приложение при появлении запроса.

Сервер Drone теперь запущен и почти готов к использованию. Все, что осталось, — это настроить Drone runner (и, если хотите, Autoscaler).

5: Установка Docker Runner

Прежде чем ваш сервер сможет выполнять задачи, вы должны установить runner.

Если вы хотите, чтобы ваша инфраструктура масштабировалась автоматически, установите Drone Autoscaler для вашего хостинг-провайдера. Однако пока что эта функция доступна не для всех облачных провайдеров. Потому мы рассмотрим универсальный вариант – Docker Runner.

Для начала загрузите образ Docker Runner:

docker pull drone/drone-runner-docker:1

Теперь запустите Runner. Вместо drone.your_domain и your_rpc_secret введитие свои данные. Также вы можете установить другое значение в DRONE_RUNNER_CAPACITY, чтобы увеличить количество одновременно работающих конвейеров (но при этом учитывайте ресурсы вашей системы).

docker run —name drone-runner —detach —restart=always —volume=/var/run/docker.sock:/var/run/docker.sock -e DRONE_RPC_PROTO=https -e DRONE_RPC_HOST=drone.your_domain -e DRONE_RPC_SECRET=your_rpc_secret -e DRONE_RUNNER_CAPACITY=1 -e DRONE_RUNNER_NAME=${HOSTNAME} drone/drone-runner-docker:1

Убедитесь, что runner успешно запустился:

docker logs drone-runner

Вы получите такой вывод:

time="2020-06-13T17:58:33-04:00" level=info msg="starting the server" addr=":3000"
time="2020-06-13T17:58:33-04:00" level=info msg="successfully pinged the remote server"
time="2020-06-13T17:58:33-04:00" level=info msg="polling the remote server" arch=amd64 capacity=1 endpoint="https://drone.your_domain" kind=pipeline os=linux type=docker

Если вам нужно будет изменить конфигурацию runner-а или секретный ключ, удалите свой контейнер с помощью команды docker rm drone-runner и повторите этот раздел с самого начала.

6: Создание конвейера YAML

Чтобы протестировать установку Drone, давайте создадим конвейер YAML.

Сначала создайте новый репозиторий на GitHub. Откройте свой профиль GitHub и найдите меню Repositories, затем нажмите зеленую кнопку New в правом верхнем углу. Дайте своему репозиторию имя, а затем нажмите зеленую кнопку Create repository. Теперь перейдите на свой сервер Drone, нажмите SYNC, обновите страницу, и на экране должен появиться ваш только что созданный репозиторий. Нажмите кнопку ACTIVATE рядом с ним.

После этого создайте в своем репозитории новый файл по имени .drone.yml. Вы можете сделать это с помощью пользовательского интерфейса GitHub или из командной строки с помощью git. В пользовательском интерфейсе GitHub откройте меню Repositories, затем кликните на свой новый репозиторий, а после этого разверните меню Add file. Выберите Create new file, назовите файл .drone.yaml и добавьте в него следующее содержимое:

name: drone-test
kind: pipeline
type: docker
steps:
- name: test
image: alpine
commands:
- echo "It worked!"

Если вы работаете через пользовательский интерфейс GitHub, нажмите зеленую кнопку Commit new file внизу страницы. Если вы используете командную строку, то отправьте коммит о своих изменениях. После коммита откройте дашборд Drone в браузере.

Если сборка отложена и не запускается, убедитесь, что ваши runner-ы настроены правильно (а если вы включили автомасштабирование – что облачные серверы создаются). Вы можете просматривать логи runner-а с помощью команды:

docker logs drone-runner

А логи для автомасштабирования доступны по команде:

docker logs drone-autoscaler

Если вы используете автомасштабирование, запуск начальной сборки может занять до минуты (последнее сообщение лога в течение этого времени будет starting the server).

После завершения сборки вы увидите в логах текст It worked!для этапа test конвейера drone-test. Если логи не загружаются, убедитесь, что ваши учетные данные S3 и имя корзины указаны правильно. Вы можете использовать команду docker logs drone, чтобы просмотреть логи Drone для получения дополнительной информации.

Вы установили и настроили сервер Drone для управления рабочим процессом CI/CD.

Заключение

В этом мануале вы настроили сервер непрерывной интеграции Drone для обработки проекта GitHub, а также добавили внешнее хранилище для логов сборки. Вы также настроили локальный runner.

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

echo 'DRONE_REGISTRATION_CLOSED=true' | sudo tee -a /etc/drone
docker restart drone

Drone предлагает множество функций. Узнать больше о синтаксисе конвейеров и о других функциях Drone можно в официальной документации.

Tags: , , , ,

Добавить комментарий