SlideShare a Scribd company logo
Openstack Third-Party CI и
обзор компонент тестовой
инфраструктуры
Евгений Антышев, Virtuozzo
eantyshev@virtuozzo.com
skype: Evgeny.Antyshev
Более 600 активных разработчиков(!)
54 команды, у каждой в среднем 10 проектов, от 1 до 138 (Infrastructure)
http://git.openstack.org/cgit/openstack/governance/plain/reference/projects.yaml
1. Основной язык -- Python. Затем: Shell, Puppet. Для данных: Yaml, ini-config, json.
2. Общая структура репозиториев: README.md, testr unittests, tox virtualenv wrapper
3. Общий процесс разработки: git, gerrit review
Gerrit workflow
Задачи third-party CI:
1)Верификация входящих патчей на
своем окружении
2)Верификация third-party компонент как
необходимое условие для их принятия
сообществом
3)Стабильность third-party CI создает
хорошую репутацию в сообществе
Openstack CI scaling
“Jenkins”:
upstream CI robot
780 проектов
~900 workers
~20k events/day
Virtuozzo CI,
Virtuozzo Storage CI
3 проекта
3-6 workers
150 events/day
“Легенда”: удаленное
тестирование кода libvirt
• Разворачивание и обновление
тестовых сред с Ubuntu 14.04 LTS
(nodepool, diskimage-builder)
• Конфигурация тестовых задач для
Jenkins (Jenkins Jobs Builder)
• Управление запуском тестов (gearman)
Nodepool
Управление пулом тестовых серверов и
загрузочными образами в Openstack
облаке
nodepool
Jenkins +
plugins:
ZMQ, Node
and Label,
Gearman
WorkerN
“Trusty-label”
qemu-kvm
ssh
REST API
“Trusty-label”
image
Ubuntu 14.04
(Trusty Tahr)
base image
my-setup.sh
1) Create/update images
2) Deploy nodes for Jenkins
and utilize when it
finishes with them
Gearman
server
Provider cloud
Nodepool: установка
1. PyPi
# pip install nodepool
2. Git sources
# git clone git://git.openstack.org/openstack-infra/nodepool.git
../nodepool # pip install -r requirements.txt
../nodepool # pip install .
3. puppet-nodepool project
# git clone git://git.openstack.org/openstack-infra/puppet-nodepool.git
Use README
Nodepool: конфигурация
/etc/nodepool/secure.conf
1) Создать пользователя jenkins, настроить ssh авторизацию и
sudo
2) apt-get update и установить dev пакеты
3) git clone git://libvirt.org/libvirt.git в /opt/git
/etc/nodepool-scripts/my-setup.sh
/etc/nodepool/nodepool.yaml
[database]
dburi=mysql+pymysql://nodepool:passwd@localhost/nodepooldb
[jenkins "jenkins1"]
user=jenkins
apikey=f828c94dbd53b7e2a055112ebbc90ea8
credentials=28755fdb-244a-4fcf-baee-496031323c12
url=http://10.94.136.33:8080/
Nodepool.yaml: header
script-dir: /etc/nodepool-scripts
elements-dir: /etc/nodepool-elements
images-dir: /opt/nodepool_dib
cron:
check: '*/15 * * * *'
cleanup: '*/1 * * * *'
image-update: '14 2 * * *'
zmq-publishers:
- tcp://localhost:8888
Nodepool.yaml
Jenkins label → image name
labels:
- name: trusty-label
image: trusty1
min-ready: 1
providers:
- name: openstack001-test
nodepool.yaml
Cloud providers
providers:
- name: openstack001-test
username: 'admin'
password: '5fcf6292e9a240e0'
auth-url: 'http://10.94.2.99:5000/v2.0/'
project-name: 'admin'
max-servers: 2
images:
- name: trusty1
base-image: trusty
setup: my-setup.sh
min-ram: 2048
username: jenkins
private-key: /opt/nodepool/jenkins_key
Nodepool command line
> nodepool hold 123
> nodepool delete 123
> nodepool image-update all trusty1
Nodepool: создание
загрузочных образов
Snapshot images
Base image
Temporary VM
my-setup.sh
Take a snapshot
diskimage-builder
(DIB) images
Base image
qemu-nbd mount
Prep. in chroot
Convert
Upload to provider
Преимущества diskimage-
builder:
1) Можно запускать в VM
1) Более структурированный способ задания
конфигурации
1) Легкое добавление готовых элементов в
конфигурацию
diskimage-builder: типичные
задачи для автоматизации
■адреса репозиториев
■пользователи, ключи ssh
■установка и конфигурация приложений
■разделы фс, настройки загрузки
(growroot и пр.)
■кеширование git репозиториев и пр.
DIB stages & elements
Stages: root.d, extra-data.d, install.d (in
chrooted env.), finalise.d, etc.
Elements:
• ubuntu-minimal: base OS
• vm: preparation to boot in QEMU
• simple-init: boot scripts to enable
DHCP for NICs
• growroot: expand root FS to cover
available disk space
DIB element “my-slave”
(derived from my-setup.sh)
/etc/nodepool-elements/my-slave/
package-installs.yaml -- sshd, dev packages
extra-data.d/
50-jenkins-pubkey -- copy key from host to mounted
image
install.d/
50-jenkins-user 60-cache-libvirt
finalise.d/
99-nodepool-dir -- nodepool needs /etc/nodepool
/etc/nodepool/nodepool.yaml:
diskimages:
- name: ubuntu-trusty
elements:
- ubuntu-minimal
- vm
- simple-init
- growroot
- my-slave
release: trusty
env-vars:
TMPDIR: /opt/dib_tmp
DIB_IMAGE_CACHE: /opt/dib_cache
/var/log/nodepool.log: disk-image-create -x -t qcow2 --no-tmpfs --qemu-img-
options 'compat=0.10' -o /opt/nodepool_dib/42 ubuntu-minimal vm simple-
init growroot my-slave
…
Image file /opt/nodepool_dib/42.qcow2 created…
nodepool.yaml: diskimages
Jenkins Job Builder
Конфигурация как код
Yaml вместо Xml
Шаблоны, группы, макросы
JJB builder: copy-update-source
- builder:
name: copy-update-source
builders:
- shell: |
mv /opt/git/libvirt $WORKSPACE
cd libvirt
git clean -f -x
git fetch -f --recurse-submodules=yes 
origin {branch}
git checkout FETCH_HEAD
JJB builder: test-libvirt
- builder:
name: test-libvirt
builders:
- shell: |
cd libvirt
./autogen.sh --system
make
sudo make install
libvirtd --version
sudo libvirtd -d
virsh list --all
JJB template
- job-template:
name: smoke-libvirt-{branch}
node: trusty-label || dib-trusty-label
builders:
- copy-update-source:
branch: '{branch}'
- test-libvirt
publishers:
- email:
recepients: 'eantyshev@virtuozzo.com'
JJB project
- project:
name: libvirt
branch:
- master
- v1.3.1-maint
jobs:
- smoke-libvirt-{branch}
Jenkins view
Gearman
Сервис распределения задач и
client/worker API
http://gearman.org
“We on Openstack infrastructure team use Jenkins extensively. Our jenkins servers, at peak load,
runs 20,000+ jobs per day. At that load we require many jenkins slaves (900+) to process all of
those build jobs. We have found that our requirement was pushing Jenkins beyond it's limits
therefore we've decided to create the Gearman Plugin to support multiple Jenkins masters. The
gearman plugin was designed to support extra slaves, allow load balancing of build jobs, and
provide redundancy.”
https://wiki.jenkins-ci.org/display/JENKINS/Gearman+Plugin
Gearman workflow example
1. Worker registers “reverse” function on Gearman server.
2. Client sends “reverse” request and parameters.
3. Gearman server chooses the worker and assigns the job.
4. Worker sends result to Client via Server.
Ubuntu 14.04:
apt-get install gearman-job-server
/etc/nodepool/nodepool.yaml:
gearman-servers:
- host: localhost
Jenkins -> Configure System -> Enable
Gearman
Установка gearman-server,
Gearman plugin (client)
Gearman interactions
in “libvirt CI”
gearmand
Gearman Client
(Python API)
Jenkins Gearman
plugin (Java API)
Nodepool (status
TCP requests +
images tasks)
Gear worker
Диагностика gearman: status
request
Status line fmt: Function <enqeued> <executing> <Nworkers>
root@test-nodepool:/etc/jenkins_jobs/config# telnet localhost 4730
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
status
build:smoke-libvirt-v1.3.1-maint 0 0 1
set_description:10.94.136.33 0 0 1
build:smoke-libvirt-master 0 0 1
stop:10.94.136.33 0 0 1
build:smoke-libvirt-v1.3.1-maint:dib-trusty-label 0 0 1
build:smoke-libvirt-master:dib-trusty-label 0 0 1
.
^]
telnet> Connection closed.
Job requests via Gear client
Python implementation:
http://pypi.python.org/pypi/gear
https://github.com/zaro0508/gearman-plugin-client
>python gear_client.py -s localhost -p 4730 --function build:smoke-libvirt-master:trusty-label --params
'{"OFFLINE_NODE_WHEN_COMPLETE":"true"}'
Zuul
Планирование тестовых
запусков для per-patch CI,
project gating для gerrit
http://docs.openstack.org/infra/zuul/
Zuul pipelines
Independent
check, post-
merge, periodic
Dependent
gate
HEAD 1
HEAD 2
HEAD 3
HEAD 1
2
3
Independent pipelines Dependent pipeline
http://status.openstack.org/zuul/
Материалы “libvirt CI”:
https://github.com/eantyshev/libvirt_ci
Полезные ссылки:
http://docs.openstack.org/infra/manual/
http://docs.openstack.org/infra/nodepool/
https://wiki.jenkins-ci.org/display/JENKINS/Gearman+Plugin
http://docs.openstack.org/infra/jenkins-job-builder/
Спасибо за внимание!
Вопросы?
Openstack Third-Party CI and the review of a few Openstack Infrastructure projects
Система ревью для git
Робот, управляющий запуском тестов
(gear python client)
Сервис очередей для распределения задач
Jenkins master (Gearman
worker)
Jenkins slave
(рабочие среды)
Создание и удаление рабочих сред,
обновление образов (Gearman queue
monitoring)
/etc/jenkins-jobs/config/libvirt.yaml:
- job-template:
name: smoke-{name}-{branch}
node: trusty-label || dib-trusty-label
JJB: node labels
smoke-libvirt job, take 2: split
builders
- job:
name: smoke-libvirt
project-type: freestyle
node: trusty-label
builders:
- shell: |
mv /opt/git/libvirt $WORKSPACE
cd libvirt
git clean -f -x
git fetch -f --recurse-submodules=yes 
origin master
git checkout FETCH_HEAD
- shell: |
./autogen.sh --system
make
sudo make install
libvirtd --version
sudo libvirtd -d
virsh list --all
publishers:
- email:
recepients: 'eantyshev@virtuozzo.com'
● root.d: Download cloud image (qcow2)
mount by qemu-nbd, submounts: /dev, /dev/pts, /sys, /proc + hooks dir
● environment.d: Set default environment vars
● extra-files.d: copy files to mounted image, f.e. ssh keys
Go chroot under mounted path
● pre-install.d, install.d, post-install.d: Executed in chroot
environment: set repo mirrors, install packages, configure apps
Copy root content to temp. Unmount amended image.
Make clean raw image file
● block-device.d: (auxiliary) Partition loopback block device
Create filesystem, mount the image (+/proc,dev,sys submounts), copy rootfs
contents from temp
● finalise.d: install/configure bootloader, other tools
● cleanup.d: cleanup temporary repos, unblock daemons
Unmount, convert from raw to qcow2
DIB stages
smoke-libvirt job, take 1
Недостатки: copy-paste when >1 job
Неструктурированная логика в
builders
1) Макрос copy-update-source с
параметром branch и макрос
test-libvirt
2) Job -> Job Template + Project
3) “project-type: freestyle” ->
defaults.yaml
- job:
name: smoke-libvirt
project-type: freestyle
node: trusty-label
builders:
- shell: |
mv /opt/git/libvirt $WORKSPACE
cd libvirt
git clean -f -x
git fetch -f --recurse-submodules=yes 
origin master
git checkout FETCH_HEAD
./autogen.sh --system
make
sudo make install
libvirtd --version
sudo libvirtd -d
virsh list --all
publishers:
- email:
recepients: 'eantyshev@virtuozzo.com'
JJB defaults
- defaults:
name: global
project-type: freestyle
concurrent: true
wrappers:
- timeout:
timeout: 30
fail: true
- timestamps
logrotate:
daysToKeep: 7
numToKeep: -1
artifactDaysToKeep: -1
artifactNumToKeep: -1
type: patchset-created, patchSet.ref: 'refs/changes/38/307638/1'
type: comment-added, comment: “Looks good overall, couple of ....”
type: patchset-created, patchSet.ref: ‘refs/changes/78/216378/38’
type: comment-added, comment: “blablabla...”
zuul-server (scheduler) zuul-merger (git server)
> gerrit event-stream
Gearman server
merger:merge 0 0 1
merger:update 0 0 1
Job requests:
merger:merge args{gerrit_url, project, ref}*
merger:update args{gerrit_url, project}
Merge job complete:
Zuul ref: commit id
git clone <url> /var/lib/zuul/git/<project>
git merge <ref>
In Jenkins job:
git fetch $ZUUL_URL $ref
Zuul workflow
Что дальше..?
• Как запускать тесты автоматически?
• Как регулировать число тестовых нод в
зависимости от нагрузки?
• Как масштабировать CI на несколько
Jenkins серверов?
- job:
name: test-example
builders:
- shell: ‘echo Success!’
<?xml version="1.0" encoding="utf-8"?>
<project>
<actions/>
<description>&lt;!-- Managed by Jenkins Job Builder --&gt;</description>
<keepDependencies>false</keepDependencies>
<blockBuildWhenDownstreamBuilding>false</blockBuildWhenDownstreamBuilding>
<blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding>
<concurrentBuild>false</concurrentBuild>
<canRoam>true</canRoam>
<properties/>
<scm class="hudson.scm.NullSCM"/>
<builders>
<hudson.tasks.Shell>
<command>echo Success!</command>
</hudson.tasks.Shell>
</builders>
<buildWrappers/>
</project>
Yaml to Xml
> jenkins-jobs test sample-job.yaml

