SlideShare uma empresa Scribd logo
1 de 15
Baixar para ler offline
Zuul と OpenStack で作る
気の利いた CI 環境
Akihiro Motoki
Jul 22, 2019
OpenStack Days Tokyo 2019
Who am I ?
● Akihiro Motoki / 元木 顕弘
○ NEC OSS推進センター
○ IRC: amotoki, Twitter: @ritchey98
○ 以前は IPルータ、広域Ethernet装置、迷惑メールフィルタ、 OpenFlow 関連技術などの研究開発
をしていました。
● OpenStack Upstream Developer
○ Neutron: Core reviewer + drivers team
○ Core reviewer of Horizon, OpenStack Client (OSC), I18n
○ API-SIG, OpenStack SDK …
● OpenStack Operator (でした、ちょっと前まで)
● 日本OpenStackユーザー会 – 副会長、勉強会企画チーム
Zuul とは?
“Stop Merging Broken Code”
https://zuul-ci.org/index.html
● Project Gating ツール (CI ツール)
● コードの変更に対するテストを実行するためのインフラ
● もとは OpenStack 開発での CI を実現するために作られた
● 現在は汎用的な CI ツールになっている
Zuul の特徴
● Cross Project Testing (マージ時)
○ 複数のレポジトリが関係している場合、それぞれのレポジトリではテストが通っていても、組み合わ
せるとテストが失敗することがある
○ 関連があるレポジトリに関しては、マージが指示された順序で、すべての組み合わせを検証
→ どの時点においても動作することを保証
nova
neutron
cinder
1
1
1
2
2
2
1
1 1
N マージ対象
2
3
1
並列実行
2
3
3
失敗したときは戻した組
み合わせで実行
2
2
3
Zuul の特徴
● Cross Project Dependency
○ 複数のプロジェクトにまたがるパッチをマージ前にテスト可能
●
● 例えば、nova と neutron にまたがる機能を開発しているとする
● Nova のパッチは neutron に実装中の機能に依存
● Neutron のパッチをマージする前に nova との組み合わせが動作することを確認し
たい
Awesome network feature support
Depends-On: https://review.example.com/3
Nova パッチのコミットメッセージ
Neutron のパッチの URL
ジョブ定義
● レポジトリ内でのジョブ定義
○ CI システムに各レポジトリのジョブ定義を書く必要がなく、ジョブの分散・自律管理が可能
○ https://opendev.org/openstack/neutron/src/branch/master/.zuul.yaml
● Ansible によるジョブ定義
○ shell script で書く場合に比べるとモジュール化が行いやすい
● ジョブの再利用、継承
○ CI を運用する上で必要となるジョブやロールがあらかじめ準備されている
■ https://opendev.org/zuul/zuul-jobs など外部の定義のインポートもできる
○ パッチのテスト環境への展開や実行ログの保存など
○ OpenStack CI での継承 : http://zuul.openstack.org/jobs
■ 例えば “neutron-functional” でフィルタしてみるとわかりやすい
ジョブ定義の再利用
$ cat playbooks/base/post-logs.yaml
- hosts: localhost
gather_facts: False
roles:
- role: upload-logs
zuul_log_url: "http://localhost:8000"
$ cat zuul.d/jobs.yaml
- job:
name: base
parent: null
pre-run: playbooks/base/pre.yaml
post-run:
- playbooks/base/post-ssh.yaml
- playbooks/base/post-logs.yaml
roles:
- zuul: zuul/zuul-jobs
$ cat playbooks/base/pre.yaml
- hosts: all
roles:
- add-build-sshkey
- prepare-workspace
$ less .zuul.yaml
- job:
name: testjob
parent: base
run: playbooks/testjob.yaml
継承
ジョブ定義も比較的カンタン
Python プロジェクト test1 で “tox -e pep8” を実行したい場合
● tox-pep8 が、 tox 環境の準備を行って、
pep8 環境を実行してくれる
● base ジョブを継承しているので、
ログの保存なども行われる。
$ less test1/.zuul.yaml
- project:
check:
jobs:
- tox-pep8:
vars:
tox_install_siblings: false
gate:
jobs:
- tox-pep8:
vars:
tox_install_siblings: false
Zuul の構造
zuul-executor
zuul-scheduler
Test node
Test node
gerrit
github
ジョブ実行
nodepool
gearman
zookeeper
Test node 作成
Nodepool
● テストノードの管理を行う
○ 負荷に応じてテストノード数を増減
○ テストが終わったノードを削除
● 様々なバックエンドに対応
○ static
○ OpenStack
○ Kubernetes (namespace / pod)
○ OpenShift
○ AWS
Nodepool の OpenStack との連携
● Nodepool 実行ノードに clouds.yaml (OpenStack 認証情報を書いたファイル) を
用意する。
○ 置き場所は以下のいずれか
■ ~/.config/openstack/clouds.yaml
■ /etc/openstack/clouds.yaml
○ https://docs.openstack.org/openstacksdk/latest/user/config/configuration.html
○ clouds.yaml の動作確認は OS_CLOUD 環境変数を設定して openstack コマンドを実行
● Nodepool の設定ファイルにノード情報を記載
○ http://paste.openstack.org/show/754613/
● Nodepool を再起動すると OpenStack 側に VM が自動的に作成される
○ http://paste.openstack.org/show/754612/
Zuul のユーザー
● BMW
○ Zuul で CI/CD をまとめて運用。Zuul プロセスは OpenShift 上で動かすことで可用性を確保
● GoDaddy
● OpenLab
● OpenStack Foundation
○ OpenStack, Airship, StarlingX など
● Ansible CI (openstack module + openstacksdk integration)
○ E.g. https://github.com/ansible/ansible/pull/59292
https://zuul-ci.org/users.html
どんな場面で有効?
● 多くの類似ジョブが存在している CI 環境では有用
○ 成果の再利用、継承
● 複数の互いに関連するプロジェクトがあり、
それらにまたがる開発を行う場合
● Jenkins ジョブ定義で shell script をたくさん書いている場合
● 単純な CI であれば SaaS の CI を利用する方が楽と思われる
○ CircleCI, TravisCI
● CD Foundation の下、Tekton や JenkinsX, Spinaker などの動向も見つつ、
使いやすいものを使っていくがよいと思われる
References
● Zuul Homepage https://zuul-ci.org
● Quick start and Tutorial https://zuul-ci.org/docs/zuul/admin/quick-start.html

