Простейший CD с использованием TeamCity, Docker и Ansible · AboutNet

AboutNet all about networks

Простейший CD с использованием TeamCity, Docker и Ansible

На данном примере я первый раз познакомился с TeamCity и создал нечто похожее на настоящий CD (Continious Deployment). Все используемые в примере файлы можно найти по данной ссылке.

Начнем с задачи:

  1. Есть примитивное приложение, написанное на Python, которое слушает порт 8080 и в ответ возвращает строку “It Works”;
  2. Необходимо распространять данное приложение на определенную группу хостов (в примере - localhost) в виде Docker контейнера.

Структура CD следующая:

  1. В локальном репозитории создается приложение с названием python-listener.py;
  2. Данный код собирается в Docker контейнер при помощи Dockerfile (также находится в репозитории);
  3. В том же репозитории создан Ansible playbook для распространения Docker контейнера;
  4. После всех произведенных в коде изменений требуется сделать git push origin master для публикации изменений в мастер ветку на GitHub;
  5. Для сборки контейнера на агенте и его распространения на необходимые серверы (в примере - localhost) используется TeamCity, который запускает Ansible playbook.

Шаги по установке TeamCity и его агента в Docker контейнер пропущены, как не требующие особых пояснений. В качестве БД для TeamCity я использовал PostgreSQL, запущенную в Docker контейнере на том же хосте.

Описание приложения на Python можно посмотреть здесь.

Dockerfile, при помощи которого собирается контейнер имеет следующий вид:

FROM alpine:latest
RUN mkdir /etc/python-listener
RUN apk update
RUN apk add python
ADD ./src/default.conf /etc/python-listener/
ADD ./src/python-listener.py /etc/python-listener/
CMD ["python", "/etc/python-listener/python-listener.py"]
EXPOSE 8080

Данный Dockerfile при сборке образа описывает следующее:

  1. В качестве базового образа используется легковесный дистрибутив Alpine последней доступной версии;
  2. Создается директория /etc/python-listener, в которой будут находиться файлы приложения;
  3. Устанавливается python2;
  4. С хоста, на котором собирается образ (либо из Git), копируются файл default.conf и код приложения python-listener.py;
  5. Приложение запускается;
  6. Контейнер слушает порт 8080 (для того, чтобы данный порт был доступен снаружи, при создании контейнера необходимо использовать ключ -p x:8080).

Следующая ступень - Ansible playbook, который распространяет образ. В роли playbook следует отметить следующий момент - используется библиотека docker-py, которая устанавливается в Python virtual environment для того, чтобы случайно не сломать Python на хостах, где происходит поднятие контейнера (метод подсмотрен у коллег). В остальном, playbook использует модуль Ansible docker_container, который описан в документации.

То, ради чего написана эта статья - работа с TeamCity. Стоит учитывать, что на момент написания статьи, автор имеет около часа опыта работы с TeamCity, поэтому используемые методы, вероятно, очень далеки от совершенства (два из трех этапов сборки используют shell).

Логика следующая:

  1. Добавляется новый проект Python-CD;
  2. В проекте в VCS (Version Control Settings) указывается GitHub репозиторий;
  3. Создаются три шага сборки:
    • Docker build на TeamCity агенте (он был предложен автоматически и заработал без применения каких-либо дополнительных настроек);
    • Push образа с TeamCity агента в Docker Hub (используется command line: docker login -u avtandilko -p ***** && docker push avtandilko/python-listener);
    • Deploy образа из Docker Hub с использованием ssh exec (запуск playbook на указанном хосте командойansible-playbook /opt/python-listener/deploy-python-listener-container.yml -i hosts).

Таким образом, после редактирования кода приложения и его push в GitHub достаточно нажать на одну кнопку для того, чтобы контейнер с приложением распространился на все необходимые хосты. При этом, если какой-то шаг окажется неудачным (например, сборка образа) дальнейшие шаги выполняться не будут.

Categories: Containers