Top Banner
CI на базе Docker 28.01.2016 Хрусталев Юрий
18

Ci на базе docker

Feb 08, 2017

Download

Education

Ivan Grishaev
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Ci на базе docker

CI на базе Docker28.01.2016 Хрусталев Юрий

Page 2: Ci на базе docker

Требования

● Аддитивность процесса● Поддержка более 5 версий ОС● Сборка .deb/.rpm пакетов● Возможность добавлять новые билды● Недорогая поддержки● Работа с jenkins● Более одного хоста под билдер

Page 3: Ci на базе docker

Требования +

● Декларация зависимостей● Версионированность● Использование в разработке

○ у нас люди не только под centos сидят○ мы не флексибл, есть люди с osx

Page 4: Ci на базе docker

Пробуем VM

● Виртуализация на уровне хоста ● N VM под каждую систему● Свой IP, ssh, довольно просто портить● Быстрое замусоривание

○ Никто не ведет лог изменений○ Теряется связь с реальностью

● Нельзя запускать локально

Page 5: Ci на базе docker

Пробеум LXC

● Виртуализация на уровне ядра● Обвязка скриптов для жизненного цикла● Контейнер живет только во время исполнения● Нельзя запускать локально● wiki в 10 экранов описания● puppet для синхронизации

Page 6: Ci на базе docker

Jenkins

Server A - debian 7● foo● bar● baz

Server A - debian 8● foo● bar● baz

Server A - centos 7● foo● bar● baz

Server B - centos 7● alfa● beta

Server B Deps - centos 7● boost● thrift

Server A Deps - debian 8● boost● nodejs● ruby

Page 7: Ci на базе docker

Надводные камни

● Все еще не версионируем● Не знаем что установлено на той или иной машине

○ Точнее не уверенны○ Мало кто хочет этим заниматься○ Люди уже не любят .deb/.rpm (и в чем-то они правы)

● Считаем дни до падения билдера, чтобы начать все заново● Эксплуатируется не квалифицированным персоналом

○ Все у кого ключ есть, от уборщицы до талисмана команды

Page 8: Ci на базе docker

Чем усугубили

Build the world

Build Server A

Build Server D

Build Server CDeb7

Build Server C Deb8

> touch readme.md> git add readme.md> git commit -m ‘42’> git push> ..> ..> ?

Page 9: Ci на базе docker

Результат

● Собрать маленький пакет - собираешь все

● Собрать старый бранч - собирается не все

● Добавляешь новую ОС - привет проблемы выше

● Хочется взять и переписать● Проходной двор

Page 10: Ci на базе docker

Docker

Page 11: Ci на базе docker

Как это выглядит?

● Хранится в Git ● Описывается Dockerfile● Храним описание образов● Конфигурацию jenkins ● Используем makefile

○ make build○ make package-thing○ make jenkins-sync

Page 12: Ci на базе docker

Преимущества

● Работает более-менее везде одинаково● Можно использовать для разработки ● Легко собрать● Легко версионировать● Кеширование образов

Page 13: Ci на базе docker

Проблемы

● Нет хуков на выполнение команд до/после run● Образ stateless

○ UID пользователя

● Нет хардлинков host/docker● Сложности с пробросом переменных окружения● Сложность с монтированием

○ UID хоста и контейнера разные в общем случае ○ решаемо очередным makefile-ом

Page 14: Ci на базе docker

Пример

project_repo/ (git)|- app1/| |- src/| |- test/|- app2/|- ...|- builders/ (git submodule) |- server-type-A/ |- server-type-B/ |- Dockerfile |- image_files/ | |- config.conf |- jenkins/ |- app1.xml |- app2.xml |- server-A.xml

Page 15: Ci на базе docker

Пример

cd /path/to/image

# построитьdocker \

--build-arg HOST_UID=$(HOST_UID) \-t myimage .

# собрать пакетdocker run -it --rm \

-v `pwd`/../../:/repo \-v $(CACHE_DIR):/cache \-w /repo/program \-e CXX=clang++ \-e DEBUG=1 \myimage /bin/bash -c './package && ./test'

Page 16: Ci на базе docker

Пример

FROM debian:jessie# aptENV DEBIAN_FRONTEND noninteractiveRUN apt-get update && apt-get upgrade -y \ && apt-get install --no-install-recommends -y \ build-essential

# pipRUN pip install -U pipENV XDG_CACHE_HOME /cache/pip

# user ARG HOST_UIDARG HOST_GIDRUN (getent group ${HOST_GID} || groupadd -g ${HOST_GID} hostgroup) \ && adduser --disabled-password --gecos '' worker --uid ${HOST_UID} --gid ${HOST_GID}USER worker

Page 17: Ci на базе docker

Что дальше?

● Заменить .deb на контейнеры● Деплоить docker-ом● Не знать горя и бед ● Технология не идеально,

○ но работает!

Page 18: Ci на базе docker

Вопросы?