Mais conteúdo relacionado

Mais procurados

仮想化環境におけるパケットフォワーディング
仮想化環境におけるパケットフォワーディング仮想化環境におけるパケットフォワーディング
仮想化環境におけるパケットフォワーディング
Takuya ASADA
 

Mais procurados (20)

Linux-HA Japanプロジェクトのこれまでとこれから
Linux-HA JapanプロジェクトのこれまでとこれからLinux-HA Japanプロジェクトのこれまでとこれから
Linux-HA Japanプロジェクトのこれまでとこれから
 
細かすぎて伝わらないかもしれない Azure Container Networking Deep Dive
細かすぎて伝わらないかもしれない Azure Container Networking Deep Dive細かすぎて伝わらないかもしれない Azure Container Networking Deep Dive
細かすぎて伝わらないかもしれない Azure Container Networking Deep Dive
 
OpenStackを使用したGPU仮想化IaaS環境 事例紹介
OpenStackを使用したGPU仮想化IaaS環境 事例紹介OpenStackを使用したGPU仮想化IaaS環境 事例紹介
OpenStackを使用したGPU仮想化IaaS環境 事例紹介
 
Dockerを支える技術
Dockerを支える技術Dockerを支える技術
Dockerを支える技術
 
DockerとKubernetesをかけめぐる
DockerとKubernetesをかけめぐるDockerとKubernetesをかけめぐる
DockerとKubernetesをかけめぐる
 
Canonicalが支える、さくっと使えるUbuntu OpenStack - OpenStack Day in ITpro EXPO 2014
Canonicalが支える、さくっと使えるUbuntu OpenStack - OpenStack Day in ITpro EXPO 2014Canonicalが支える、さくっと使えるUbuntu OpenStack - OpenStack Day in ITpro EXPO 2014
Canonicalが支える、さくっと使えるUbuntu OpenStack - OpenStack Day in ITpro EXPO 2014
 
