Как выполнить тестирование непрерывной интеграции с Drone.io на CoreOS и Docker

Вступление

Хотите минимальное решение для непрерывной интеграции? Кто бы не стал! https://drone.io [Drone.io] использует контейнеры Docker для запуска ваших тестов и работает с https://github.com [GitHub], https://about.gitlab.com [GitLab] (самостоятельно размещается и на основе услуг), и https://bitbucket.org [Bitbucket].

Дрон построен с использованием Go и использует Docker. Он может быть запущен внутри самого контейнера с очень маленькой конфигурацией.

Прерывная интеграция - это практика разработки частых коммитов в базу кода, а также сборки и тестирования по мере необходимости. Это означает, что новый код будет (надеюсь) быстро и легко интегрироваться в существующую кодовую базу. Поскольку непрерывная интеграция требует частой сборки и тестирования кода, это ускоряет процесс разработки, если вы можете создавать и тестировать автоматически. Дрон делает это; автоматизирует процесс сборки и тестирования.

Drone автоматически извлекает код из размещенного Git-репозитория, а затем запускает определенные вами сценарии. Вы можете запустить любой набор тестов и отправить его вам по электронной почте или указать статус с помощью значка в README. Интеграция Drone с Docker означает, что он может поддерживать огромное количество языков, включая PHP, Node, Ruby, Go и Python. Каждый тест будет порождать новый контейнер на основе указанных изображений из публичного реестра Docker. Это означает, что поддержка языков и стеков разработки будет только увеличиваться по мере создания новых изображений. Вы даже можете сделать свой собственный, чтобы соответствовать вашему конкретному применению!

В этом уроке мы рассмотрим, как мы можем контейнировать Drone.io, чтобы он мог работать с использованием минимального дистрибутива Linux CoreOS.

Требования

  • Как минимум один ключ SSH добавлен в ваш аккаунт

  • Одна CoreOS Beta Droplet (512 МБ ОЗУ будет работать нормально)

Рекомендуется прочитать это Introduction to CoreOS перед продолжением, если вы никогда ранее не использовали операционную систему.

Если вы не знаете, как настроить CoreOS с помощью файла «+ cloud-config +», вы можете найти дополнительную информацию и пример файла конфигурации: https://www.digitalocean.com/community/tutorials/how-to-set -до-а-coreos-кластер-на-digitalocean [здесь]! Пример файла конфигурации будет работать для этого урока.

Шаг первый - подготовить GitHub

Прежде чем мы начнем, нам нужно разрешить доступ к нашим учетным записям GitHub через oAuth. Мы создадим пару токенов, которые будут использоваться на следующем шаге настройки контейнера Drone.

Нам нужно сгенерировать эти значения из вашей учетной записи GitHub. Click here, чтобы перейти на соответствующую страницу настроек на GitHub, которая называется * Applications *.

Нажмите кнопку * Зарегистрировать новое приложение * в правом верхнем углу. Это вызовет новую форму для заполнения:

изображение: https: //assets.digitalocean.com/articles/drone/register.png [регистрация OAuth]

Добавьте ваше * Имя приложения *. * URL-адрес домашней страницы * должен быть + http: // YOUR_DROPLET_IP: 8080 / +. Добавьте ваше * описание приложения *.

  • ВАЖНО *: убедитесь, что * URL-адрес обратного вызова авторизации * установлен в + http: // YOUR_DROPLET_IP: 8080 / api / auth / github.com + для правильной аутентификации!

Как только вы настроитесь на это, нажмите * Зарегистрировать приложение *, чтобы перейти на информационную страницу нового приложения.

Отсюда вам понадобится два бита информации: * Client ID * и * Client Secret *. (Держите секрет клиента на самом деле в секрете! Это НЕ то, что вы должны поделиться с кем-либо!)

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

Запишите эти токены, так как они понадобятся нам на следующем шаге.

Шаг второй - написать Dockerfile

Когда ваша CoreOS Droplet готова к работе, подключитесь к ней через SSH:

ssh -A core@YOUR_DROPLET_IP