More Related Content

PDF
Continuous Delivery Workshop with Ansible x GitLab CI (2nd+)
PDF
手把手帶你學Docker 03042017
PDF
DCSF 19 Deploying Rootless buildkit on Kubernetes
PDF
Docker workshop 0507 Taichung
PDF
K8s上の containerized cloud foundryとcontainerized open stackをprometheusで監視してみる
PDF
DCSF19 Tips and Tricks of the Docker Captains
PPT
Python virtualenv & pip in 90 minutes
PPTX
Docker practice
Continuous Delivery Workshop with Ansible x GitLab CI (2nd+)
手把手帶你學Docker 03042017
DCSF 19 Deploying Rootless buildkit on Kubernetes
Docker workshop 0507 Taichung
K8s上の containerized cloud foundryとcontainerized open stackをprometheusで監視してみる
DCSF19 Tips and Tricks of the Docker Captains
Python virtualenv & pip in 90 minutes
Docker practice

What's hot (18)

PDF
kubernetes practice
PDF
Hyperledger composer
PDF
Использование Docker в CI / Александр Акбашев (HERE Technologies)
PDF
Everything as a code
PDF
Kubernetes Story - Day 1: Build and Manage Containers with Podman
PDF
[Image Results] Java Build Tools: Part 2 - A Decision Maker's Guide Compariso...
PDF
파이썬 개발환경 구성하기의 끝판왕 - Docker Compose
PDF
Reproducibility of computational workflows is automated using continuous anal...
PDF
Django로 만든 웹 애플리케이션 도커라이징하기 + 도커 컴포즈로 개발 환경 구축하기
PDF
DCSF19 Dockerfile Best Practices
PDF
開放運算&GPU技術研究班
PDF
DCEU 18: Dockerfile Best Practices
PDF
sed.pdf
PDF
Scripting Support in GFv3 Prelude - Full Version
PPTX
Titanium 3.2 CLI - TiAppCamp2 - 11/2/2013
PDF
Drupal contrib module maintaining
PDF
Continuous Integration: SaaS vs Jenkins in Cloud
PPTX
Exploring the Titanium CLI - Codestrong 2012
kubernetes practice
Hyperledger composer
Использование Docker в CI / Александр Акбашев (HERE Technologies)
Everything as a code
Kubernetes Story - Day 1: Build and Manage Containers with Podman
[Image Results] Java Build Tools: Part 2 - A Decision Maker's Guide Compariso...
파이썬 개발환경 구성하기의 끝판왕 - Docker Compose
Reproducibility of computational workflows is automated using continuous anal...
Django로 만든 웹 애플리케이션 도커라이징하기 + 도커 컴포즈로 개발 환경 구축하기
DCSF19 Dockerfile Best Practices
開放運算&GPU技術研究班
DCEU 18: Dockerfile Best Practices
sed.pdf
Scripting Support in GFv3 Prelude - Full Version
Titanium 3.2 CLI - TiAppCamp2 - 11/2/2013
Drupal contrib module maintaining
Continuous Integration: SaaS vs Jenkins in Cloud
Exploring the Titanium CLI - Codestrong 2012
Ad