OpenStack Octavia入門
OpenStack Octavia入門OpenStack Octavia入門
OpenStack Octavia入門
 
Linux Namespace
Linux NamespaceLinux Namespace
Linux Namespace
 
KubeCon + CloudNativeCon Europe 2022 Recap / Kubernetes Meetup Tokyo #51 / #k...
KubeCon + CloudNativeCon Europe 2022 Recap / Kubernetes Meetup Tokyo #51 / #k...KubeCon + CloudNativeCon Europe 2022 Recap / Kubernetes Meetup Tokyo #51 / #k...
KubeCon + CloudNativeCon Europe 2022 Recap / Kubernetes Meetup Tokyo #51 / #k...
 
eStargzイメージとlazy pullingによる高速なコンテナ起動
eStargzイメージとlazy pullingによる高速なコンテナ起動eStargzイメージとlazy pullingによる高速なコンテナ起動
eStargzイメージとlazy pullingによる高速なコンテナ起動
 
QEMU Disk IO Which performs Better: Native or threads?
QEMU Disk IO Which performs Better: Native or threads?QEMU Disk IO Which performs Better: Native or threads?
QEMU Disk IO Which performs Better: Native or threads?
 
コンテナを止めるな! PacemakerによるコンテナHAクラスタリングとKubernetesとの違いとは
コンテナを止めるな!  PacemakerによるコンテナHAクラスタリングとKubernetesとの違いとはコンテナを止めるな!  PacemakerによるコンテナHAクラスタリングとKubernetesとの違いとは
コンテナを止めるな! PacemakerによるコンテナHAクラスタリングとKubernetesとの違いとは
 
人気番組との戦い! Javaシステムのパフォーマンスチューニング奮闘記
人気番組との戦い! Javaシステムのパフォーマンスチューニング奮闘記人気番組との戦い! Javaシステムのパフォーマンスチューニング奮闘記
人気番組との戦い! Javaシステムのパフォーマンスチューニング奮闘記
 
Kubernetes ControllerをScale-Outさせる方法 / Kubernetes Meetup Tokyo #55
Kubernetes ControllerをScale-Outさせる方法 / Kubernetes Meetup Tokyo #55Kubernetes ControllerをScale-Outさせる方法 / Kubernetes Meetup Tokyo #55
Kubernetes ControllerをScale-Outさせる方法 / Kubernetes Meetup Tokyo #55
 
Dockerクイックツアー
DockerクイックツアーDockerクイックツアー
Dockerクイックツアー
 
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
 
OpenStack検証環境構築・トラブルシューティング入門 - OpenStack最新情報セミナー 2014年8月
OpenStack検証環境構築・トラブルシューティング入門 - OpenStack最新情報セミナー 2014年8月OpenStack検証環境構築・トラブルシューティング入門 - OpenStack最新情報セミナー 2014年8月
OpenStack検証環境構築・トラブルシューティング入門 - OpenStack最新情報セミナー 2014年8月
 
OSC 2011 Hokkaido 自宅SAN友の会(後半)
OSC 2011 Hokkaido 自宅SAN友の会(後半)OSC 2011 Hokkaido 自宅SAN友の会(後半)
OSC 2011 Hokkaido 自宅SAN友の会(後半)
 
OSSコミッタの生活とその必要性
OSSコミッタの生活とその必要性OSSコミッタの生活とその必要性
OSSコミッタの生活とその必要性
 
仮想化環境におけるパケットフォワーディング
仮想化環境におけるパケットフォワーディング仮想化環境におけるパケットフォワーディング
仮想化環境におけるパケットフォワーディング
 

Semelhante a 20190722 Building handy CI with zuul and OpenStack

Eclipse PDT + MakeGoodによるPHPコードのテスト
Eclipse PDT + MakeGoodによるPHPコードのテストEclipse PDT + MakeGoodによるPHPコードのテスト
Eclipse PDT + MakeGoodによるPHPコードのテスト
Atsuhiro Kubo
 
