問題
▌結合のタイミングでまとめて⼤きな差分が発⽣する
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
CI ツールがタスクブランチのコードでビルドを実⾏する
18
Slide 18
Slide 18 text
ビルドが失敗したら通るまで修正 & CI 再実⾏
19
Slide 19
Slide 19 text
ビルドが成功したらメインラインにマージする
20
Slide 20
Slide 20 text
CI ツールがメインラインのコードでビルドを実⾏する
21
Slide 21
Slide 21 text
ビルドが失敗したら通るまで修正する
22
Slide 22
Slide 22 text
メインラインでビルドが成功したら完了
23
Slide 23
Slide 23 text
CI の利点
▌⾼速なフィードバック
l 問題の早期発⾒
l ⾼速な学習
▌頻繁に変更がマージされるようになれば差分が⼤きくならない
l 問題発⾒時の調査が簡単になる
l リスク(不確実性)が減る
▌Success/Fail の可視化によるコミュニケーション促進
▌毎回の変更が⾃動テストで保証される安⼼感
24
Slide 24
Slide 24 text
CD (Continuous Delivery)
25
Slide 25
Slide 25 text
CD とは︖
▌CI の発展型
l コードの変更がトリガーとなって実⾏されることは同じ
▌コード変更からリリースまでに必要な検証を⾏う
l 常に信頼できるリリースができる状態を保つ
▌デプロイパイプラインという形で⾃動化する
l 部分的に⼿動作業が⼊ることもある
26
CD の利点
▌リリースのコストやリスクを抑えられる
l いつでもリリースできる
▌コード変更からリリースまでのフローが可視化される
l どこで問題が起きてるか、どこがボトルネックか、
などがすぐにわかる
29
Slide 28
Slide 28 text
CI/CD 内で実⾏すること
30
Slide 29
Slide 29 text
静的解析
▌構⽂チェック
l 構⽂エラーを防ぐ
▌コードスタイルチェック
l 可読性を⾼める、本質的でない議論を防ぐ
▌コードパターンチェック
l エラーが発⽣しやすいパターンを防ぐ
31
Slide 30
Slide 30 text
⾃動テスト
▌ 単体テスト
l ⼩さい単位のコードが役割通り動作するかチェックする
▌ 結合テスト
l 複数のコードを組み合わせた機能が正しく動作するかチェックする
▌ 受け⼊れテスト(E2E テスト)
l ビジネス要求を満たしてるかチェックする
▌ 上記以外にもいろいろ
l テストの種類ごとの呼び⽅や⽬的はチームによって異なるので、
認識を揃えることが⼤事
32
Slide 31
Slide 31 text
⾮機能要件のテスト
▌性能検証、脆弱性検証など
▌CI/CD にどのように組み込むかは時と場合による
l 毎回実⾏するには⻑時間になりがち
l 組み込めるなら組み込んだほうがいい
33
Slide 32
Slide 32 text
アーカイブ作成
▌デプロイ・リリース時に使⽤するアーカイブ
▌結合テスト、E2E テスト、⾮機能要件のテストでも使⽤する
l テストに通ったアーカイブをリリースする
34
Slide 33
Slide 33 text
デプロイ・リリース
▌ メインラインにマージされたときだけ実⾏されることが多い
l タスクブランチでも動作確認⽤環境にデプロイとかはある
▌ ステージング環境
l 本番環境によく似せたステージング環境でまずデプロイする
▌ 本番環境へのリリース戦略
l 万⼀の問題発⽣に備えることが重要
l ⼀部の環境から広げていく、ロールバック、無停⽌
l カナリアリリース、ブルーグリーンデプロイ、フィーチャーフラグ
など
35
その他の CI/CD ツール
▌AWS Code シリーズ
l CodeBuild, CodeDeploy, CodePipeline, ...
l AWS と権限周りを統合しやすい
▌Kubernetes ⽤ CD ツール
l Argo CD など
l GitOps と呼ばれる⼿法がよく使われる
l https://www.weave.works/technologies/gitops/
43
不安定なビルド
▌不具合ではないのにビルドが失敗する
l CI/CD の信頼性が下がる
▌原因はいろいろ
l 本番コードではないので書かれる⼿抜きスクリプト
l E2E テストの微妙なタイミングのズレ
l 不安定な環境
l 構築⼿順が微妙に異なる、前のビルドのゴミが残ってる、など
62
Slide 59
Slide 59 text
ビルドを継続的に改善して品質を⾼める
▌ビルドで実⾏されるタスクは製品コードレベルの品質を⽬指す
l 特にメンテナンス性を⾼めることが⼤事
▌ビルド結果を計測する
l ビルドの失敗頻度やその原因を振り返れるようにしておくと
あとから改善しやすい
▌防ぎづらいレアケースもあるので⾃動リトライも⼀つの⼿段
▌環境は仮想化して毎回クリーンにする
l Docker コンテナ内でビルドするのが最近は⼀般的
63
Slide 60
Slide 60 text
まとめ
64
Slide 61
Slide 61 text
意識してほしいこと
▌⾼速なフィードバックループは不確実性を下げ、学びを最⼤化する
l 顧客へ提供する価値の最⼤化につながる
l 例えば Amazon では毎秒なにかしら本番環境にデプロイしてる
▌ボトルネックを意識してバランス感覚を持って⾃動化する
▌リリースしてようやく顧客に価値を提供できる
l コードを変更して終わりではない
l チーム全体でリリースやその後のフィードバックまで責任を持つ
65