レガシーシステムにおけるCI/CDパイプラインの導入戦略

佐藤 美咲
シニアDevOpsエンジニア 2023年10月24日 読了時間 8分
Image by Unsplash

レガシーアプリケーションのモダナイゼーションは、決して容易な道のりではありません。10年以上にわたって成長し続けてきたモノリス(巨大な一枚岩のシステム)を扱う際、効率的なCI/CDパイプラインを導入するというアイデアは、気が遠くなるような作業に思えるかもしれません。

しかし、自動化がもたらすメリット—フィードバックループの短縮、手作業によるミスの削減、そして一貫性のあるデプロイメント—は、初期の複雑さを補って余りある価値があります。このガイドでは、本番環境を壊すことなく、モノリシックなコードベースに段階的にCI/CDを導入するための戦略を解説します。

architecture モノリスの現状を理解する

YAMLを書き始める前に、依存関係をマッピングする必要があります。多くのレガシーモノリスでは、データベース、バックエンドロジック、そして多くの場合フロントエンドのテンプレートが密結合しています。

info

重要なポイント

いきなり全てをマイクロサービス化しようとしないでください。まずは、モノリスを一つのユニットとして扱い、そのビルドとテストプロセスを自動化することから始めましょう。

account_tree パイプライン戦略

ここでは標準的なJenkinsやGitHub Actionsのワークフローを使用します。目標は、まずビルドプロセスをコンテナ化することです。これにより、開発者のマシンとCIサーバー間でのビルド環境の一貫性が保証されます。

1. ビルドのDocker化

必要なすべての依存関係(Javaバージョン、Maven/Gradle、Node.jsなど)を含む Dockerfile.build を作成します。

Dockerfile
FROM maven:3.8.6-openjdk-11 AS build
# 作業ディレクトリの設定
WORKDIR /app
# プロジェクト定義のコピー
COPY pom.xml .
# 依存関係のダウンロード
RUN mvn dependency:go-offline
# ソースコードのコピー
COPY src ./src
# パッケージのビルド(テストはスキップ)
RUN mvn package -DskipTests

ビルド環境を分離することで、「私のマシンでは動くのに」という問題を完全に排除できます。

bug_report 自動テストの導入

レガシーなコードベースでは、包括的なユニットテストが欠けていることがよくあります。カバレッジ100%を目指して開発を止めるのではなく、クリティカルパスに対するスモークテスト統合テストに焦点を当てましょう。

  • check_circle 収益を生み出す上位5つのフローを特定する。
  • check_circle CypressやSeleniumを使用してエンドツーエンド(E2E)テストを作成する。
  • check_circle 本番デプロイの前に、ステージング環境でこれらのテストを実行する。

結論

モノリスのモダナイゼーションは短距離走ではなく、マラソンです。小さく始め、痛みを伴うポイントを自動化し、徐々にパイプラインを改善していきましょう。未来の自分(そしてオンコールのチームメンバー)は、きっとあなたに感謝するはずです。

佐藤 美咲 (Misaki Sato)

クラウドインフラと自動化において10年以上の経験を持つシニアDevOpsエンジニア。複雑なシステムの簡素化に情熱を注ぎ、レジリエントなパイプライン構築の指導にも力を入れている。

ディスカッション 3

田中 健太

2日前

素晴らしい記事ですね!前回のプロジェクトで特にデータベースのマイグレーション部分で苦労しました。このパイプラインでスキーマ変更を扱う際のアドバイスはありますか?

Sarah Jenkins

1日前

Dockerfileの例が的確で分かりやすいです。シンプルで効果的ですね。シェアありがとうございます!