Как установить и настроить Drone на Ubuntu 16.04

Вступление

Drone - популярная платформа непрерывной интеграции и доставки, созданная на Go. Он интегрируется со многими популярными службами хранилища контроля версий, такими как GitHub, GitLab и Bitbucket, чтобы отслеживать изменения кода и автоматически создавать и тестировать изменения по мере их фиксации.

В этом руководстве мы покажем, как настроить полную среду непрерывной интеграции Drone для вашей инфраструктуры. Мы установим Drone и настроим его для интеграции с вашим репозиторием исходного кода. Попутно мы настроим Nginx, защищенный Let’s Encrypt, как интерфейс для Drone. Это зашифрует запросы к веб-интерфейсу Drone и позволит CI-серверу безопасно интегрироваться с сервером исходного кода.

Предпосылки

Чтобы начать, у вас должен быть сервер Ubuntu 16.04, сконфигурированный с пользователем не-root + sudo + для административных задач. На сервере также должен быть брандмауэр для фильтрации входящих соединений. Вы можете узнать, как настроить эти элементы, следуя Ubuntu 16.04 начальное руководство по настройке сервера.

Вам нужно будет выполнить некоторые дополнительные шаги, чтобы удовлетворить другие требования для нашей установки. Поскольку Drone в основном распространяется как образ Docker, мы будем использовать Docker Compose для управления контейнерами CI-сервера. В целях безопасности и производительности мы будем передавать запросы Drone через экземпляр Nginx, защищенный Let Encrypt. Вам потребуется доменное имя, подключенное к вашему CI-серверу, чтобы правильно настроить это.

Прежде чем начать, используйте следующие статьи, чтобы настроить эти дополнительные требования:

Когда вы закончите описанные выше руководства, ваш сервер Drone должен иметь:

  • Пользователь + sudo + настроен для административных задач

  • Брандмауэр UFW включен. Он должен блокировать все соединения, кроме запросов SSH, HTTP и HTTPS на портах 22, 80 и 443 соответственно.

  • Docker и Docker Compose установлены.

  • Сервер Nginx, настроенный с использованием SSL-сертификата, предоставляемого Let’s Encrypt

Продолжайте ниже, когда вы будете готовы начать.

Добавить приложение в репозиторий исходного кода

Чтобы отслеживать изменения кода для запуска этапов сборки и тестирования, Drone потребуется доступ к вашему репозиторию исходного кода. Drone может интегрироваться с GitHub, GitLab, http: // docs. drone.io/install-for-gogs/[Gogs], Bitbucket Cloud и http://docs.drone.io/install- for-bitbucket-server / [Bitbucket Server].

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

Начните с посещения своей учетной записи https://github.com [GitHub]. Нажмите на свой значок пользователя в верхнем правом углу и выберите * Настройки * из выпадающего меню:

изображение: https: //assets.digitalocean.com/articles/drone_install_1604/github_settings.png [настройки Drone GitHub]

Затем найдите элемент * OAuth-приложения * в разделе * Настройки разработчика * в левой части экрана:

изображение: https: //assets.digitalocean.com/articles/drone_install_1604/oauth_apps.png [Приложения Drone OAuth]

На следующей странице нажмите * Зарегистрировать новое приложение *:

изображение: https: //assets.digitalocean.com/articles/drone_install_1604/new_app.png [Drone new app]

Далее вы увидите форму регистрации приложения OAuth:

изображение: https: //assets.digitalocean.com/articles/drone_install_1604/define_new_app.png [Drone зарегистрирует новое приложение]

Вам нужно будет заполнить следующие поля (эти поля присутствуют на GitHub. Другие поставщики репозитория могут иметь разные приглашения):

  • * Имя приложения *: имя, которое вы выбираете для идентификации интеграции. «Drone» - хороший выбор, если у вас нет особых потребностей.

  • * URL домашней страницы *: доменное имя вашего Drone-сервера. Используйте + https: // + здесь, так как мы используем защищенный домен.

  • * Описание приложения *: простое описание Drone и его цели.

  • * URL-адрес обратного вызова авторизации *: Это должен быть спецификатор схемы + https: // +, за которым следует доменное имя вашего сервера Drone, а затем + / authorize +. Если ваше доменное имя ++, этот файл будет + https: /// authorize.

Когда вы будете готовы, нажмите * Зарегистрировать приложение *.

На следующей странице вы увидите детали вашего нового приложения. Два элемента, которые нам нужны - это * Client ID * и * Client Secret *:

изображение: https: //assets.digitalocean.com/articles/drone_install_1604/client_info.png [Информация о клиенте Drone]