Eclipse PDT + MakeGood による PHP コードのテスト
Eclipse PDT + MakeGood による PHP コードのテストEclipse PDT + MakeGood による PHP コードのテスト
Eclipse PDT + MakeGood による PHP コードのテスト
Atsuhiro Kubo
 
OpenStackクラウド基盤構築ハンズオンセミナー 第1日:講義No2
OpenStackクラウド基盤構築ハンズオンセミナー 第1日:講義No2OpenStackクラウド基盤構築ハンズオンセミナー 第1日:講義No2
OpenStackクラウド基盤構築ハンズオンセミナー 第1日:講義No2
Etsuji Nakai
 
Personal Cloud Automation
Personal Cloud AutomationPersonal Cloud Automation
Personal Cloud Automation
Etsuji Nakai
 

Semelhante a 20190722 Building handy CI with zuul and OpenStack (20)

Eclipse PDT + MakeGoodによるPHPコードのテスト
Eclipse PDT + MakeGoodによるPHPコードのテストEclipse PDT + MakeGoodによるPHPコードのテスト
Eclipse PDT + MakeGoodによるPHPコードのテスト
 
PTLのお仕事とリリースパイプラインの裏側
PTLのお仕事とリリースパイプラインの裏側PTLのお仕事とリリースパイプラインの裏側
PTLのお仕事とリリースパイプラインの裏側
 
OCaml でデータ分析
OCaml でデータ分析OCaml でデータ分析
OCaml でデータ分析
 
Sbtのマルチプロジェクトはいいぞ
SbtのマルチプロジェクトはいいぞSbtのマルチプロジェクトはいいぞ
Sbtのマルチプロジェクトはいいぞ
 
Eclipse PDT + MakeGood による PHP コードのテスト
Eclipse PDT + MakeGood による PHP コードのテストEclipse PDT + MakeGood による PHP コードのテスト
Eclipse PDT + MakeGood による PHP コードのテスト
 
Ansible quickstart
Ansible quickstartAnsible quickstart
Ansible quickstart
 
serverless openstack 101
serverless openstack 101serverless openstack 101
serverless openstack 101
 
PythonのGUI_2018 with NSEG
PythonのGUI_2018 with NSEGPythonのGUI_2018 with NSEG
PythonのGUI_2018 with NSEG
 
WebRTC開発者向けプラットフォーム SkyWayの裏側
WebRTC開発者向けプラットフォーム SkyWayの裏側WebRTC開発者向けプラットフォーム SkyWayの裏側
WebRTC開発者向けプラットフォーム SkyWayの裏側
 
2018 07-23
2018 07-232018 07-23
2018 07-23
 
red-hat-forum-2017-openshift-baremetal-deployment
red-hat-forum-2017-openshift-baremetal-deploymentred-hat-forum-2017-openshift-baremetal-deployment
red-hat-forum-2017-openshift-baremetal-deployment
 
OpenStackクラウド基盤構築ハンズオンセミナー 第1日:講義No2
OpenStackクラウド基盤構築ハンズオンセミナー 第1日:講義No2OpenStackクラウド基盤構築ハンズオンセミナー 第1日:講義No2
OpenStackクラウド基盤構築ハンズオンセミナー 第1日:講義No2
 
PyQtではじめるGUIプログラミング
PyQtではじめるGUIプログラミングPyQtではじめるGUIプログラミング
PyQtではじめるGUIプログラミング
 
今時のDev opsの取り組み事例集
今時のDev opsの取り組み事例集今時のDev opsの取り組み事例集
今時のDev opsの取り組み事例集
 
Personal Cloud Automation
Personal Cloud AutomationPersonal Cloud Automation
Personal Cloud Automation
 
Jenkins study jenkins build-cicdi
Jenkins study jenkins build-cicdiJenkins study jenkins build-cicdi
Jenkins study jenkins build-cicdi
 
Keycloakの実際・翻訳プロジェクト紹介
Keycloakの実際・翻訳プロジェクト紹介Keycloakの実際・翻訳プロジェクト紹介
Keycloakの実際・翻訳プロジェクト紹介
 