Viewers also liked (19)

PDF
Infrastructure-as-Code and CI Infrastructure at OpenStack
PDF
Kurs Triks tour
PDF
Путь в облака. А.Зобов.
PDF
Контроль за стилем кода — Кирилл Борисов
PDF
Григорий Липин: Автоматизация нагрузочного тестирования
PDF
«CI. Jenkins. 2GIS» — Игорь Павлов, 2ГИС
PDF
Дмитрий Пронин – Python для веба
PDF
jobDSL plugin: настройка jenkins ci скриптом
PPTX
Проблемы производительности open source библиотек
PDF
Непрерывный анализ качества кода с помощью SonarQube
PDF
юкк
PPTX
Highload в ВУЗе идеализм, расчётливый менеджмент или пустые надежды / Артем К...
PDF
Ceph BlueStore - новый тип хранилища в Ceph / Максим Воронцов, (Redsys)
PPT
Движение по хрупкому дну / Сергей Караткевич (servers.ru)
PDF
DC/OS – больше чем PAAS, Никита Борзых (Express 42)
PDF
Cloud computing
PDF
It meetup cd
PDF
Build Your Own PaaS, Just like Red Hat's OpenShift from LinuxCon 2013 New Orl...
PDF
Лучшие практики Continuous Delivery с Docker / Дмитрий Столяров (Флант)
Infrastructure-as-Code and CI Infrastructure at OpenStack
Kurs Triks tour
Путь в облака. А.Зобов.
Контроль за стилем кода — Кирилл Борисов
Григорий Липин: Автоматизация нагрузочного тестирования
«CI. Jenkins. 2GIS» — Игорь Павлов, 2ГИС
Дмитрий Пронин – Python для веба
jobDSL plugin: настройка jenkins ci скриптом
Проблемы производительности open source библиотек
Непрерывный анализ качества кода с помощью SonarQube
юкк
Highload в ВУЗе идеализм, расчётливый менеджмент или пустые надежды / Артем К...
Ceph BlueStore - новый тип хранилища в Ceph / Максим Воронцов, (Redsys)
Движение по хрупкому дну / Сергей Караткевич (servers.ru)
DC/OS – больше чем PAAS, Никита Борзых (Express 42)
Cloud computing
It meetup cd
Build Your Own PaaS, Just like Red Hat's OpenShift from LinuxCon 2013 New Orl...
Лучшие практики Continuous Delivery с Docker / Дмитрий Столяров (Флант)
Ad