Создайте новый каталог с именем + droneio +:

mkdir droneio
cd droneio

Из-за того, что корневая файловая система CoreOS доступна только для чтения, мы не можем установить Drone.io напрямую. Мы должны containerize с помощью Docker в первую очередь. Мы настроим Dockerfile, который содержит инструкции по установке Drone.io точно так же, как и в стандартной системе Ubuntu.

В этом разделе мы будем использовать основанный на терминале текстовый редактор + vim +. Это текстовый редактор по умолчанию в CoreOS, поэтому важно ознакомиться с ним. Мы покажем вам шаг за шагом, как использовать его для открытия и редактирования файла.

Теперь пришло время использовать vim для создания нашего Dockerfile. Запустите команду:

vim Dockerfile

Это откроет vim и создаст новый файл с именем + Dockerfile + в вашем текущем каталоге.

Теперь войдите в режим вставки. Для этого нажмите клавишу + i +. Теперь в левом нижнем углу терминала должно появиться: + - INSERT - +. Теперь вы можете ввести или вставить содержимое Dockerfile.

Вот Dockerfile в полном объеме. Комментарии включены в строке для каждого раздела. Вы можете скопировать этот файл точно:

# Pull from base Ubuntu image
FROM ubuntu

# Do system updates and install dependencies
RUN apt-get update
RUN apt-get -y upgrade
RUN sudo apt-get -y install git wget
RUN apt-get clean

# Download Drone.io
RUN wget http://downloads.drone.io/master/drone.deb
RUN dpkg -i drone.deb

# Expose the Drone.io port
EXPOSE 8080

ENV DRONE_SERVER_PORT 0.0.0.0:8080
ENV DRONE_DATABASE_DATASOURCE /var/lib/drone/drone.sqlite

# Define our GitHub oAuth keys below
ENV DRONE_GITHUB_CLIENT <CLIENT_TOKEN_HERE>
ENV DRONE_GITHUB_SECRET <CLIENT_SECRET_HERE>

# The command we'll be running when the container starts
CMD /usr/local/bin/droned

Замените + <CLIENT_TOKEN_HERE> + и + <CLIENT_SECRET_HERE> + токенами, отмеченными на шаге выше.

Введите команду ниже, чтобы сохранить внесенные нами изменения. + W + говорит vim записать текст в файл, а + q + приведет к выходу vim.

:wq

Очень краткий обзор для тех, кто не знаком с Dockerfiles:

  • + FROM + - изображение, которое мы собираемся использовать для нашего контейнера

  • + RUN + - запустить команду внутри контейнера во время процесса сборки

  • + EXPOSE + - разрешает доступ к указанным портам за пределами контейнера

  • + CMD + - команда, которая будет выполняться при запуске контейнера

  • + ENV + - устанавливает значение переменной окружения в контейнере, используемое здесь для конфигурации Drone

Для получения дополнительной информации о типах операторов, которые вы можете делать в Dockerfiles, прочитайте official Docker документацию.

На данный момент мы можем построить изображение с помощью следующей команды:

docker build -t my_drone .

Это займет несколько минут. Как только он будет успешно собран, мы можем раскрутить контейнер, используя наш новый образ.

Шаг второй - Запустите Drone Container

Drone.io нужно место для хранения информации, поэтому мы будем использовать файл базы данных SQLite. Создайте пустой файл для начала:

touch drone.sqlite

Этот файл будет заполнен данными Drone, как только контейнер будет запущен и запущен.

Запуск Drone довольно прост, но нам нужно сделать несколько дополнительных шагов, чтобы Drone мог получить доступ к Docker-серверу нашего хоста. Самый простой способ сделать это - использовать том, чтобы привязать файл сокета хоста к тому месту, где будет находиться файл сокета контейнера. Команда для правильного запуска контейнера приведена ниже:

docker run -d --name="drone-ci" \
   -p 8080:8080 \
   -v /var/lib/drone/ \
   -v /var/run/docker.sock:/var/run/docker.sock \
   -v /home/core/droneio/drone.sqlite:/var/lib/drone/drone.sqlite \
   my_drone