書こう! 使おう! 単体テスト
書こう! 使おう! 単体テスト書こう! 使おう! 単体テスト
書こう! 使おう! 単体テスト
 
OpenStack Summit Vancouver YVR Ops
OpenStack Summit Vancouver YVR OpsOpenStack Summit Vancouver YVR Ops
OpenStack Summit Vancouver YVR Ops
 
UIテストの実行時間の短縮の方法
UIテストの実行時間の短縮の方法UIテストの実行時間の短縮の方法
UIテストの実行時間の短縮の方法
 

Mais de Akihiro Motoki

20131211 Neutron Havana
20131211 Neutron Havana20131211 Neutron Havana
20131211 Neutron Havana
Akihiro Motoki
 
20131212 Okinawa OpenDays OpenStack
20131212 Okinawa OpenDays OpenStack20131212 Okinawa OpenDays OpenStack
20131212 Okinawa OpenDays OpenStack
Akihiro Motoki
 
20131011_openstack-neutron-vyattameeting
20131011_openstack-neutron-vyattameeting20131011_openstack-neutron-vyattameeting
20131011_openstack-neutron-vyattameeting
Akihiro Motoki
 
20121216 OSC Cloud OpenStack Quantum
20121216 OSC Cloud OpenStack Quantum20121216 OSC Cloud OpenStack Quantum
20121216 OSC Cloud OpenStack Quantum
Akihiro Motoki
 
Horizon Quantum Integration grizzly
Horizon Quantum Integration grizzlyHorizon Quantum Integration grizzly
Horizon Quantum Integration grizzly
Akihiro Motoki
 
Horizon quantum-integration-grizzly
Horizon quantum-integration-grizzlyHorizon quantum-integration-grizzly
Horizon quantum-integration-grizzly
Akihiro Motoki
 
Quantum-grizzly-packet-filtering
Quantum-grizzly-packet-filteringQuantum-grizzly-packet-filtering
Quantum-grizzly-packet-filtering
Akihiro Motoki
 

Mais de Akihiro Motoki (19)

20190722 OpenStack community past present future
20190722 OpenStack community past present future20190722 OpenStack community past present future
20190722 OpenStack community past present future
 
20190118-josug-open stack-community-goals
20190118-josug-open stack-community-goals20190118-josug-open stack-community-goals
20190118-josug-open stack-community-goals
 
OpenStack Neutron IPv6 Lessons
OpenStack Neutron IPv6 LessonsOpenStack Neutron IPv6 Lessons
OpenStack Neutron IPv6 Lessons
 
Neutron: br-ex is now deprecated! what is modern way?
Neutron: br-ex is now deprecated! what is modern way?Neutron: br-ex is now deprecated! what is modern way?
Neutron: br-ex is now deprecated! what is modern way?
 
20161129 neutron recent topic
20161129 neutron recent topic20161129 neutron recent topic
20161129 neutron recent topic
 
20150713-OpenStack-5thbirthday-kilo-liberty-and-towards
20150713-OpenStack-5thbirthday-kilo-liberty-and-towards20150713-OpenStack-5thbirthday-kilo-liberty-and-towards
20150713-OpenStack-5thbirthday-kilo-liberty-and-towards
 
20150713 OpenStack Translation in Japan
20150713 OpenStack Translation in Japan20150713 OpenStack Translation in Japan
20150713 OpenStack Translation in Japan
 
neutron_icehouse_update
neutron_icehouse_updateneutron_icehouse_update
neutron_icehouse_update
 
Neutron Icehouse Update (Japanese)
Neutron Icehouse Update (Japanese)Neutron Icehouse Update (Japanese)
Neutron Icehouse Update (Japanese)
 
OpenStack Atlanta Summit Report: Neutron, Nova and design summit sessions
OpenStack Atlanta Summit Report: Neutron, Nova and design summit sessionsOpenStack Atlanta Summit Report: Neutron, Nova and design summit sessions
OpenStack Atlanta Summit Report: Neutron, Nova and design summit sessions
 
