Hello.Continuous Integration
WHO?• 松村 勇輝 @Yuki_312
• Yukiの枝折. http://yuki312.blogspot.jp/
• Android Developer
QUESTION統合作業…
チーム内のソースコードを
集約, ビルド, テストする.
QUESTION✓ 最新のソースコードを集約してビルドされる
✓ 最新のソースコードを集約してビルドされる
✓ 全てがクリーンな状態でビルドされる
QUESTION
✓ 最新のソースコードを集約してビルドされる
✓ 全てがクリーンな状態でビルドされる
✓ 成果物は実行可能な状態で作られる
QUESTION
✓ 最新のソースコードを集約してビルドされる
✓ 全てがクリーンな状態でビルドされる
✓ 成果物は実行可能な状態で作られる
✓ テストにパスしたことを確認できる
QUESTION
✓ 最新のソースコードを集約してビルドされる
✓ 全てがクリーンな状態でビルドされる
✓ 成果物は実行可能な状態で作られる
✓ テストにパスしたことを確認できる
✓ 全てのステップが成功し自動実行である
QUESTION
✓ 最新のソースコードを集約してビルドされる
✓ 全てがクリーンな状態でビルドされる
✓ 成果物は実行可能な状態で作られる
✓ テストにパスしたことを確認できる
✓ 全てのステップが成功し自動実行である
✓ 上記が1日に何度も頻繁に行われる
QUESTION
Hello.Continuous Integration
CONTENTS• 生産性とインテグレーション
• 継続的インテグレーション
• Get Started
• デモンストレーション
• CI as a Service
PRODUCTIVITY• 生産性 = Output / Input
PRODUCTIVITY• 生産性 = Output / Input
• 少ない投資で大きな価値を
PRODUCTIVITY• 生産性 = Output / Input
• 少ない投資で大きな価値を
• 同じ品質をより短い時間で
PRODUCTIVITY• 生産性 = Output / Input
• 少ない投資で大きな価値を
• 同じ品質をより短い時間で
• 贅肉を削ぎ落とすこと
INTEGRATION• commit
INTEGRATION• commit
• build
INTEGRATION• commit
• build
• test
INTEGRATION• commit... conflict.
• build
• test
INTEGRATION• commit... conflict.
• build... error.
• test
INTEGRATION• commit... conflict.
• build... error.
• test... failed.
INTEGRATION• インテグレーションは面倒な作業
• Milestone/Weekly/Daily Buildが辛い
• 頻繁な統合テストはコストがかさむ
• 統合テストで発見される不具合は厄介
BEST PRACTICE
“頻繁にインテグレーションする”
BEST PRACTICE
基本的かつ重要な
“完全に自働化されたビルドとテスト”
AUTOMATION• 頻繁なインテグレーションが実現可能
• よりアトミックなインテグレーション
• インテグレーションに伴う面倒を解消
BAD PRACTICE“ある機能のバグが他に影響しているが,
互いの機能開発者達はその事実に気づかない.
相互作用の中に潜むバグの発見は難しく,
原因特定には長い時間が費やされる. ”
-Martin Fowler-
BAD PRACTICE
インテグレーションの間隔が空くほど,
統合のトータルコストが増し生産性は悪化する.
CI
“すべてが自動化された, 再現可能な
ビルド(とテスト)を, 日に何度も行うこと”
-Martin Fowler-
BEST PRACTICE
頻繁な統合は検証の機会を増やし,
統合に伴う問題を低減する.
NOT CI• 統合ビルドはする... が, 通らない
NOT CI• 統合ビルドはする... が, 通らない
• ビルドは成功する... が, テストにパスしない
BUILD SUCCESSFUL✓ 最新のコードを全てチェックアウトした
BUILD SUCCESSFUL✓ 最新のコードを全てチェックアウトした
✓ 全てがクリーンな状態でビルドした
BUILD SUCCESSFUL✓ 最新のコードを全てチェックアウトした
✓ 全てがクリーンな状態でビルドした
✓ 成果物を実行可能な状態で生成した
BUILD SUCCESSFUL✓ 最新のコードを全てチェックアウトした
✓ 全てがクリーンな状態でビルドした
✓ 成果物を実行可能な状態で生成した
✓ テストスイートにパスした
BUILD SUCCESSFUL✓ 最新のコードを全てチェックアウトした
✓ 全てがクリーンな状態でビルドした
✓ 成果物を実行可能な状態で生成した
✓ テストスイートにパスした
✓ 全てのSTEPがエラーもなく自動実行された
PROBLEM• Single Source Point
PROBLEM• Single Source Point
• Workflow
PROBLEM• Single Source Point
• Workflow
• Build Script
PROBLEM• Single Source Point
• Workflow
• Build Script
• Testing Framework
• Single Source PointGit
• Workflow
• Build Script
• Testing Framework
PROBLEM
• Single Source PointGit
• WorkflowGitHub-Flow, PR Driven
• Build Script
• Testing Framework
PROBLEM
• Single Source PointGit
• WorkflowGitHub-Flow, PR Driven
• Build ScriptGradle
• Testing Framework
PROBLEM
• Single Source PointGit
• WorkflowGitHub-Flow, PR Driven
• Build ScriptGradle
• Testing FrameworkJUnit, Espresso
PROBLEM
GET STARTED
“すべてが自動化された, 再現可能な
ビルド(とテスト)を, 日に何度も行うこと”
-Martin Fowler-
GET STARTED???
“すべてが自動化された, 再現可能な
ビルド(とテスト)を, 日に何度も行うこと”
-Martin Fowler-
GET STARTED“すべてが自動化された, 再現可能な
ビルド(とテスト)を, 日に何度も行うこと”
GET STARTED“すべてが自動化された, 再現可能な
ビルド(とテスト)を, 日に何度も行うこと”
今回はテストのフェーズをスキップ
GET STARTED“すべてが自動化された, 再現可能な
ビルド(とテスト)を, 日に何度も行うこと”
↓
自動化された, 再現可能なビルドを,
日に何度も行うこと
GET STARTED“すべてが自動化された, 再現可能な
ビルド(とテスト)を, 日に何度も行うこと”
↓
自動化された, 再現可能なビルドを,
日に何度も行うこと
BUILD SUCCESSFUL✓ 最新のコードを全てチェックアウトした
✓ 全てがクリーンな状態でビルドした
✓ 成果物を実行可能な状態で生成した
✓ テストスイートにパスした
✓ 全てのSTEPがエラーもなく自動実行された
BUILD SUCCESSFUL✓ 最新のコードを全てチェックアウトした
✓ 全てがクリーンな状態でビルドした
✓ 成果物を実行可能な状態で生成した
✓ テストスイートにパスした
✓ 全てのSTEPがエラーもなく自動実行された
GET STARTED
CIaaSContinuous Integration as a Service
CI AS A SERVICE• CI自動化支援
• 老舗のCIソフトウェア – Jenkins
• 老舗のCIサービス – Travis CI
• その他CIサービス – Circle CI, Codeship, etc.
• エンジンとなってプロジェクトを加速する
CIRCLE CI• AWS + LXC のコンテナ運用
• CIサーバ運用は不要
• YAMLによるタスク管理
• SSHによるリモート接続可
• Dockerをサポート
• 安価で軽い
SUPPORT• Collaboration
GitHub (BitBucket, GitLab is not supported)
• LanguageRuby, Python, Node.js, PHP, Java, Haskell, Scala
• PlatformAndroid, iOS
ANTI PATTERN• 肥満リポジトリ
コンテナの初期化がボトルネックになる
ANTI PATTERN• 肥満リポジトリ
コンテナの初期化がボトルネックになる
• 複数のプロダクト
ビルドが別プロダクトのビルドを待たせる
ANTI PATTERN• 肥満リポジトリ
コンテナの初期化がボトルネックになる
• 複数のプロダクト
ビルドが別プロダクトのビルドを待たせる
• 過度なPush不必要なPushでビルド待ち行列を発生させる
KEEP FASTER• CIの速度はプロジェクトの速度
• ビルドの待ち行列が発生しないように
• ビルドの成功条件を厳守する
• 課金重要
PRICE – CIRCLE CI• Public, Privateに関わらず1 container 無料
• 1 container(parallelism) $50/month
• レポジトリ数 無制限
• ユーザ数 無制限
• ビルド時間 無制限
PRICE – GITHUB• Organization plans - Bronze
• Publicリポジトリ 無料&無制限
• 10 Privateリポジトリ $25/month
• メンバー数 無制限
CONCLUSION• インテグレーションは自動化
• 頻繁にインテグレーションする
• 自動化にはCIaaSを使う
• CIaaSを試すにはCircleCIがおすすめ
• GitHubも忘れずに
• 慣れたらテストスイートを追加していく