Скопируйте эти два значения на потом. Они понадобятся нам для подключения Drone к нашей учетной записи GitHub.

Вытащите образ Drone Docker и подготовьтесь к настройке

Теперь, когда ваш сервер Drone зарегистрирован у поставщика репозитория, вы можете установить и настроить Drone на своем сервере.

Drone распространяется в виде контейнера Docker, поэтому он будет автоматически загружен, если мы используем его в файле Docker Compose. Чтобы немного ускорить процесс, мы можем опустить изображение заранее:

docker pull drone/drone:0.7

Образ Drone Docker - это унифицированный контейнер, который можно запустить несколькими различными способами. Мы запустим один контейнер, который работает как сервер Drone, который координирует доступ к хранилищу, размещает веб-интерфейс и обслуживает API. Используя одно и то же изображение с другими настройками, мы запустим другой контейнер в качестве агента Drone, который отвечает за сборку и тестирование программного обеспечения из настроенных репозиториев.

Мы запустим оба этих контейнера на хосте Drone с помощью Docker Compose. Начните с создания каталога конфигурации для хранения файлов, которые нам понадобятся:

sudo mkdir /etc/drone

Далее мы создадим несколько файлов для настройки наших сервисов.

Создать Docker Compose File для Drone

Сначала создайте файл Docker Compose в каталоге конфигурации:

sudo nano /etc/drone/docker-compose.yml

Внутри мы отметим формат файла Docker Compose как версию «3». После этого мы определим службы для обеих служб, описанных выше.

Сервис + drone-server + запустит контейнер основного сервера Drone, прослушивающий порт 8000. Мы смонтируем директорию хоста + + var / lib / drone + внутри контейнера, чтобы Drone мог сохранять свои данные. Мы настроим службу на автоматический перезапуск и на чтение более подробных инструкций по настройке в форме переменных среды, определенных в файле, который мы создадим в + / etc / drone / server.env +.

Сервис + drone-agent использует тот же образ, который запускается командой` + agent`. Он получает инструкции от основного экземпляра сервера Drone, поэтому, хотя ему не требуется общий доступ к сети, его необходимо запустить после службы Drone. Ему также необходим доступ к файлу сокета Docker для ускорения работы контейнеров для выполнения реальных этапов сборки и тестирования. Как и служба + drone-server +, эта служба также автоматически перезапускается и считывает файл среды в + / etc / drone / agent.env + для дополнительной настройки.

Используйте следующий файл Docker Compose для настройки этих двух служб. Обратите особое внимание на YAML-форматирование файла, так как ошибки в отступе или форматировании могут вызвать ошибки:

/etc/drone/docker-compose.yml

version: '3'

services:
 drone-server:
   image: drone/drone:0.7
   ports:
     - 127.0.0.1:8000:8000
   volumes:
     - /var/lib/drone:/var/lib/drone
   restart: always
   env_file:
     - /etc/drone/server.env

 drone-agent:
   image: drone/drone:0.7
   command: agent
   depends_on:
     - drone-server
   volumes:
     - /var/run/docker.sock:/var/run/docker.sock
   restart: always
   env_file:
     - /etc/drone/agent.env

Когда вы закончите, сохраните и закройте файл Docker Compose.

Настройте файл переменной среды Drone-сервера

Затем нам нужно создать файл переменной среды сервера Drone, на который мы ссылались в файле Docker Compose выше.

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

LC_ALL=C </dev/urandom tr -dc A-Za-z0-9 | head -c 65 && echo

Эта команда временно устанавливает для языка оболочки ограниченный диапазон символов. Затем он берет поток случайных байтов из + / dev / urandom + и дополнительно отфильтровывает любые не алфавитно-цифровые символы. В качестве ключа мы берем первые 65 символов.

Вывод будет выглядеть примерно так (* Не копируйте значение ниже! Создайте свой собственный! *):

OutputERmA7xubDvTa8i0wYBlljc9yjT1NJPG7xOlZBwAdMAmBYL4RZE4QngxWcCLowk9KN

Скопируйте сгенерированный ключ для использования в файле среды сервера.

Создайте новый файл в + / etc / drone / server.env + и откройте его в текстовом редакторе:

sudo nano /etc/drone/server.env

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

Для начала установите значения + DRONE_HOST + и + DRONE_SECRET +. Установите + DRONE_SECRET + для ключа, который вы сгенерировали в командной строке. Параметр + DRONE_HOST + информирует Drone о его общедоступном адресе. Это должен быть ваш защищенный домен Let Encrypt, которому предшествует спецификатор схемы + https: // +:

/etc/drone/server.env

# Service settings
DRONE_SECRET=
DRONE_HOST=https://

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