20131211 Neutron Havana
20131211 Neutron Havana20131211 Neutron Havana
20131211 Neutron Havana
 
20131212 Okinawa OpenDays OpenStack
20131212 Okinawa OpenDays OpenStack20131212 Okinawa OpenDays OpenStack
20131212 Okinawa OpenDays OpenStack
 
20131011_openstack-neutron-vyattameeting
20131011_openstack-neutron-vyattameeting20131011_openstack-neutron-vyattameeting
20131011_openstack-neutron-vyattameeting
 
20130724 openstack-3rd-anniversary-amotoki
20130724 openstack-3rd-anniversary-amotoki20130724 openstack-3rd-anniversary-amotoki
20130724 openstack-3rd-anniversary-amotoki
 
OpenStack Contribution Howto
OpenStack Contribution HowtoOpenStack Contribution Howto
OpenStack Contribution Howto
 
20121216 OSC Cloud OpenStack Quantum
20121216 OSC Cloud OpenStack Quantum20121216 OSC Cloud OpenStack Quantum
20121216 OSC Cloud OpenStack Quantum
 
Horizon Quantum Integration grizzly
Horizon Quantum Integration grizzlyHorizon Quantum Integration grizzly
Horizon Quantum Integration grizzly
 
Horizon quantum-integration-grizzly
Horizon quantum-integration-grizzlyHorizon quantum-integration-grizzly
Horizon quantum-integration-grizzly
 
Quantum-grizzly-packet-filtering
Quantum-grizzly-packet-filteringQuantum-grizzly-packet-filtering
Quantum-grizzly-packet-filtering
 