Similar to Openstack Third-Party CI and the review of a few Openstack Infrastructure projects (20)

ODP
Automated reproducible images on openstack using vagrant and packer
PPTX
Scale tests nodepool
ODP
A CI/CD Pipeline to Deploy and Maintain OpenStack - cfgmgmtcamp2015
PDF
How Openstack is Built
PDF
RDO-Packstack Workshop
PDF
Continuous Infrastructure: Modern Puppet for the Jenkins Project - PuppetConf...
PDF
OpenSource ToolChain for the Hybrid Cloud
PDF
Kirill Rozin - Practical Wars for Automatization
PDF
Dockerized maven
PPTX
How OpenStack is Built - Anton Weiss - OpenStack Day Israel 2016
PPTX
Neutron CI Run on Docker
PDF
Puppet and the HashiStack
PPTX
Assembling an Open Source Toolchain to Manage Public, Private and Hybrid Clou...
PPTX
Xen Project CI for OpenStack Overview
PDF
Integrating icinga2 and the HashiCorp suite
PDF
Software industrialization
PDF
Extensible dev secops pipelines with Jenkins, Docker, Terraform, and a kitche...
PDF
Continuous Delivery with Maven, Puppet and Tomcat - ApacheCon NA 2013
PDF
Service Delivery Assembly Line with Vagrant, Packer, and Ansible
PDF
Jenkins_Online_Meetup-Jenkins_Kubernetes_Operator.pdf
Automated reproducible images on openstack using vagrant and packer
Scale tests nodepool
A CI/CD Pipeline to Deploy and Maintain OpenStack - cfgmgmtcamp2015
How Openstack is Built
RDO-Packstack Workshop
Continuous Infrastructure: Modern Puppet for the Jenkins Project - PuppetConf...
OpenSource ToolChain for the Hybrid Cloud
Kirill Rozin - Practical Wars for Automatization
Dockerized maven
How OpenStack is Built - Anton Weiss - OpenStack Day Israel 2016
Neutron CI Run on Docker
Puppet and the HashiStack
Assembling an Open Source Toolchain to Manage Public, Private and Hybrid Clou...
Xen Project CI for OpenStack Overview
Integrating icinga2 and the HashiCorp suite
Software industrialization
Extensible dev secops pipelines with Jenkins, Docker, Terraform, and a kitche...
Continuous Delivery with Maven, Puppet and Tomcat - ApacheCon NA 2013
Service Delivery Assembly Line with Vagrant, Packer, and Ansible
Jenkins_Online_Meetup-Jenkins_Kubernetes_Operator.pdf

