SlideShare a Scribd company logo
Процесс разработки и
тестирования с
Docker + Gitlab CI
Сигачев А. (Inventos)
О чем доклад?
● Продолжаем изучать docker и учить других (https://goo.gl/pXlO6U)
● Делимся опытом
● проповедуем докеризацию всего :-)
Какие проблемы решаем?
быстрый вход нового разработчика в проект
стандартизация настроек разработчиков
переключение между проектами - разные версии ПО и библиотек (mysql
5.6/5.7, node 0.12/7.2)
приучаем разработчиков к сетевому взаимодействию компонентов
Microservice - масштабирование/разделения разработки
Инструменты:
1. docker - Dockerfile - как документация описания зависимостей
2. docker-compose - инструмент связывающий компоненты
3. gitlab - хранилище кода
4. gitlab-ci - Система интеграции
Часть I
Машина разработчика
Dockerfile
FROM ruby:2.3.0
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /app
WORKDIR /app
ADD Gemfile /app/Gemfile
ADD Gemfile.lock /app/Gemfile.lock
RUN bundle install
ADD . /app
EXPOSE 3000
CMD ['puma', '-C', 'config/puma.rb']
docker-compose.yml
version: '2'
services:
db:
image: mysql:5.7.14
web:
build: .
command: bundle exec rails s -p 3000 -b '0.0.0.0'
volumes:
- .:/app
ports:
- "3000:3000"
depends_on:
- db
База данных - mysql
Фиксируем версию базы в проекте
Единый hostname/login/password для всех разработчиков
начальная настройка конфигурации базы данных
Backend
Системная версия ruby/python/nodejs/etc.
Не нужно переключаться между версиями, pyenv/rbenv/etc
Появляется возможность версионирования изменений кода + зависимостей
Результат сборки везде одинаковый
frontend
Разработка react nodejs
Сборка webpack + nodejs
Отдача статики - nginx
Схема компонентов
API rest
RoR
DB
android
ios
Admin
rest-js
push task
rest
nodejs
DB
redis
android
ios
android
ios
push для устройства
browse
Делаем микросервисы - контейнеры
Переиспользование кода в новых проектах. Как интегрировать?
A. db-api - mysql 5.7
B. rest-api - Ruby 2.3 on Rails 5
C. nginx - static files
D. admin - rest-client - javascript nodejs v7
E.push-msg сервис по api
a. nodejs v4.2
b. db-push v5.7
Добавляем в проект docker
Добавляем в проект Dockerfile
в docker-compose.yml описываем зависимости и компоненты
добавляем папку docker где храним конфиги сервисов
docker
├���─ mysql
│ ├── entrypoint.sh
│ └── my.cnf
└── nginx
└── static.conf
Объединяем компоненты в development
Добавляем репозиторий отвечающий за совместный запуск компонентов
dockerized-app
./
├── admin
├── dockerized-app
├── informer_api
└── push-msg
Объединение компонентов - docker-compose
Краткая документация по работе
Конфигурация - development
Запускать ядра + компоненты
Изолированная сеть
./
├── docker
│ ├── mysql
│ │ ├──
create_db_informer_push.sh
│ │ ├── entrypoint.sh
│ │ └── my.cnf
│ └── nginx
│ └── base_proxy.conf
├── docker-compose-push.yaml
├── docker-compose.yml
└── README.md
Описание компонентов
version: '2'
services:
balancer:
image: jwilder/nginx-proxy
....
api.informer.dev:
build: ../informer_api
….
admin.informer.dev:
build: ../admin
….
dbrw:
image: mysql:5.7.17
….
Доступ к приложению
dns через /etc/hosts - api.informer.dev admin.informer.dev static.informer.dev
client
nginx-proxy
host-ip:80
nginx-js-admin
10.0.9.5:80
rails
10.0.9.4:3000
nginx-static
10.0.9.3:80
images-files
virtual-network
Пример докеризации - mysql
1. Официальная страница - https://hub.docker.com/_/mysql/
2. docker-entrypoint.sh - правим для своих нужд инициализации
3. Конфигурация через ENV variables (docker-compose.yml)
MYSQL_ALLOW_EMPTY_PASSWORD: 1
MYSQL_USER: api
MYSQL_PASSWORD: topsecret
MYSQL_DATABASE : api
Процесс разработки и тестирования с  Docker + gitlab ci
Часть 2
gitlab-ci и Staging в облаках
Доклад по gitlab - https://goo.gl/uohKjI
simplecloud - https://goo.gl/KfytA8
gitlab-ci - просто добавь .gitlab-ci.yml
stages:
- test
- deploy
test:
stage: test
script:
- docker-compose -f docker-compose-staging.yml build api-test
- docker-compose -f docker-compose-staging.yml run api-test rake db:migrate test
deploy_staging:
stage: deploy
script:
- docker-compose -f docker-compose-staging.yml down
- docker-compose -f docker-compose-staging.yml up -d
- docker-compose -f docker-compose-staging.yml run api rake db:migrate
only:
- master
Gitlab Runner
GitLab Runner is written in Go and can be run as a single
Shell
Docker
Docker Machine and Docker Machine SSH (auto-scaling)
Parallels
VirtualBox
SSH
Kubernetes
Тесты пройдены новая версия доставлена
Процесс разработки и тестирования с  Docker + gitlab ci
История сборок
Staging
Система состоит из компонентов - разрабатываемых не зависимо
Как организовать перезапуск части после коммита?
Как поделить 80 порт между 2, 3, … 5x приложениями?
Ответы:
Настраиваем 1 gitlab-runner на репозитарии проекта.
Создаем виртуальную сеть для использования в docker-compose.yml
��ля каждого microservice описываем свой docker-compose.yml
Выносим nginx-proxy-balancer в отдельный docker-compose.yml
подключаем в него созданные виртуальные сети.
root в контейнере и non root user:
По умолчанию пользователь в контейнере root и созданные файлы получают права
root:root
Можно создать пользователя и выполнять приложение от его имени
sudo/gosu/setuid/Dockerfile USER
Если uid и gid в контейнере и пользователя разработчика не совпадут - проблема с
правами
Проблему решили:
RUN groupadd --gid 1000 app && useradd --uid 1000 --gid 1000 app --shell /bin/bash
Планы:
Перечитать документацию docs.docker.com
Освоить swarm cluster + deploy
Центральное логирование docker-cluster -> elasticsearch
Вопросы?
Вступаем https://vk.com/orelrb
orel-rb.ru
Сигачев Александр (Инвентос)

