デブサミ関西の登壇資料です
1CI/CDを使い倒して数段上のソフトウェア開発しよう#circlecijp #devsumi
View Slide
2CI/CD 戦国時代Google GCP Cloud BuildMicrosoft Azure PipelinesAWS CodeBuild GitHub Actions
3CI/CD 戦国時代
4最初の疑問なぜCI/CDへの関心がこれほど高まっているのか?
5自己紹介:Kim, Hirokuni (金 洋国)- 元CircleCI 開発者- CircleCI Japan TechLead- CircleCI SRE- 灘生まれ、谷上育ち
6モチベーションについて
7このセッションの基本の流れWhatWhyWhy NotBeyond
8CI / 継続的インテグレーション
9What is CI?
10その前に確認もちろんテストは書いてますよね?
11なぜテストを書くべきか● 何度も同じ手順を繰り返さないといけない● 人の目や手に頼ると必ず見落としが発生する
12なぜテストを書くべきか● 何度も同じ手順を繰り返さないといけない● 人の目や手に頼ると必ず見落としが発生するそれコンピューターにやらせようよ!
13CIとはテストを自動で実行する仕組み開発者のコード変更に対して● 常に● 同じ環境でテストを実行してくれる
14CIとはテストを自動で実行する仕組み開発者のコード変更に対して● 常に● 同じ環境でテストを実行してくれる※ テストは自分たちで用意する必要がある
15Why CI?
16ただテストを書くだけでは不十分● テストがあるけど実行し忘れた● 昔書いたテストが壊れていて動かない● テスト結果が環境依存
17ただテストを書くだけでは不十分● テストがあるけど実行し忘れた● 昔書いたテストが壊れていて動かない● テスト結果が環境依存テストの信頼性がない
18問題: テストの実行忘れ● リリース前にテストをしわすれる● バグを見落とす● 修正でリリースが遅れる
19解答: 常にテストを回す● GitHub (VCS)の変更をCI/CDが検知● 全変更に対してテスト実行
20問題: テストが壊れてしまう● 古いテストが壊れている● テストが悪いのかコードがわからない
21解答: 壊れたテストを素早く検知● テストが壊れた時点で検知● 直さないとマージできない (後述)
22使われていない自動化は壊れていく“サイボウズを支える CircleCI”より
23問題: テスト結果が環境依存僕のマシンだとテスト通ってます(`・ω・´) キリッ
24解答: CIを唯一のテスト環境にする● 毎回同じテスト環境が構築される● まっさらな環境でテストを実行● いつ実行しても同じテスト結果になる
25CIの目的テストの新陳代謝を高めて信頼性をあげる
26Why NOT CI?
27CI導入を妨げる問題● テストがない● メンテナンス
28問題: テストがない● CIを始めたい● でも実行するテストが存在しない● テスト文化の布教にはコストと時間がかかるCIを導入する上でいちばんやっかいな問題
29テストがない状態からCIを始める5ステップStep 1: お好みのCI/CDツールを選ぶStep 2: タスクの自動化Step 3: 可視化するStep 4: マージブロックStep 5: テストを追加していく
30Step 1: お好みのCI/CDツールを選ぶ
31ステップ2: 様々なタスクを自動化しようテスト以外のタスクを自動化● 構文チェック(linting)● カバレッジ計測● 循環的複雑度のチェック● ドキュメントの自動生成
32ステップ3: 可視化しようCI結果を可視化しよう● ステータスバッジ● ダッシュボードの作成● メール・チャットでの通知
33CIやってる感が出てくる”お、俺たちCIしてるっぽい”
34Step 4: マージブロック有効化マージするための条件をブランチごとに指定できる機能● CIが通らないとマージできない● 管理者しかマージできない● Force Push禁止● Etc, etcCircleCIが通らないとマージできない
35Step 5: テストの追加少しずつテストを追加していく● ユニットテストはとりあえず後回し● 最も大事なビジネスロジック● この時点では無理は禁物....
36CI導入を妨げる問題● テストがない● メンテナンス
37問題: メンテナンス● CI/CDツールのメンテナンスは大変● 通常専任のエンジニアが必要● CircleCIのようなクラウド型がおすすめ
38クラウド型 VS オンプレミス型クラウド型 オンプレミス型AWS CodeBuild CircleCIGCP Cloud Build Travis CIJenkinsConcourse CI
39CIのまとめ● テストの信頼性と品質を向上させる● テストがなくてもCIは始めれる● できる自動化からはじめよう● クラウド型のツールで運用コストを下げる
40Beyond CI
41開発フローコードをPush
42開発フローコードをPush CIでテスト
43開発フローコードをPush CIでテスト masterへマージ
44開発フローコードをPush CIでテスト masterへマージ自動
45開発フローコードをPush CIで自動テスト masterへマージ自動リリース手動
46CD / 継続的デプロイメント
47What is CD?
48CDとは?Continuous Deployment (継続的デプロイメント)自動でステージング・本番環境へデプロイContinuous Delivery (継続的デリバリー)常にリリース可能な状態を維持する
49Continuous Delivery (継続的デリバリー)リリース作業に人間の意思が介在するコードプッシュJARファイルCIDockerイメージステージング本番環境人間が決定CDContinuousDelivery
50Continuous Deployment (継続的デプロイメント)リリースに人の意思が介在しないコードプッシュJARファイルDockerイメージステージング本番環境ContinuousDeliveryCDCI CDContinuousDeployment
51Why CD?
52リリース後に発覚する仕様バグ● リリースして実際に使ってみた● ユーザーの要求を満たしていない● 仕様が全然間違っていた
53なぜこのようなことが起こるのか本当に必要な機能はクライアント/ユーザーにも使ってみないとわからない
54解答: フィードバックループを使おう● 細かい単位でリリースする● フィードバックを早めに得る● カイゼンする
55CDなしだとだとループが回らない● リリースの許可が必要● ヒューマンエラーフィードバックループが回らない
56CDなくしてフィードバックループなしNo CD, No Feedback Loop
57Why NOT CD?
58Why NOT CD?● エンタープライズなアーキテクチャー● レガシー (技術的負債が多い) アーキテクチャーそもそもシステムがCDに向いてない
59解答: 時間をかけてアップデート● サービスの疎結合● 徐々にモダン化CD導入の銀の弾丸はない
60CircleCIでの事例Before:● 常に200台以上のビルドマシンからなるフリート● Chat Ops (hubot)でデプロイ● およそ2日で完全に入れ替わる● しばらく古いコードと新しいコードが混在する問題
61CircleCIでの事例1年かけて以下を実施した● DockerとKubernetesの導入● マイクロサービス化
62新システムにはまずCI/CDを導入しよう家永 英治さんのブログより
63CDのまとめ● CDが回るとフィードバックループも回る● CDに向いていないシステムはある● 既存システムに導入が無理なら新システムから
64Beyond CD
65CDのその先1: 迅速なロールバック$ git revert CD 修正完了
66CDのその先2: 本番環境でのテスト
67テスト環境での失敗例1週間テスト環境でテスト
68テスト失敗例1週間テスト環境でテスト↓リリース (完璧だ!)
69テスト失敗例1週間テスト環境でテスト↓リリース (完璧だ!)↓本番環境のDockerのバージョンが古くてバグを踏む
70テスト失敗例Dockerのバージョンも同じにした!
71テスト失敗例Dockerのバージョンも同じにした!↓リリース (今度こそ完璧だ!)
72例 2Dockerのバージョンも同じにした!↓リリース (今度こそ完璧だ!)↓GitHubのAPI使用制限にひっかかる
73なぜこんなことが起こるか?テスト可能部分外部サービスビジネス要求仕様トラフィック・負荷テスト可能な部分はとても小さい!
74なぜこんなことが起こるか?テスト可能部分外部サービスビジネス要求仕様トラフィック・負荷テスト可能な部分はとても小さい!
75開発者たちの重大な学びリリースしてみないと結局わからない!
76デプロイとリリースの違いデプロイコードを本番環境に配置することリリース配置したコードでトラフィックをさばくこと
77CDのその先3: 高度なリリース手法● カナリーリリース● ブルー グリーン デプロイ
78CDをつかいこなすと、、、● 迅速なロールバック● 本番環境でのテスト● 高度なリリース手法これらがもたらすものは、、、
79CDをつかいこなすと、、、● 迅速なロールバック● 本番環境でのテスト● 高度なリリース手法これらがもたらすものは、、、プログラミングに対する圧倒的な心理的安全
80Why CD?CI/CD Makes ProgrammingFUN!!
81CI/CDの未来
82CI/CDはどこへ向かうのか?CI
83CI/CDはどこへ向かうのか?CI CDelivery
84CI/CDはどこへ向かうのか?CI CDelivery CDeployment
85CI/CDはどこへ向かうのか?CI CDelivery CDeployment ????
86CI/CDはどこへ向かうのか?CI CDelivery CDeployment ????自動化自動化自動化CI/CDの歴史は自動化の歴史
87確実な自動化の未来今手動でやっていることを意識しなくてもいい時代● CIやCDの設定● モニタリング● デプロイ環境の構築
88CI/CDの未来$ git commit -m “First commit” && git push最初からクライマックス!!
89CircleCI ユーザコミュニティ東京大阪福岡ソウルバンコクジャカルタ
90CircleCIファンのためのコミュニティ!#circlecijpcircleci.connpass.comCircleCI ユーザコミュニティcirclecijp = “学ぶ” と “つながる”● Learn機能だけでなく、運用のハナシも!● Connectうまく使っている人だけでなく、これから使う人の HUB に!● Outputあなたのアウトプットが、誰かの躓きを防ぐ!あればあるほど、自分の疑問も解消しやすい!
91ご静聴ありがとうございました