Идя строка за строкой, давайте разберем, что именно происходит:

  • + docker run -d --name =" drone-ci "+ - В этой части команды мы говорим Docker запускать этот контейнер в фоновом режиме, поэтому нам не нужно беспокоиться о его смерти, если мы отключиться от сеанса SSH. Мы также даем ему понятное имя * drone-ci *, поэтому мы можем управлять им с помощью команды + docker +.

  • + -p 8080: 8080 + - здесь мы привязываем порт 8080 от нашего хоста к тому же порту в контейнере. Это позволяет нам получить доступ к интерфейсу Drone за пределами сети работающего контейнера.

  • + -v / var / lib / drone + - устанавливает том для хранения в контейнере.

  • + -v /var/run/docker.sock: / var / run / docker.sock + - этот прием позволяет контейнеру Drone.io управлять системой Docker хоста. Мы связываем местоположение контейнера, где сокет Docker UNIX будет с действительным сокетом Docker UNIX хоста. Другими словами, мы говорим Drone использовать установку Docker на нашем хосте CoreOS, а не внутри контейнера, в котором работает Drone. Это связано с тем, что на хосте установлен Docker, а на контейнере нет (то есть контейнер Docker не выполняет вложенную установку Docker).

  • + -v /home/core/droneio/drone.sqlite:/var/lib/drone/drone.sqlite \ + - привязать пустой файл хранилища к базе данных внутри контейнера, чтобы сохранить данные, которые мы храним в нем. Этот файл находится за пределами контейнера на случай, если нам когда-нибудь понадобится восстановить данные из него, или по какой-то причине необходимо изменить базу данных извне.

  • + my_drone + - Мы используем изображение, которое мы создали ранее, чтобы запустить этот контейнер.

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

Чтобы убедиться, что контейнер работает, выполните быструю проверку состояния:

docker ps

Ваш вывод должен выглядеть примерно так:

CONTAINER ID        IMAGE               COMMAND               CREATED             STATUS              PORTS                             NAMES
6eddddd09900        my_drone:latest    "/bin/sh -c '/usr/lo   1 seconds ago       Up 1 seconds        0.0.0.0:8080->8080/tcp            drone-ci

Мой контейнер не запустился!

Если вы запустили + docker ps + и не получили результатов, перепроверьте длинную команду + docker run + сверху и убедитесь, что вы ввели ее точно. Вы можете попробовать запустить его без разрывов строки. Также убедитесь, что вы создали пустой файл + drone.sqlite + в правильном каталоге.

Чтобы восстановить контейнер и повторить попытку, нам нужно удалить сломанный контейнер из Docker; в противном случае он будет жаловаться на дубликаты именованных контейнеров.

Удалите старый контейнер с помощью + docker rm drone-ci + (обратите внимание, что мы использовали имя, которое мы дали контейнеру в приведенной выше команде). Затем попробуйте снова запустить команду long + docker run из предыдущего раздела.

Если контейнер запущен, но вы не можете получить доступ к странице установки, попробуйте перезапустить его. Остановите контейнер с помощью + docker stop drone-ci +. Или для более агрессивной остановки используйте + docker kill drone-ci +. Затем попробуйте запустить его снова с помощью + docker start drone-ci +.

Если вы хотите покопаться в журналах контейнера, вы можете использовать команду журнала Docker: + docker logs drone-ci +.

Шаг третий - настроить дрон

Теперь мы готовы настроить Drone с первоначальным аккаунтом. Откройте веб-браузер и перейдите по адресу: + http: // YOUR_DROPLET_IP: 8080 / login. Вы должны увидеть экран входа в систему, как показано ниже:

изображение: https: //assets.digitalocean.com/articles/drone/login.png [Вход в Drone.io]

Мы видим только GitHub, потому что это единственный сервис, который мы установили в Dockerfile.

Теперь нажмите кнопку * GitHub *, затем кнопку * Авторизовать приложение *, чтобы запустить процесс входа и синхронизации.