More Related Content

Процесс разработки и тестирования с Docker + gitlab ci

  • 1. Процесс разработки и тестирования с Docker + Gitlab CI Сигачев А. (Inventos)
  • 2. О чем доклад? ● Продолжаем изучать docker и учить других (https://goo.gl/pXlO6U) ● Делимся опытом ● проповедуем докеризацию всего :-)
  • 3. Какие проблемы решаем? быстрый вход нового разработчика в проект стандартизация настроек разработчиков переключение между проектами - разные версии ПО и библиотек (mysql 5.6/5.7, node 0.12/7.2) приучаем разработчиков к сетевому взаимодействию компонентов Microservice - масштабирование/разделения разработки
  • 4. Инструменты: 1. docker - Dockerfile - как документация описания зависимостей 2. docker-compose - инструмент связывающий компоненты 3. gitlab - хранилище кода 4. gitlab-ci - Система интеграции
  • 6. Dockerfile FROM ruby:2.3.0 RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs RUN mkdir /app WORKDIR /app ADD Gemfile /app/Gemfile ADD Gemfile.lock /app/Gemfile.lock RUN bundle install ADD . /app EXPOSE 3000 CMD ['puma', '-C', 'config/puma.rb']
  • 7. docker-compose.yml version: '2' services: db: image: mysql:5.7.14 web: build: . command: bundle exec rails s -p 3000 -b '0.0.0.0' volumes: - .:/app ports: - "3000:3000" depends_on: - db
  • 8. База данных - mysql Фиксируем версию базы в проекте Единый hostname/login/password для всех разработчиков начальная настройка конфигурации базы данных
  • 9. Backend Системная версия ruby/python/nodejs/etc. Не нужно переключаться между версиями, pyenv/rbenv/etc Появляется возможность версионирования изменений кода + зависимостей Результат сборки везде одинаковый
  • 10. frontend Разработка react nodejs Сборка webpack + nodejs Отдача статики - nginx
  • 11. Схема компонентов API rest RoR DB android ios Admin rest-js push task rest nodejs DB redis android ios android ios push для устройства browse
  • 12. Делаем микросервисы - контейнеры Переиспользование кода в новых проектах. Как интегрировать? A. db-api - mysql 5.7 B. rest-api - Ruby 2.3 on Rails 5 C. nginx - static files D. admin - rest-client - javascript nodejs v7 E.push-msg сервис по api a. nodejs v4.2 b. db-push v5.7
  • 13. Добавляем в проект docker Добавляем в проект Dockerfile в docker-compose.yml описываем зависимости и компоненты добавляем папку docker где храним конфиги сервисов docker ├── mysql │ ├── entrypoint.sh │ └── my.cnf └── nginx └── static.conf
  • 14. Объединяем компоненты в development Добавляем репозиторий отвечающий за совместный запуск компонентов dockerized-app ./ ├── admin ├── dockerized-app ├── informer_api └── push-msg
  • 15. Объединение компонентов - docker-compose Краткая документация по работе Конфигурация - development Запускать ядра + компоненты Изолированная сеть ./ ├── docker │ ├── mysql │ │ ├── create_db_informer_push.sh │ │ ├── entrypoint.sh │ │ └── my.cnf │ └── nginx │ └── base_proxy.conf ├── docker-compose-push.yaml ├── docker-compose.yml └── README.md
  • 16. Описание компонентов version: '2' services: balancer: image: jwilder/nginx-proxy .... api.informer.dev: build: ../informer_api …. admin.informer.dev: build: ../admin …. dbrw: image: mysql:5.7.17 ….
  • 17. Доступ к приложению dns через /etc/hosts - api.informer.dev admin.informer.dev static.informer.dev client nginx-proxy host-ip:80 nginx-js-admin 10.0.9.5:80 rails 10.0.9.4:3000 nginx-static 10.0.9.3:80 images-files virtual-network
  • 18. Пример докеризации - mysql 1. Официальная страница - https://hub.docker.com/_/mysql/ 2. docker-entrypoint.sh - правим для своих нужд инициализации 3. Конфигурация через ENV variables (docker-compose.yml) MYSQL_ALLOW_EMPTY_PASSWORD: 1 MYSQL_USER: api MYSQL_PASSWORD: topsecret MYSQL_DATABASE : api
  • 20. Часть 2 gitlab-ci и Staging в облаках Доклад по gitlab - https://goo.gl/uohKjI simplecloud - https://goo.gl/KfytA8
  • 21. gitlab-ci - просто добавь .gitlab-ci.yml stages: - test - deploy test: stage: test script: - docker-compose -f docker-compose-staging.yml build api-test - docker-compose -f docker-compose-staging.yml run api-test rake db:migrate test deploy_staging: stage: deploy script: - docker-compose -f docker-compose-staging.yml down - docker-compose -f docker-compose-staging.yml up -d - docker-compose -f docker-compose-staging.yml run api rake db:migrate only: - master
  • 22. Gitlab Runner GitLab Runner is written in Go and can be run as a single Shell Docker Docker Machine and Docker Machine SSH (auto-scaling) Parallels VirtualBox SSH Kubernetes
  • 23. Тесты пройдены новая версия доставлена
  • 26. Staging Система состоит из компонентов - разрабатываемых не зависимо Как организовать перезапуск части после коммита? Как поделить 80 порт между 2, 3, … 5x приложениями?
  • 27. Ответы: Настраиваем 1 gitlab-runner на репозитарии проекта. Создаем виртуальную сеть для использования в docker-compose.yml Для каждого microservice описываем свой docker-compose.yml Выносим nginx-proxy-balancer в отдельный docker-compose.yml подключаем в него созданные виртуальные сети.
  • 28. root в контейнере и non root user: По умолчанию пользователь в контейнере root и созданные файлы получают права root:root Можно создать пользователя и выполнять приложение от его имени sudo/gosu/setuid/Dockerfile USER Если uid и gid в контейнере и пользователя разработчика не совпадут - проблема с правами Проблему решили: RUN groupadd --gid 1000 app && useradd --uid 1000 --gid 1000 app --shell /bin/bash
  • 29. Планы: Перечитать документацию docs.docker.com Освоить swarm cluster + deploy Центральное логирование docker-cluster -> elasticsearch