問題
▌結合のタイミングでまとめて⼤きな差分が発⽣する
l 壊れやすい、原因究明が困難
▌変更してから問題が⾒つかるまでのタイムラグが⼤きい
l 学習が遅れるのでその間にも類似不具合が埋め込まれる
可能性が⾼い
▌リスク(不確実性)が⾼い
l 結合後の対応がどれぐらいになるか予測しづらい
10
Slide 11
Slide 11 text
CI (Continuous Integration)
11
Slide 12
Slide 12 text
CI とは︖
▌開発プラクティス
▌⼀⽇に何回もバージョン管理システムに変更をマージする
▌毎回テストなどを含む⾃動ビルドが実⾏される
12
Slide 13
Slide 13 text
CI がある開発の例
13
Slide 14
Slide 14 text
開発者がメインラインからタスクブランチを作成する
14
Slide 15
Slide 15 text
ローカルでコードを変更する
15
Slide 16
Slide 16 text
タスクブランチにプッシュして PR(プルリクエスト)
を作成する
16
Slide 17
Slide 17 text
(メインラインとの衝突があればマージして修正する)
17
Slide 18
Slide 18 text
CI ツールがタスクブランチのコードでビルドを実⾏する
18
Slide 19
Slide 19 text
ビルドが失敗したら通るまで修正 & CI 再実⾏
19
Slide 20
Slide 20 text
ビルドが成功したらメインラインにマージする
20
Slide 21
Slide 21 text
CI ツールがメインラインのコードでビルドを実⾏する
21
Slide 22
Slide 22 text
ビルドが失敗したら通るまで修正する
22
Slide 23
Slide 23 text
メインラインでビルドが成功したら完了
23
Slide 24
Slide 24 text
CI の利点
▌⾼速なフィードバック
l 問題の早期発⾒
l ⾼速な学習
▌頻繁に変更がマージされるようになれば差分が⼤きくならない
l 問題発⾒時の調査が簡単になる
l リスク(不確実性)が減る
▌Success/Fail の可視化によるコミュニケーション促進
▌毎回の変更が⾃動テストで保証される安⼼感
24
Slide 25
Slide 25 text
CD (Continuous Delivery)
25
Slide 26
Slide 26 text
CD とは︖
▌CI の発展形
l コードの変更がトリガーとなって実⾏されることは同じ
▌コード変更からリリースまでに必要な検証を⾏う
l 常に信頼できるリリースができる状態を保つ
▌デプロイパイプラインという形で⾃動化する
l 部分的に⼿動作業が⼊ることもある
26
CD の利点
▌リリースのコストやリスクを抑えられる
l いつでもリリースできる
▌コード変更からリリースまでのフローが可視化される
l どこで問題が起きてるか、どこがボトルネックか、
などがすぐにわかる
28
Slide 29
Slide 29 text
CI/CD 内で実⾏すること
29
Slide 30
Slide 30 text
静的解析
▌構⽂チェック
l 構⽂エラーを防ぐ
▌コードスタイルチェック
l 可読性を⾼める、本質的でない議論を防ぐ
▌コードパターンチェック
l エラーが発⽣しやすいパターンを防ぐ
30
Slide 31
Slide 31 text
⾃動テスト
▌ 単体テスト
l ⼩さい単位のコードが役割通り動作するかチェックする
▌ 結合テスト
l 複数のコードを組み合わせた機能が正しく動作するかチェックする
▌ 受け⼊れテスト(E2E テスト)
l ビジネス要求を満たしてるかチェックする
▌ 上記以外にもいろいろ
l テストの種類ごとの呼び⽅や⽬的はチームによって異なるので、
認識を揃えることが⼤事
31
Slide 32
Slide 32 text
⾮機能要件のテスト
▌性能検証
▌脆弱性検証
▌CI/CD にどのように組み込むかは時と場合による
l 毎回実⾏するには⻑時間になりがち
l 組み込めるなら組み込んだほうがいい
32
Slide 33
Slide 33 text
アーカイブ作成
▌デプロイ・リリース時に使⽤するアーカイブ
▌結合テスト、E2E テスト、⾮機能要件のテストでも使⽤する
l テストに通ったアーカイブをリリースする
33
Slide 34
Slide 34 text
デプロイ・リリース
▌ メインラインにマージされたときだけ実⾏されることが多い
l タスクブランチでも動作確認⽤環境にデプロイとかはある
▌ ステージング環境
l 本番環境によく似せたステージング環境でまずデプロイする
▌ 本番環境へのリリース戦略
l 万⼀の問題発⽣に備えることが重要
l ⼀部の環境から広げていく、ロールバック、無停⽌
l カナリアリリース、ブルーグリーンデプロイ、フィーチャーフラグ
など
34
CircleCI
▌クラウドサービス
l オンプレ版の CircleCI Server も社内で利⽤してます
▌プラグインとかなくてシンプル、導⼊しやすい
▌認証とか権限とか GitHub と連携してるので導⼊が楽
39
Slide 40
Slide 40 text
40
Slide 41
Slide 41 text
GitHub Actions
▌GitHub が提供する CI/CD サービス
l 現在は Enterprise Server は未対応
▌パブリックリポジトリでは完全無料
▌CI/CD に限らず GitHub の様々なイベントにフックできる
41
Slide 42
Slide 42 text
その他の CI/CD ツール
▌AWS Code シリーズ
l CodeBuild, CodeDeploy, CodePipeline, ...
l AWS と権限周りを統合しやすい
▌Argo CD
l Kubernetes ⽤ CD ツール
l GitOps できる
l https://www.weave.works/technologies/gitops/
42
不安定なビルド
▌不具合ではないのにビルドが失敗する
l CI/CD の信頼性が下がる
▌原因はいろいろ
l 本番コードではないので書かれる⼿抜きスクリプト
l E2E テストの微妙なタイミングのズレ
l 不安定な環境
l 構築⼿順が微妙に異なる、前のビルドのゴミが残ってる、など
61
Slide 62
Slide 62 text
ビルドを継続的に改善して品質を⾼める
▌ビルドで実⾏されるタスクは製品コードレベルの品質を⽬指す
l 特にメンテナンス性を⾼めることが⼤事
▌ビルド結果を計測する
l ビルドの失敗頻度やその原因を振り返れるようにしておくと
あとから改善しやすい
▌防ぎづらいレアケースもあるので⾃動リトライも⼀つの⼿段
▌環境は仮想化して毎回クリーンにする
l Docker コンテナ内でビルドするのが最近は⼀般的
62
Slide 63
Slide 63 text
まとめ
63
Slide 64
Slide 64 text
意識してほしいこと
▌⾼速なフィードバックループは不確実性を下げ、学びを最⼤化する
l 顧客へ提供する価値の最⼤化につながる
l 例えば Amazon では毎秒なにかしら本番環境にデプロイしてる
▌ボトルネックを意識してバランス感覚を持って⾃動化する
▌リリースしてようやく顧客に価値を提供できる
l コードを変更して終わりではない
l チーム全体でリリースやその後のフィードバックまで責任を持つ
64
Slide 65
Slide 65 text
時間あればその他⼩ネタ
65
Slide 66
Slide 66 text
Continuous Delivery vs Continuous Deployment
▌コード変更ごとにリリースまでの検証を⾏うのはどちらも同じ
▌Continuous Delivery
l 毎回本番環境にリリースするとは限らない
▌Continuous Deployment
l 毎回本番環境へのリリースまで⾃動で⾏う
▌どちらを選ぶかは時と場合に合わせて
66
Slide 67
Slide 67 text
DevOps
▌CI/CD より広いスコープを扱ってる
l 顧客に価値を提供する組織⽂化、プロセス、
プラクティスなど
l 厳密な定義はない
▌去年ざっくり講義したので興味ある⼈はどうぞ
l https://speakerdeck.com/cybozuinsideout/2018-14-
devops
67