Recently uploaded (20)

PPTX
Learning-Plan-5-Policies-and-Practices.pptx
PPTX
Relationship Management Presentation In Banking.pptx
PPTX
Primary and secondary sources, and history
PDF
Instagram's Product Secrets Unveiled with this PPT
PPTX
2025-08-10 Joseph 02 (shared slides).pptx
PDF
Parts of Speech Prepositions Presentation in Colorful Cute Style_20250724_230...
PPTX
worship songs, in any order, compilation
PPTX
Understanding-Communication-Berlos-S-M-C-R-Model.pptx
PPTX
Non-Verbal-Communication .mh.pdf_110245_compressed.pptx
PPTX
The spiral of silence is a theory in communication and political science that...
PPTX
Project and change Managment: short video sequences for IBA
DOCX
ENGLISH PROJECT FOR BINOD BIHARI MAHTO KOYLANCHAL UNIVERSITY
PPTX
Impressionism_PostImpressionism_Presentation.pptx
DOCX
"Project Management: Ultimate Guide to Tools, Techniques, and Strategies (2025)"
PPTX
Human Mind & its character Characteristics
PPTX
Tour Presentation Educational Activity.pptx
PPTX
BIOLOGY TISSUE PPT CLASS 9 PROJECT PUBLIC
PPTX
AcademyNaturalLanguageProcessing-EN-ILT-M02-Introduction.pptx
PPTX
The Effect of Human Resource Management Practice on Organizational Performanc...
PPTX
INTERNATIONAL LABOUR ORAGNISATION PPT ON SOCIAL SCIENCE
Learning-Plan-5-Policies-and-Practices.pptx
Relationship Management Presentation In Banking.pptx
Primary and secondary sources, and history
Instagram's Product Secrets Unveiled with this PPT
2025-08-10 Joseph 02 (shared slides).pptx
Parts of Speech Prepositions Presentation in Colorful Cute Style_20250724_230...
worship songs, in any order, compilation
Understanding-Communication-Berlos-S-M-C-R-Model.pptx
Non-Verbal-Communication .mh.pdf_110245_compressed.pptx
The spiral of silence is a theory in communication and political science that...
Project and change Managment: short video sequences for IBA
ENGLISH PROJECT FOR BINOD BIHARI MAHTO KOYLANCHAL UNIVERSITY
Impressionism_PostImpressionism_Presentation.pptx
"Project Management: Ultimate Guide to Tools, Techniques, and Strategies (2025)"
Human Mind & its character Characteristics
Tour Presentation Educational Activity.pptx
BIOLOGY TISSUE PPT CLASS 9 PROJECT PUBLIC
AcademyNaturalLanguageProcessing-EN-ILT-M02-Introduction.pptx
The Effect of Human Resource Management Practice on Organizational Performanc...
INTERNATIONAL LABOUR ORAGNISATION PPT ON SOCIAL SCIENCE

