Как настроить среду тестирования непрерывной интеграции с Docker и Docker Compose в Ubuntu 14.04

Статья из Docker

Вступление

Прерывная интеграция (CI) относится к практике, когда разработчики integrate кодируют как можно чаще, и каждый коммит тестируется до и после объединения в общий репозиторий с помощью автоматической сборки.

CI ускоряет процесс разработки и сводит к минимуму риск возникновения критических проблем на производстве, но его настройка не является простой; Автоматические сборки выполняются в другой среде, где установка * зависимостей времени выполнения * и конфигурация * внешних сервисов * может отличаться от вашей локальной среды и среды разработки.

Docker - это платформа для контейнеризации, цель которой - упростить проблемы стандартизации среды, чтобы также можно было стандартизировать развертывание приложений (https://www.digitalocean.com/community/tutorials. / the-docker-экосистема-обзор-контейнерирования [узнайте больше о Docker]). Для разработчиков Docker позволяет моделировать производственные среды на локальных машинах, запуская компоненты приложения в локальных контейнерах. Эти контейнеры легко автоматизируются с использованием Docker Compose независимо от приложения и базовой ОС.

В этом руководстве используется Docker Compose для демонстрации автоматизации рабочих процессов CI.

Мы создадим приложение Python Dockerized «Hello world» и тестовый скрипт Bash. Для запуска приложения Python потребуется два контейнера: один для самого приложения и контейнер Redis для хранилища, которое требуется как зависимость для приложения.

Затем тестовый сценарий будет Dockerized в своем собственном контейнере, и вся среда тестирования будет перемещена в файл * docker-compose.test.yml *, чтобы мы могли убедиться, что выполняем каждый запуск теста в свежей и унифицированной среде приложения.

Этот подход показывает, как вы можете создавать идентичную, свежую среду тестирования для своего приложения, включая его зависимости, каждый раз, когда вы тестируете его.

Таким образом, мы автоматизируем рабочие процессы CI независимо от тестируемого приложения и базовой инфраструктуры.

Требования

Прежде чем начать, вам понадобится:

  • Сервер Ubuntu 14.04

  • Пользователь без полномочий root с правами sudo. Вы можете следовать этому tutorial чтобы настроить это

  • Некоторое знакомство с Docker и https://www.digitalocean.com/community/tutorials/how- to-install-and-use-docker-compose-on-ubuntu-14-04 [Docker Compose]; ссылки для справки, так как мы будем устанавливать программное обеспечение во время этого урока

  • * Тестирование, тестирование и более (автоматическое) тестирование! * Вы уже должны быть уверены в преимуществах тестирования и применения CI в ваших рабочих процессах разработки.

Шаг 1 - Установите Docker

Если Docker еще не доступен на вашем сервере, самый простой способ - загрузить и запустить официальный скрипт установки Docker, который запрашивает пароль sudo (дополнительную информацию об установке Docker см. На странице https://www.digitalocean.com/community/tutorials. / как в установке, и потребительной докер-получение стартером [здесь]):

wget -qO- https://get.docker.com/ | sh

Чтобы упростить работу с Docker, добавьте своего пользователя в группу * docker * с помощью следующей команды:

sudo usermod -aG docker $(whoami)

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

Шаг 2 - Установите Docker Compose

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

sudo apt-get update
sudo apt-get -y install python-pip
sudo pip install docker-compose

Убедитесь, что + docker-compose + правильно установлен, выполнив:

docker-compose --version

Вы должны увидеть что-то вроде:

Выход

docker-compose version 1.6.2, build 4d72027

Это должно сказать вам версию + docker-compose +, которую вы установили.

Шаг 3 - Создайте приложение Python «Hello World»

На этом шаге мы создадим простое приложение Python в качестве примера типа приложения, которое вы можете протестировать с помощью этой настройки.

Создайте новую папку для нашего приложения, выполнив:

cd ~
mkdir hello_world
cd hello_world

Отредактируйте новый файл + app.py + с помощью nano:

nano app.py

Добавьте следующий контент:

app.py

from flask import Flask
from redis import Redis

app = Flask(__name__)
redis = Redis(host="redis")

@app.route("/")
def hello():
   visits = redis.incr('counter')
   html = "<h3>Hello World!</h3>" \
          "<b>Visits:</b> {visits}" \
          "<br/>"
   return html.format(visits=visits)

if __name__ == "__main__":
   app.run(host="0.0.0.0", port=80)

+ app.py + - это веб-приложение, основанное на Flask, которое подключается к службе данных Redis. Строка + посещения = redis.incr ('counter') + увеличивает количество посещений и сохраняет это значение в Redis. Наконец, в HTML возвращается сообщение + Hello World + с количеством посещений.

Наше приложение имеет две зависимости + Flask + и + Redis +, которые вы можете видеть в первых двух строках. Эти зависимости должны быть определены до того, как мы сможем выполнить приложение. Редактировать новый файл:

nano requirements.txt

Добавьте содержимое:

requirements.txt

Flask
Redis

Шаг 4 - Докеризация приложения «Hello World»

Docker использует файл с именем + Dockerfile +, чтобы указать необходимые шаги для создания образа Docker для данного приложения. Редактировать новый файл:

nano Dockerfile

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

Dockerfile

FROM python:2.7

WORKDIR /app

ADD requirements.txt /app/requirements.txt
RUN pip install -r requirements.txt

ADD app.py /app/app.py

EXPOSE 80

CMD ["python", "app.py"]

Давайте проанализируем значение каждой строки:

  • + FROM python: 2.7 +: указывает на то, что наш образ приложения «Hello World» построен из официального + python: 2.7 + Docker image

  • + WORKDIR / app: устанавливает рабочий каталог внутри образа Docker равным` + / app`

  • + ADD needs.txt / app / needs.txt: добавляет файл` + needs.txt` к вашему образу Docker.

  • + RUN pip install -r needs.txt +: устанавливает зависимости приложения + + pip + `

  • + ADD app.py / app / app.py +: добавляет исходный код нашего приложения в образ Docker

  • + EXPOSE 80 +: указывает, что наше приложение может быть доступно через порт 80 (стандартный общедоступный веб-порт)

  • + CMD [" python "," app.py "] +: команда, запускающая наше приложение

Этот файл + Dockerfile + содержит всю информацию, необходимую для создания основного компонента нашего приложения «Hello World».

  • Зависимость *

Теперь перейдем к более сложной части примера. Наше приложение требует Redis в качестве внешнего сервиса. Это тип зависимости, который может быть сложно каждый раз устанавливать одинаковым образом в традиционной среде Linux, но с помощью Docker Compose мы можем настраивать его повторяемым образом каждый раз.

Давайте создадим файл + docker-compose.yml +, чтобы начать использовать Docker Compose.

Редактировать новый файл:

nano docker-compose.yml

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

докер-compose.yml

web:
 build: .
 dockerfile: Dockerfile
 links:
   - redis
 ports:
   - "80:80"
redis:
 image: redis

Этот файл Docker Compose показывает, как локально раскрутить приложение «Hello World» в два контейнера Docker.

Он определяет два контейнера, + web + и + redis +.

  • + web + использует текущую папку для контекста + build и создает приложение Python из файла` + Dockerfile`, который мы только что создали. Это локальное изображение Docker, которое мы создали только для нашего приложения Python. Он определяет ссылку на контейнер + redis +, чтобы иметь доступ к IP-адресу контейнера + redis +. Это также делает порт 80 общедоступным из Интернета, используя общедоступный IP-адрес вашего сервера Ubuntu.

  • + redis + выполняется из стандартного общедоступного образа Docker с именем + redis +

Шаг 5 - Разверните приложение «Hello World»

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

Файлы + docker-compose.yml + и + Dockerfile + позволяют автоматизировать развертывание локальных сред, выполнив:

docker-compose -f ~/hello_world/docker-compose.yml build
docker-compose -f ~/hello_world/docker-compose.yml up -d

Первая строка строит образ нашего локального приложения из файла + Dockerfile. Вторая строка запускает контейнеры + web + и + redis + в режиме демона (+ -d +), как указано в файле + docker-compose.yml +.

Проверьте, что контейнеры приложения были созданы, выполнив:

docker ps

Это должно показать два запущенных контейнера с именами + helloworld_web_1 + и + helloworld_redis_1 +.

Давайте проверим, что приложение запущено. Мы можем получить IP-адрес контейнера + helloworld_web_1 +, выполнив:

WEB_APP_IP=$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' helloworld_web_1)
echo $WEB_APP_IP

Убедитесь, что веб-приложение возвращает правильное сообщение:

curl http://${WEB_APP_IP}:80

Это должно вернуть что-то вроде:

Выход

<h3>Hello World!</h3><b>Visits:</b> 1<br/>

Количество посещений увеличивается каждый раз, когда вы достигаете этой конечной точки. Вы также можете получить доступ к приложению «Hello World» из браузера, посетив общедоступный IP-адрес вашего сервера Ubuntu.

  • Как настроить для вашего собственного приложения *

Ключом к настройке вашего собственного приложения является помещение вашего приложения в собственный контейнер Docker и запуск каждой зависимости из своего собственного контейнера. Затем вы можете определить отношения между контейнерами с помощью Docker Compose, как показано в примере. Docker Compose более подробно описан в этой Docker Compose статье.

Другой пример того, как заставить приложение работать в нескольких контейнерах, читайте в этой статье о запуске https://www.digitalocean.com/community/tutorials/how-to-install-wordpress-and-phpmyadmin-with-docker-compose. -on-ubuntu-14-04 [WordPress и phpMyAdmin с Docker Compose].

Шаг 6 - Создайте тестовый скрипт

Теперь мы создадим тестовый скрипт для вашего приложения Python. Это будет простой скрипт, который проверяет HTTP-вывод приложения. Сценарий является примером типа теста, который вы, возможно, захотите выполнить в рамках процесса развертывания непрерывной интеграции.

Редактировать новый файл:

nano test.sh

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

test.sh

sleep 5
if curl web | grep -q '<b>Visits:</b> '; then
 echo "Tests passed!"
 exit 0
else
 echo "Tests failed!"
 exit 1
fi

+ test.sh + тестирует основные веб-соединения нашего приложения Hello World. Он использует cURL для получения количества посещений и отчетов о том, был ли тест пройден или нет.

Шаг 7 - Создайте среду тестирования

Чтобы протестировать наше приложение, нам нужно развернуть среду тестирования. И мы хотим убедиться, что она идентична среде живого приложения, которую мы создали в * Шаг 5 *.

Во-первых, нам нужно Dockerize наш скрипт тестирования, создав новый файл Dockerfile. Редактировать новый файл:

nano Dockerfile.test

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

Dockerfile.test

FROM ubuntu:trusty

RUN apt-get update && apt-get install -yq curl && apt-get clean

WORKDIR /app

ADD test.sh /app/test.sh

CMD ["bash", "test.sh"]

+ Dockerfile.test + расширяет официальный образ + ubuntu: trusty + для установки зависимости + curl +, добавляет + tests.sh + в файловую систему образа и указывает команду + CMD +, которая выполняет тестовый скрипт с баш.

Как только наши тесты Dockerized, они могут выполняться реплицируемым и независимым способом.

Следующий шаг - связать наш тестовый контейнер с нашим приложением «Hello World». Здесь Docker Compose снова приходит на помощь. Редактировать новый файл:

nano docker-compose.test.yml

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

докер-compose.test.yml

sut:
 build: .
 dockerfile: Dockerfile.test
 links:
   - web
web:
 build: .
 dockerfile: Dockerfile
 links:
   - redis
redis:
 image: redis

Вторая половина файла Docker Compose развертывает основное приложение + web + и его зависимость + redis + так же, как и предыдущий файл + docker-compose.yml +. Это часть файла, которая определяет контейнеры + web + и + redis +. Единственное отличие состоит в том, что контейнер + web + больше не предоставляет порт 80, поэтому приложение не будет доступно через общедоступный Интернет во время тестов. Итак, вы можете видеть, что мы создаем приложение и его зависимости точно так же, как в реальном развертывании.

Файл + docker-compose.test.yml + также определяет контейнер + sut + (названный для system в tests), который отвечает за выполнение наших интеграционных тестов. Контейнер + sut + определяет текущий каталог как наш каталог + build + и определяет наш файл + Dockerfile.test +. Он ссылается на контейнер + web +, поэтому IP-адрес контейнера приложения доступен для нашего сценария + test.sh +.

  • Как настроить для вашего собственного приложения *

Обратите внимание, что + docker-compose.test.yml + может включать в себя десятки внешних сервисов и несколько тестовых контейнеров. Docker сможет запустить все эти зависимости на одном хосте, потому что каждый контейнер использует общую ОС.

Если у вас есть больше тестов для запуска в вашем приложении, вы можете создать для них дополнительные Dockerfiles, аналогично файлу + Dockerfile.test +, показанному выше.

Затем вы можете добавить дополнительные контейнеры ниже контейнера + sut + в файле + docker-compose.test.yml +, ссылаясь на дополнительные файлы Dockerfiles.

Шаг 8 - Протестируйте приложение «Hello World»

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

docker-compose -f ~/hello_world/docker-compose.test.yml -p ci build

Эта команда создает локальные образы, необходимые для + docker-compose.test.yml +. Обратите внимание, что мы используем + -f + для указания на + docker-compose.test.yml + и + -p + для указания конкретного имени проекта.

Теперь раскрутите свою свежую среду тестирования, выполнив:

docker-compose -f ~/hello_world/docker-compose.test.yml -p ci up -d

Проверьте вывод контейнера + sut +, выполнив:

docker logs -f ci_sut_1

Выход

 % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                Dload  Upload   Total   Spent    Left  Speed
100    42  100    42    0     0   3902      0 --:--:-- --:--:-- --:--:--  4200
Tests passed!

И наконец, проверьте код завершения контейнера + sut +, чтобы проверить, прошли ли ваши тесты:

docker wait ci_sut_1

Выход

0

После выполнения этой команды значение + $? + Будет + 0 +, если тесты пройдены. В противном случае наши тесты приложений не пройдены.

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

Это оно! Мы успешно провели наш тест в новой среде, идентичной нашей производственной среде.

Заключение

Благодаря Docker и Docker Compose мы смогли автоматизировать сборку приложения (+ Dockerfile +), развертывание локальной среды (+ docker-compose.yml +), сборку тестового образа (` + Dockerfile.test + ) и как выполнить (интеграционные) тесты ( + docker-compose.test.yml + `) для любого приложения.

В частности, преимущества использования файла + docker-compose.test.yml + для тестирования заключаются в следующем:

  • * Automatable *: способ, которым инструмент выполняет + docker-compose.test.yml +, не зависит от тестируемого приложения

  • * Легкий *: сотни внешних служб могут быть развернуты на один хост, имитирующий сложные (интеграционные) тестовые среды

  • * Agnostic *: избегайте блокировки поставщика CI, и ваши тесты могут выполняться в любом инфраструктура и на любой ОС, которая поддерживает Docker

  • * Неизменный *: тесты, проходящие на вашем локальном компьютере, пройдут в вашем инструменте CI

В этом руководстве показан пример тестирования простого приложения «Hello World».

Теперь пришло время использовать ваши собственные файлы приложений, Dockerize ваши собственные сценарии тестирования приложений и создать свой собственный + docker-compose.test.yml + для тестирования вашего приложения в свежей и неизменной среде.

Related