Мы заблокируем нашу установку Drone и отключим открытую регистрацию, установив + DRONE_OPEN + в + false +. Это будет означать, что только имена учетных записей GitHub, указанные в + DRONE_ADMIN +, смогут войти в систему.

Убедитесь, что + DRONE_ADMIN + содержит имя вашей учетной записи GitHub.

После этого активируйте плагин интеграции GitHub, установив для + DRONE_GITHUB + значение + true +. Затем мы установим + DRONE_GITHUB_CLIENT + и + DRONE_GITHUB_SECRET + для ключей, которые мы скопировали со страницы приложения GitHub OAuth при регистрации приложения Drone:

/etc/drone/server.env

# Service settings
DRONE_SECRET=
DRONE_HOST=https://

# Registration settings
DRONE_OPEN=false
DRONE_ADMIN=

# GitHub Settings
DRONE_GITHUB=true
DRONE_GITHUB_CLIENT=
DRONE_GITHUB_SECRET=

Мы закончили настройку серверного компонента. Перед выходом скопируйте значение + DRONE_SECRET + из файла. Нам потребуется установить этот же ключ в следующем разделе, когда мы настроим агента. Сохраните и закройте файл, когда вы закончите.

Настройте файл переменной среды агента Drone

Далее мы создадим файл среды для компонента агента Drone.

Откройте новый файл для установки переменных среды агента:

sudo nano /etc/drone/agent.env

Внутри нам нужно определить только два значения. + DRONE SECRET будет соответствовать конфигурации в файле` + server.env`.

Параметр + DRONE_SERVER + определяет, как агент должен подключаться к компоненту сервера Drone. Он начинается с префикса протокола + wss: // +, указывающего, что соединение будет использовать зашифрованный веб-сокет, за которым следует доменное имя сервера Drone с добавленным в конец URI + / ws / broker +:

/etc/drone/agent.env

DRONE_SECRET=
DRONE_SERVER=wss:///ws/broker

Сохраните и закройте файл, когда вы закончите.

Настройте файл модуля Drone Systemd

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

Откройте новый файл + .service в каталоге` + / etc / systemd / system` для настройки службы:

sudo nano /etc/systemd/system/drone.service

Внутрь вставьте следующее содержимое:

/etc/systemd/system/drone.service

[Unit]
Description=Drone server
After=docker.service nginx.service

[Service]
Restart=always
ExecStart=/usr/local/bin/docker-compose -f /etc/drone/docker-compose.yml up
ExecStop=/usr/local/bin/docker-compose -f /etc/drone/docker-compose.yml stop

[Install]
WantedBy=multi-user.target

Первый раздел сообщает systemd, что нужно запускать этот сервис после того, как Docker и Nginx станут доступны. Во втором разделе система инициализации автоматически перезапускает службу в случае сбоев. Затем он определяет команды для запуска и остановки службы Drone с помощью Docker Compose и файла конфигурации, который мы создали ранее. Наконец, последний раздел определяет, как включить службу при загрузке.

Сохраните и закройте файл, когда вы закончите.

Прежде чем мы запустим сервис Drone, нам нужно настроить Nginx. Агент Drone должен иметь возможность подключаться к серверу Drone, и соединение зависит от наличия прокси Nginx.

Настройка запросов Nginx к прокси для Drone

Далее нам нужно изменить конфигурацию Nginx для запросов прокси на наш сервер Drone.

Начните с поиска конфигурации блока сервера, которая обрабатывает ваш защищенный домен Let Encrypt. Найдите атрибут + server_name + во всех включенных блоках сервера, набрав:

grep -R server_name /etc/nginx/sites-enabled
Output/etc/nginx/sites-enabled/default:   server_name ;
/etc/nginx/sites-enabled/default:   return 301 https://$server_name$request_uri;
/etc/nginx/sites-enabled/default:   server_name ;
/etc/nginx/sites-enabled/default:#  server_name example.com;

В приведенном выше выводе имя домена (в данном случае + example.com +) определяется в файле + / etc / nginx / sites-enabled / default +. Вы захотите отредактировать файл (первый столбец), связанный с вашим доменным именем.

Вполне возможно, что вы также можете увидеть что-то вроде этого:

Output/etc/nginx/sites-enabled/default:   server_name _;
/etc/nginx/sites-enabled/default:   return 301 https://$server_name$request_uri;
/etc/nginx/sites-enabled/default:   server_name _;
/etc/nginx/sites-enabled/default:#  server_name example.com;

В приведенном выше выводе строки + server_name ; + представляют серверные блоки, предназначенные для использования в качестве механизмов восстановления. Спецификатор хоста «

Related