Как Vagrant и Chef ускорили разработку в несколько раз /...
-
Upload
ontico -
Category
Engineering
-
view
284 -
download
4
Transcript of Как Vagrant и Chef ускорили разработку в несколько раз /...
Обо мнеИнженер по эксплуатации в Cinarra Systems • Тимур Батыршин • [email protected] • @erthad
Ситуация год назад• Инфраструктурой еще никто не занимается
• Более 10 сильносвязанных компонентов приложения
• Много конфигов • Тесты зависят от данных
Проблемы• Долгий деплой • Сложность конфигурации • Создание окружений • Синхронизация тестовых окружений
• Воспроизводимость
Шаблоны Chef• Плохо работают для часто меняющихся конфигов
• Много лишней работы для большого числа параметров
Augeas$ cat /etc/nginx/nginx.conf user www-‐data; worker_processes 4;
events { multi_accept on; }
http { sendfile on; tcp_nopush on; tcp_nodelay on; gzip on; }
Augeas$ augtool print /files/etc/nginx/nginx.conf /files/etc/nginx/nginx.conf /files/etc/nginx/nginx.conf/user = "www-‐data" /files/etc/nginx/nginx.conf/worker_processes = "4" /files/etc/nginx/nginx.conf/events /files/etc/nginx/nginx.conf/events/multi_accept = "on" /files/etc/nginx/nginx.conf/http /files/etc/nginx/nginx.conf/http/sendfile = "on" /files/etc/nginx/nginx.conf/http/tcp_nopush = "on" /files/etc/nginx/nginx.conf/http/tcp_nodelay = "on" /files/etc/nginx/nginx.conf/http/gzip = "on"
Augeas (ресурс Chef)augeas_template "/etc/cinarra/cate/cate.conf" do template "/etc/cinarra/cate/cate.conf.sample" lens "IniFile" parameters( "CATE/logging_lev" => node.cate.log_level, "CATE/cmgw_host" => node.cate.cmgw_host, "CATE/csync_host" => node.cate.csync_host, "CATE/csync_port" => node.cate.csync_port ) notifies :run, "execute[supervisorctl restart cate]" end
Augeas$ cat /etc/cinarra/cate/cate.conf.sample [CATE] instance_id = 1 logging_lev = 6 cate_thread_n = 2 cmgw_host = 127.0.0.1 cmgw_num = 2 csync_enabled = true csync_host = 127.0.0.1 csync_port = 1234
Augeas$ cat /etc/cinarra/cate/cate.conf [CATE] instance_id = 1 logging_lev = 3 # cate.log_level = 3 cate_thread_n = 2 cmgw_host = 10.0.0.2 # cate.cmgw_host = 10.0.0.2 cmgw_num = 2 csync_enabled = true csync_host = 10.0.0.3 # cate.csync_host = 10.0.0.3 csync_port = 1234 # cate.csync_port = nil
Плюсы Augeas• Всеми конфигами управляем единообразно
• Поддерживает почти все форматы конфигов
• Строгий — встроенная валидация синтаксиса
• Можно расширять
Минусы Augeas• Расширять сложно • Плохо работает с нестрогими форматами
• Форматов обычно мало — теряет смысл
Образ сервера• Jenkins ежедневно собирает AMI при помощи Packer
• Публикует Vagrant box в нашем репозитории Vagrant
Vagrant box• Packer создает его, если указан постпроцессор
• Кладем файл .box на локальный HTTP
• Обновляем JSON с информацией о версиях
Vagrant box$ cat ~/.vagrant.d/boxes/cinarra-‐VAGRANTSLASH-‐baseami-‐daily-‐1.2/1.0.174/aws/Vagrantfile
Vagrant.configure("2") do |config| config.vm.provider "aws" do |aws| aws.region_config "eu-‐west-‐1", ami: "ami-‐fb384f8c" end end
vagrant box updateVagrant ищет JSON на http://vagrantcloud.com/box_name
ubuntu/precise64 ⟶
http://vagrantcloud.com/ubuntu/precise64
Vagrant box { "name": "orgname/baseami", "description": "Our brand new vagrant box", "versions": [
{ "version": "1.0.1", "providers": [ { "name": "aws", "url": "http://www.example.com/boxes/orgname/baseami/1.0.1/packer_amazon-‐ebs_aws.box" }]},
{ "version": "1.0.2", "providers": [ { "name": "aws", "url": "http://www.example.com/boxes/orgname/baseami/1.0.2/packer_amazon-‐ebs_aws.box" }]} ]}
Разработчику# Делается один раз при добавлении box-‐а
export \ VAGRANT_SERVER_URL="http://www.example.com/boxes" vagrant box add orgname/baseami
# Перед работой каждый день
vagrant box update vagrant up
# После работы
vagrant destroy
Проблемы• Параметры разбросаны по всей конфигурации
• Кнопка “Advanced” • Сложно менять сразу несколько сборок
• Работать в UI медленно
Центральная сборка• Задает дополнительные параметры
• Checkout всех git repo • Запускает сборки с нужными параметрами
• Достает и публикует тесты и артефакты
Другие варианты• Правка config.xml • Jenkins API • Workflow plugin
https://wiki.jenkins-ci.org/display/JENKINS/Workflow+Plugin • Build Flow plugin
https://wiki.jenkins-ci.org/display/JENKINS/Build+Flow+Plugin • Job DSL plugin
https://wiki.jenkins-ci.org/display/JENKINS/Job+DSL+Plugin
Workflow pluginecho "Building in ${env.BASEDIR}" parallel cnrMain: { echo "Building cnr-‐main" dir("cnr-‐main") { gitCheckout( "https://github.com/cinarra/cnr-‐main.git", "remotes/origin/${CNR_BRANCH}", CNR_CREDENTIALS, CNR_BUILD_TAG ) sh "make clean deb" archive includes: "**/*.deb", fingerprint: true } }, cnrCWS: { echo "Building cnr-‐cws" . . . . . . . . . . . }
Спасибо! Мы ищем программистов
Тимур Батыршин: • [email protected] • @erthad • http://slideshare.net/erthad