20190722 Building handy CI with zuul and OpenStack

  • 1. Zuul と OpenStack で作る 気の利いた CI 環境 Akihiro Motoki Jul 22, 2019 OpenStack Days Tokyo 2019
  • 2. Who am I ? ● Akihiro Motoki / 元木 顕弘 ○ NEC OSS推進センター ○ IRC: amotoki, Twitter: @ritchey98 ○ 以前は IPルータ、広域Ethernet装置、迷惑メールフィルタ、 OpenFlow 関連技術などの研究開発 をしていました。 ● OpenStack Upstream Developer ○ Neutron: Core reviewer + drivers team ○ Core reviewer of Horizon, OpenStack Client (OSC), I18n ○ API-SIG, OpenStack SDK … ● OpenStack Operator (でした、ちょっと前まで) ● 日本OpenStackユーザー会 – 副会長、勉強会企画チーム
  • 3. Zuul とは? “Stop Merging Broken Code” https://zuul-ci.org/index.html ● Project Gating ツール (CI ツール) ● コードの変更に対するテストを実行するためのインフラ ● もとは OpenStack 開発での CI を実現するために作られた ● 現在は汎用的な CI ツールになっている
  • 4.
  • 5. Zuul の特徴 ● Cross Project Testing (マージ時) ○ 複数のレポジトリが関係している場合、それぞれのレポジトリではテストが通っていても、組み合わ せるとテストが失敗することがある ○ 関連があるレポジトリに関しては、マージが指示された順序で、すべての組み合わせを検証 → どの時点においても動作することを保証 nova neutron cinder 1 1 1 2 2 2 1 1 1 N マージ対象 2 3 1 並列実行 2 3 3 失敗したときは戻した組 み合わせで実行 2 2 3
  • 6. Zuul の特徴 ● Cross Project Dependency ○ 複数のプロジェクトにまたがるパッチをマージ前にテスト可能 ● ● 例えば、nova と neutron にまたがる機能を開発しているとする ● Nova のパッチは neutron に実装中の機能に依存 ● Neutron のパッチをマージする前に nova との組み合わせが動作することを確認し たい Awesome network feature support Depends-On: https://review.example.com/3 Nova パッチのコミットメッセージ Neutron のパッチの URL
  • 7. ジョブ定義 ● レポジトリ内でのジョブ定義 ○ CI システムに各レポジトリのジョブ定義を書く必要がなく、ジョブの分散・自律管理が可能 ○ https://opendev.org/openstack/neutron/src/branch/master/.zuul.yaml ● Ansible によるジョブ定義 ○ shell script で書く場合に比べるとモジュール化が行いやすい ● ジョブの再利用、継承 ○ CI を運用する上で必要となるジョブやロールがあらかじめ準備されている ■ https://opendev.org/zuul/zuul-jobs など外部の定義のインポートもできる ○ パッチのテスト環境への展開や実行ログの保存など ○ OpenStack CI での継承 : http://zuul.openstack.org/jobs ■ 例えば “neutron-functional” でフィルタしてみるとわかりやすい
  • 8. ジョブ定義の再利用 $ cat playbooks/base/post-logs.yaml - hosts: localhost gather_facts: False roles: - role: upload-logs zuul_log_url: "http://localhost:8000" $ cat zuul.d/jobs.yaml - job: name: base parent: null pre-run: playbooks/base/pre.yaml post-run: - playbooks/base/post-ssh.yaml - playbooks/base/post-logs.yaml roles: - zuul: zuul/zuul-jobs $ cat playbooks/base/pre.yaml - hosts: all roles: - add-build-sshkey - prepare-workspace $ less .zuul.yaml - job: name: testjob parent: base run: playbooks/testjob.yaml 継承
  • 9. ジョブ定義も比較的カンタン Python プロジェクト test1 で “tox -e pep8” を実行したい場合 ● tox-pep8 が、 tox 環境の準備を行って、 pep8 環境を実行してくれる ● base ジョブを継承しているので、 ログの保存なども行われる。 $ less test1/.zuul.yaml - project: check: jobs: - tox-pep8: vars: tox_install_siblings: false gate: jobs: - tox-pep8: vars: tox_install_siblings: false
  • 10. Zuul の構造 zuul-executor zuul-scheduler Test node Test node gerrit github ジョブ実行 nodepool gearman zookeeper Test node 作成
  • 11. Nodepool ● テストノードの管理を行う ○ 負荷に応じてテストノード数を増減 ○ テストが終わったノードを削除 ● 様々なバックエンドに対応 ○ static ○ OpenStack ○ Kubernetes (namespace / pod) ○ OpenShift ○ AWS
  • 12. Nodepool の OpenStack との連携 ● Nodepool 実行ノードに clouds.yaml (OpenStack 認証情報を書いたファイル) を 用意する。 ○ 置き場所は以下のいずれか ■ ~/.config/openstack/clouds.yaml ■ /etc/openstack/clouds.yaml ○ https://docs.openstack.org/openstacksdk/latest/user/config/configuration.html ○ clouds.yaml の動作確認は OS_CLOUD 環境変数を設定して openstack コマンドを実行 ● Nodepool の設定ファイルにノード情報を記載 ○ http://paste.openstack.org/show/754613/ ● Nodepool を再起動すると OpenStack 側に VM が自動的に作成される ○ http://paste.openstack.org/show/754612/
  • 13. Zuul のユーザー ● BMW ○ Zuul で CI/CD をまとめて運用。Zuul プロセスは OpenShift 上で動かすことで可用性を確保 ● GoDaddy ● OpenLab ● OpenStack Foundation ○ OpenStack, Airship, StarlingX など ● Ansible CI (openstack module + openstacksdk integration) ○ E.g. https://github.com/ansible/ansible/pull/59292 https://zuul-ci.org/users.html
  • 14. どんな場面で有効? ● 多くの類似ジョブが存在している CI 環境では有用 ○ 成果の再利用、継承 ● 複数の互いに関連するプロジェクトがあり、 それらにまたがる開発を行う場合 ● Jenkins ジョブ定義で shell script をたくさん書いている場合 ● 単純な CI であれば SaaS の CI を利用する方が楽と思われる ○ CircleCI, TravisCI ● CD Foundation の下、Tekton や JenkinsX, Spinaker などの動向も見つつ、 使いやすいものを使っていくがよいと思われる
  • 15. References ● Zuul Homepage https://zuul-ci.org ● Quick start and Tutorial https://zuul-ci.org/docs/zuul/admin/quick-start.html