CI/CDの基礎と実用的応用

May 6, 2024

CI/CDに関する講義ノート

概要

この講義は、継続的インテグレーション(CI)と継続的デリバリー(CD)に焦点を当てており、合わせてCI/CDと呼ばれます。これらの方法論は、コードコミットからデプロイメントまでのソフトウェア開発プロセスを自動化し、手動での人間の介入を減らすことを目的としています。CIはより一般的であり、複数の貢献者からのコード変更を単一のソフトウェアプロジェクトに自動的に統合することを含みます。CDは特に複雑なシステムで実装がより困難であり、ソフトウェアを本番環境に自動的にデプロイすることを含みます。この組み合わせは、より高品質のソフトウェアをより速く提供することを目指しています。

継続的インテグレーション(CI)

  • 定義と目的:

    • CIは、チームメンバーが共有リポジトリのメインブランチに対して頻繁に作業を統合する習慣です。
    • 主な目的は、統合エラーをできるだけ早く検出することです。
  • プロセス:

    • 各コードコミットは、CIサーバー上で自動ビルドとテストをトリガーします。
    • 新しいコミットがメインブランチと競合しないようにします。
  • テストと課題:

    • 効果的なCI設定は、包括的なテストセット(ユニット、統合)に依存しています。
    • 課題には、高いカバレッジを持つ非フレーキテストを維持し、テストカバレッジとテスト期間のバランスを管理して開発者の生産性を維持することが含まれます。
  • CIで使用されるツール:

    • ソースコード管理システム: GitHub。
    • CI管理ツール: GitHub Actions、Buildkite、Jenkins、CircleCI、TravisCI。
    • テスティングフレームワーク:
      • JavaScript:Jest(ユニットテスティング)、Playwright、Cypress(統合テスティング)。
    • ビルドツール:
      • Java:Gradle。
      • JavaScript:Webpack、その他のさまざまな速度は速いが拡張性の低いツール。

継続的デリバリー(CD)

  • 定義と実際の応用:

    • CDは、統合されたコードを本番環境に継続的に配信する自動化を目指すものです。
    • 全面的な継続的デプロイメントは複雑で、CIよりも一般的ではありません。
  • ステートレスシステムでの実装:

    • APIやWebサーバーなどのステートレスシステムにしばしば適用され、関与するリスクが最小限です。
    • 本番への影響を最小限に抑えるためのテクニックとして、機能フラグやカナリアデプロイメントが使用されます。
      • 機能フラグ: 再デプロイメントなしでオン/オフを切り替える機能。
      • カナリアデプロイメント: 初期段階で新しいアップデートを少数のユーザーに提供し、早期に課題を特定する手助けをする。
  • ステートフルシステムの課題:

    • データベースやその他のステートフルシステムは、ほとんど継続的にデプロイされることはありません。
    • これらは固定のデプロイスケジュールと手動介入が必要で、専任のチームによって管理されます。
  • CDで使用されるツール:

    • CIで使用されるツールと同様(例:GitHub Actions、Jenkins、Buildkiteなど)。
    • Kubernetes環境用のインフラ特有のツールとしてArgoCDなど。

結論

  • CI/CDは、高品質なソフトウェアを迅速に提供する能力を大幅に向上させることができます。
  • ただし、その効果はシステムの複雑さや利用可能なリソースによって異なります。
  • 汎用的な解決策ではありませんが、システムの要件に合わせて明確な戦略で実装される場合は非常に効果的です。

システム設計やソフトウェア実践についてさらに詳しく知りたい場合は、専門書をチェックするか、関連するニュースレターを購読することを検討してください。