изображение: https: //assets.digitalocean.com/articles/drone/dash.png [Список репо]

Это основная панель управления для Drone, вы можете увидеть три самых последних репозитория в вашей учетной записи GitHub и развернуть список, нажав «ПОСМОТРЕТЬ ВСЕ». Если все ваши репозитории не появляются, просто нажмите «SYNC» в верхнем правом углу.

Не стесняйтесь исследовать приборную панель.

Далее нам нужно разрешить доступ к вашим различным источникам репозитория Git.

Шаг пятый - Запуск сборок из GitHub

Найдите имя репозитория, который вы хотите добавить в Drone CI, и выберите его. Это активирует Drone и добавит веб-хуки в ваш репозиторий.

После активации вы увидите пустую страницу состояния репозитория:

изображение: https: //assets.digitalocean.com/articles/drone/commitStream.png [Commit Stream]

Вы можете изучить некоторые из более сложных настроек хранилища, используя кнопку в правом верхнем углу.

Файл .drone.yml

Нам нужно создать новый файл в хранилище с именем + .drone.yml +. Это даст команду Drone и расскажет, как собрать и протестировать код в репозитории GitHub. Вот очень простой файл, который мы будем использовать для проверки правильности настройки Drone.

image: dockerfile/nginx
script:
 - echo hello world
  • + image + определяет базовый образ, из которого мы извлекаем (изображение может быть из общедоступного реестра Docker, частного реестра или созданного локально). В этом случае мы используем изображение Nginx.

  • + script + просто определяет команды, которые Drone должен выполнять, и в каком порядке. Вы можете определить более одной команды сценария с другой + - <команда здесь> + в новой строке. (Убедитесь, что вкладки выстроились в ряд!)

Этот сценарий просто повторяет «привет мир», чтобы доказать, что Drone работает. На самом деле он ничего не проверяет в вашем коде.

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

Теперь добавьте ваш файл + .drone.yml + в ваш репозиторий. Этот коммит и любые другие коммиты, которые вы сделаете в будущем (для любого файла, не только для файла + .drone.yml +), приведут к запуску Drho-файла webhook, размещенного в вашем хранилище. Drone теперь должен усердно работать над созданием базового образа и запуском скриптов сборки!

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

изображение: https: //assets.digitalocean.com/articles/drone/statusPage.png [Дрон работник]

Сборка займет несколько минут, так как Drone должен извлечь образ из общедоступного реестра Docker.

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

$ git clone --depth=50 --recursive --branch=master git://github.com/captainshar/dronetest.git /var/cache/drone/src/github.com/captainshar/dronetest
$ git checkout -qf 9908588ae4e4abcba8afb5029baad5c49a835ba4
$ echo hello world
hello world
$ exit 0

Вы также можете увидеть несколько предупреждений, связанных с Perl; Все в порядке.

Если вы выполнили все эти шаги и прошли этапы сборки, у вас теперь есть собственный личный работник Drone.io, готовый для сборки и тестирования практически любого языкового проекта!

Drone также поддерживает Bitbucket и GitLab, и процессы установки с использованием OAuth относительно такие же, как у Github. Вам может понадобиться отредактировать Dockerfile и перестроить контейнер, используя правильные переменные среды:

DRONE_BITBUCKET_CLIENT
DRONE_BITBUCKET_SECRET
DRONE_GITLAB_URL
...

Следующие шаги

Теперь, когда Drone готов к запуску сборок, вы можете изменить + .drone.yml +, чтобы выполнить более сложное тестирование.

Например, если вы хотите протестировать приложение Node с использованием тестовой среды, такой как Karma или Mocha, вы можете изменить раздел + image + на официальный образ + node + и изменить раздел скрипта для выполнения + npm + и запустить тесты! Посмотрите на Docker реестра изображения, которые могут подойти вашему приложению.

Если вы хотите стать действительно модным, вы можете посмотреть на что-то под названием Drone Wall, чтобы отобразить все ваши статусы сборки.

Веселитесь, командуя своим Дроном!

Related