Openstack Third-Party CI and the review of a few Openstack Infrastructure projects

  • 1. Openstack Third-Party CI и обзор компонент тестовой инфраструктуры Евгений Антышев, Virtuozzo eantyshev@virtuozzo.com skype: Evgeny.Antyshev
  • 2. Более 600 активных разработчиков(!) 54 команды, у каждой в среднем 10 проектов, от 1 до 138 (Infrastructure) http://git.openstack.org/cgit/openstack/governance/plain/reference/projects.yaml 1. Основной язык -- Python. Затем: Shell, Puppet. Для данных: Yaml, ini-config, json. 2. Общая структура репозиториев: README.md, testr unittests, tox virtualenv wrapper 3. Общий процесс разработки: git, gerrit review
  • 4. Задачи third-party CI: 1)Верификация входящих патчей на своем окружении 2)Верификация third-party компонент как необходимое условие для их принятия сообществом 3)Стабильность third-party CI создает хорошую репутацию в сообществе
  • 5. Openstack CI scaling “Jenkins”: upstream CI robot 780 проектов ~900 workers ~20k events/day Virtuozzo CI, Virtuozzo Storage CI 3 проекта 3-6 workers 150 events/day
  • 6. “Легенда”: удаленное тестирование кода libvirt • Разворачивание и обновление тестовых сред с Ubuntu 14.04 LTS (nodepool, diskimage-builder) • Конфигурация тестовых задач для Jenkins (Jenkins Jobs Builder) • Управление запуском тестов (gearman)
  • 7. Nodepool Управление пулом тестовых серверов и загрузочными образами в Openstack облаке
  • 8. nodepool Jenkins + plugins: ZMQ, Node and Label, Gearman WorkerN “Trusty-label” qemu-kvm ssh REST API “Trusty-label” image Ubuntu 14.04 (Trusty Tahr) base image my-setup.sh 1) Create/update images 2) Deploy nodes for Jenkins and utilize when it finishes with them Gearman server Provider cloud
  • 9. Nodepool: установка 1. PyPi # pip install nodepool 2. Git sources # git clone git://git.openstack.org/openstack-infra/nodepool.git ../nodepool # pip install -r requirements.txt ../nodepool # pip install . 3. puppet-nodepool project # git clone git://git.openstack.org/openstack-infra/puppet-nodepool.git Use README
  • 10. Nodepool: конфигурация /etc/nodepool/secure.conf 1) Создать пользователя jenkins, настроить ssh авторизацию и sudo 2) apt-get update и установить dev пакеты 3) git clone git://libvirt.org/libvirt.git в /opt/git /etc/nodepool-scripts/my-setup.sh /etc/nodepool/nodepool.yaml [database] dburi=mysql+pymysql://nodepool:passwd@localhost/nodepooldb [jenkins "jenkins1"] user=jenkins apikey=f828c94dbd53b7e2a055112ebbc90ea8 credentials=28755fdb-244a-4fcf-baee-496031323c12 url=http://10.94.136.33:8080/
  • 11. Nodepool.yaml: header script-dir: /etc/nodepool-scripts elements-dir: /etc/nodepool-elements images-dir: /opt/nodepool_dib cron: check: '*/15 * * * *' cleanup: '*/1 * * * *' image-update: '14 2 * * *' zmq-publishers: - tcp://localhost:8888
  • 12. Nodepool.yaml Jenkins label → image name labels: - name: trusty-label image: trusty1 min-ready: 1 providers: - name: openstack001-test
  • 13. nodepool.yaml Cloud providers providers: - name: openstack001-test username: 'admin' password: '5fcf6292e9a240e0' auth-url: 'http://10.94.2.99:5000/v2.0/' project-name: 'admin' max-servers: 2 images: - name: trusty1 base-image: trusty setup: my-setup.sh min-ram: 2048 username: jenkins private-key: /opt/nodepool/jenkins_key
  • 14. Nodepool command line > nodepool hold 123 > nodepool delete 123 > nodepool image-update all trusty1
  • 15. Nodepool: создание загрузочных образов Snapshot images Base image Temporary VM my-setup.sh Take a snapshot diskimage-builder (DIB) images Base image qemu-nbd mount Prep. in chroot Convert Upload to provider
  • 16. Преимущества diskimage- builder: 1) Можно запускать в VM 1) Более структурированный способ задания конфигурации 1) Легкое добавление готовых элементов в конфигурацию
  • 17. diskimage-builder: типичные задачи для автоматизации ■адреса репозиториев ■пользователи, ключи ssh ■установка и конфигурация приложений ■разделы фс, настройки загрузки (growroot и пр.) ■кеширование git репозиториев и пр.
  • 18. DIB stages & elements Stages: root.d, extra-data.d, install.d (in chrooted env.), finalise.d, etc. Elements: • ubuntu-minimal: base OS • vm: preparation to boot in QEMU • simple-init: boot scripts to enable DHCP for NICs • growroot: expand root FS to cover available disk space
  • 19. DIB element “my-slave” (derived from my-setup.sh) /etc/nodepool-elements/my-slave/ package-installs.yaml -- sshd, dev packages extra-data.d/ 50-jenkins-pubkey -- copy key from host to mounted image install.d/ 50-jenkins-user 60-cache-libvirt finalise.d/ 99-nodepool-dir -- nodepool needs /etc/nodepool
  • 20. /etc/nodepool/nodepool.yaml: diskimages: - name: ubuntu-trusty elements: - ubuntu-minimal - vm - simple-init - growroot - my-slave release: trusty env-vars: TMPDIR: /opt/dib_tmp DIB_IMAGE_CACHE: /opt/dib_cache /var/log/nodepool.log: disk-image-create -x -t qcow2 --no-tmpfs --qemu-img- options 'compat=0.10' -o /opt/nodepool_dib/42 ubuntu-minimal vm simple- init growroot my-slave … Image file /opt/nodepool_dib/42.qcow2 created… nodepool.yaml: diskimages
  • 21. Jenkins Job Builder Конфигурация как код Yaml вместо Xml Шаблоны, группы, макросы
  • 22. JJB builder: copy-update-source - builder: name: copy-update-source builders: - shell: | mv /opt/git/libvirt $WORKSPACE cd libvirt git clean -f -x git fetch -f --recurse-submodules=yes origin {branch} git checkout FETCH_HEAD
  • 23. JJB builder: test-libvirt - builder: name: test-libvirt builders: - shell: | cd libvirt ./autogen.sh --system make sudo make install libvirtd --version sudo libvirtd -d virsh list --all
  • 24. JJB template - job-template: name: smoke-libvirt-{branch} node: trusty-label || dib-trusty-label builders: - copy-update-source: branch: '{branch}' - test-libvirt publishers: - email: recepients: 'eantyshev@virtuozzo.com'
  • 25. JJB project - project: name: libvirt branch: - master - v1.3.1-maint jobs: - smoke-libvirt-{branch}
  • 27. Gearman Сервис распределения задач и client/worker API http://gearman.org “We on Openstack infrastructure team use Jenkins extensively. Our jenkins servers, at peak load, runs 20,000+ jobs per day. At that load we require many jenkins slaves (900+) to process all of those build jobs. We have found that our requirement was pushing Jenkins beyond it's limits therefore we've decided to create the Gearman Plugin to support multiple Jenkins masters. The gearman plugin was designed to support extra slaves, allow load balancing of build jobs, and provide redundancy.” https://wiki.jenkins-ci.org/display/JENKINS/Gearman+Plugin
  • 28. Gearman workflow example 1. Worker registers “reverse” function on Gearman server. 2. Client sends “reverse” request and parameters. 3. Gearman server chooses the worker and assigns the job. 4. Worker sends result to Client via Server.
  • 29. Ubuntu 14.04: apt-get install gearman-job-server /etc/nodepool/nodepool.yaml: gearman-servers: - host: localhost Jenkins -> Configure System -> Enable Gearman Установка gearman-server, Gearman plugin (client)
  • 30. Gearman interactions in “libvirt CI” gearmand Gearman Client (Python API) Jenkins Gearman plugin (Java API) Nodepool (status TCP requests + images tasks) Gear worker
  • 31. Диагностика gearman: status request Status line fmt: Function <enqeued> <executing> <Nworkers> root@test-nodepool:/etc/jenkins_jobs/config# telnet localhost 4730 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. status build:smoke-libvirt-v1.3.1-maint 0 0 1 set_description:10.94.136.33 0 0 1 build:smoke-libvirt-master 0 0 1 stop:10.94.136.33 0 0 1 build:smoke-libvirt-v1.3.1-maint:dib-trusty-label 0 0 1 build:smoke-libvirt-master:dib-trusty-label 0 0 1 . ^] telnet> Connection closed.
  • 32. Job requests via Gear client Python implementation: http://pypi.python.org/pypi/gear https://github.com/zaro0508/gearman-plugin-client >python gear_client.py -s localhost -p 4730 --function build:smoke-libvirt-master:trusty-label --params '{"OFFLINE_NODE_WHEN_COMPLETE":"true"}'
  • 33. Zuul Планирование тестовых запусков для per-patch CI, project gating для gerrit http://docs.openstack.org/infra/zuul/
  • 34. Zuul pipelines Independent check, post- merge, periodic Dependent gate HEAD 1 HEAD 2 HEAD 3 HEAD 1 2 3
  • 35. Independent pipelines Dependent pipeline http://status.openstack.org/zuul/
  • 36. Материалы “libvirt CI”: https://github.com/eantyshev/libvirt_ci Полезные ссылки: http://docs.openstack.org/infra/manual/ http://docs.openstack.org/infra/nodepool/ https://wiki.jenkins-ci.org/display/JENKINS/Gearman+Plugin http://docs.openstack.org/infra/jenkins-job-builder/ Спасибо за внимание! Вопросы?
  • 38. Система ревью для git Робот, управляющий запуском тестов (gear python client) Сервис очередей для распределения задач Jenkins master (Gearman worker) Jenkins slave (рабочие среды) Создание и удаление рабочих сред, обновление образов (Gearman queue monitoring)
  • 40. smoke-libvirt job, take 2: split builders - job: name: smoke-libvirt project-type: freestyle node: trusty-label builders: - shell: | mv /opt/git/libvirt $WORKSPACE cd libvirt git clean -f -x git fetch -f --recurse-submodules=yes origin master git checkout FETCH_HEAD - shell: | ./autogen.sh --system make sudo make install libvirtd --version sudo libvirtd -d virsh list --all publishers: - email: recepients: 'eantyshev@virtuozzo.com'
  • 41. ● root.d: Download cloud image (qcow2) mount by qemu-nbd, submounts: /dev, /dev/pts, /sys, /proc + hooks dir ● environment.d: Set default environment vars ● extra-files.d: copy files to mounted image, f.e. ssh keys Go chroot under mounted path ● pre-install.d, install.d, post-install.d: Executed in chroot environment: set repo mirrors, install packages, configure apps Copy root content to temp. Unmount amended image. Make clean raw image file ● block-device.d: (auxiliary) Partition loopback block device Create filesystem, mount the image (+/proc,dev,sys submounts), copy rootfs contents from temp ● finalise.d: install/configure bootloader, other tools ● cleanup.d: cleanup temporary repos, unblock daemons Unmount, convert from raw to qcow2 DIB stages
  • 42. smoke-libvirt job, take 1 Недостатки: copy-paste when >1 job Неструктурированная логика в builders 1) Макрос copy-update-source с параметром branch и макрос test-libvirt 2) Job -> Job Template + Project 3) “project-type: freestyle” -> defaults.yaml - job: name: smoke-libvirt project-type: freestyle node: trusty-label builders: - shell: | mv /opt/git/libvirt $WORKSPACE cd libvirt git clean -f -x git fetch -f --recurse-submodules=yes origin master git checkout FETCH_HEAD ./autogen.sh --system make sudo make install libvirtd --version sudo libvirtd -d virsh list --all publishers: - email: recepients: 'eantyshev@virtuozzo.com'
  • 43. JJB defaults - defaults: name: global project-type: freestyle concurrent: true wrappers: - timeout: timeout: 30 fail: true - timestamps logrotate: daysToKeep: 7 numToKeep: -1 artifactDaysToKeep: -1 artifactNumToKeep: -1
  • 44. type: patchset-created, patchSet.ref: 'refs/changes/38/307638/1' type: comment-added, comment: “Looks good overall, couple of ....” type: patchset-created, patchSet.ref: ‘refs/changes/78/216378/38’ type: comment-added, comment: “blablabla...” zuul-server (scheduler) zuul-merger (git server) > gerrit event-stream Gearman server merger:merge 0 0 1 merger:update 0 0 1 Job requests: merger:merge args{gerrit_url, project, ref}* merger:update args{gerrit_url, project} Merge job complete: Zuul ref: commit id git clone <url> /var/lib/zuul/git/<project> git merge <ref> In Jenkins job: git fetch $ZUUL_URL $ref Zuul workflow
  • 45. Что дальше..? • Как запускать тесты автоматически? • Как регулировать число тестовых нод в зависимости от нагрузки? • Как масштабировать CI на несколько Jenkins серверов?
  • 46. - job: name: test-example builders: - shell: ‘echo Success!’ <?xml version="1.0" encoding="utf-8"?> <project> <actions/> <description>&lt;!-- Managed by Jenkins Job Builder --&gt;</description> <keepDependencies>false</keepDependencies> <blockBuildWhenDownstreamBuilding>false</blockBuildWhenDownstreamBuilding> <blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding> <concurrentBuild>false</concurrentBuild> <canRoam>true</canRoam> <properties/> <scm class="hudson.scm.NullSCM"/> <builders> <hudson.tasks.Shell> <command>echo Success!</command> </hudson.tasks.Shell> </builders> <buildWrappers/> </project> Yaml to Xml > jenkins-jobs test sample-job.yaml