CI/CDパイプラインの肥大化とテスト並列化:1回のPushで30分待たされる組織の生産性崩壊

Tech & Logic
スポンサーリンク

「GitにPushすれば、自動でテストが走り、ビルドされ、本番環境までデプロイされます」

昨今の開発現場では、CI/CD(継続的インテグレーション/継続的デリバリー)を導入していること自体が、さも先進的で優秀なエンジニア組織であるかのような免罪符として使われている。

だが、実態はどうだ。

コードを1行修正してPushするたびに、GitHub ActionsやGitLab CIのパイプラインが重そうに動き出し、完了までに「30分」待たされる。開発者はテスト結果を待つ間に集中力を切らし、YouTubeやTwitterを眺め始め、1日のコミット数は激減。パイプラインが詰まればデプロイ待ちの渋滞が発生し、緊急のバグ修正すら数時間単位で止まる。

挙句の果てに、30分かけてCIの緑のチェックマーク(パス)を確認して本番デプロイした瞬間、画面は500エラーで真っ白になる。

自動化の看板に酔いしれ、基礎を完全に放棄した「なんちゃってDevOps」の現場ほど、無駄なコストを垂れ流して組織の生産性を破壊している場所はない。

CI/CDがあるのにDockerを使わない現場:「経験者がいない」という耳を疑う言い訳

私が火消しとして送り込まれた、ある企業のクラウド移行プロジェクトでの話だ。

開発リポジトリを開いてみて、開いた口が塞がらなかった。ご立派なCI/CDパイプラインが構築され、テストスクリプトが何重にも組まれているにもかかわらず、開発者のローカルPC環境でDockerが一切使われていなかったのだ。

エンジニアたちに「なぜローカルをコンテナ化して環境を統一していないのか?」と問い詰めたところ、返ってきたのは信じがたいセリフだった。

「チーム内にDockerの経験者がいなくて……難しそうだったので、各自のMacにHomebrewで直接言語やDBを入れて開発しています」

意気消沈を通り越して、頭痛がした。

開発環境を仮想化・コンテナ化して「誰のどのマシンでも同一の環境を再現する」という、現代ソフトウェア開発のイロハのイすら放棄しておきながら、CI/CDパイプラインだけは一人前に作って悦に浸っている。これほど滑稽な砂上の楼閣があるだろうか。

OSもバージョンもバラバラ:テストが通るのに本番で即死する茶番劇

ローカルでコンテナを使わずに「各自のPC」で開発している現場で、何が起きるか。当然の結末として、環境の完全な不一致が発生する。

  • 開発者のマシン:macOS、PHP 8.2、ローカルに直接立てたMySQL 8.0
  • CI/CD環境:Ubuntu Linux(コンテナ)、PHP 8.1(CIの設定を作った当時の古いイメージ)
  • 本番サーバ:Amazon Linux 2、PHP 8.0

言語のマイナーバージョンどころか、OSも、ライブラリの依存関係も、内部で使っている文字コードの挙動すらバラバラだ。

開発者のPCで「動きました!」とコミットし、CIにPushすると、PHPのバージョン差分で構文エラーを吐いてパイプラインが真っ赤になる。慌ててCIの設定をガチャガチャいじって無理やりパスさせても、いざ本番にデプロイすれば、Amazon Linux上で拡張モジュールが見つからずにシステムが即死する。

「ローカルでは動いたんですが……」
「CIの自動テストはパスしたんですが……」

障害が起きるたびに現場で繰り返されるこの無様な言い訳。OSやランタイムの差分という、最も原始的な問題を放置したまま組まれた自動テストなど、サイコロを振って合否を決めているのと何一つ変わらない。

前任者の大風呂敷を畳む地獄:クライアントに「年内移行は無理です」と頭を下げる

このプロジェクトが最悪だったのは、私の前にいた「前任のイキりエンジニア」が、経営陣とクライアントに対して大嘘を吹き込んでいたことだ。

「CI/CDを組んだので、すべてのテストと本番デプロイは全自動化されます! 年内のクラウド移行も余裕で完了します!」

そうドヤ顔でアピールし、技術負債の塊のような設定ファイルを残して現場から姿を消した。

残されたのは、ローカルとCIと本番で環境が分裂し、テストが動くたびに30分間開発がストップし、デプロイするたびに何かが壊れる地獄絵図だ。

火消しとして実態を調査した私は、クライアントの役員会議に出席し、冷水をぶっかける役目を引き受けるハメになった。

「前任者が何を説明していたかは知りませんが、現状のアーキテクチャは完全に破綻しています。まずはCI/CDを一度止め、ローカル環境をDockerで完全に統一し、本番環境のコンテナと1バイトの狂いもなく一致させる土台作りからやり直す必要があります。年内のクラウド移行は100%不可能です。スケジュールを半年延期してください」

会議室は凍りつき、クライアントからは厳しい言葉を浴びせられた。他人の無知と「自動化できます」という安っぽい虚栄心の後始末をさせられることほど、理不尽で腹立たしい仕事はない。

自動化が偉いのではない:「環境の一致」こそがすべてだ

世のエンジニアは「自動化」という言葉に過剰な幻想を抱きすぎている。

CI/CDツールを導入してパイプラインを走らせることがモダンなのではない。重要なのは、「開発環境でチェックした成果物が、本番環境でも何一つ挙動を変えずに寸分違わず動くこと」だ。

その保証がない自動化など、粗大ゴミを高速で本番環境へ投げ込んでいるに過ぎない。

  • ローカルと本番のコンテナ完全一致:開発者がコードを書くコンテナと、本番で稼働するコンテナイメージを同一にする。これができていないなら、CI/CDなど触る資格はない。
  • テストの断捨離と並列化:無駄に何十分もかかるE2Eテストや結合テストを毎Pushごとに走らせるな。コミット時は軽量な単体テストと静的解析だけを数分で終わらせ、重いテストはステージング反映時や夜間バッチで並列実行させる。
  • デプロイは手動でいい:「ボタン一発で本番反映」が怖いなら、デプロイのトリガーなんてエンジニアが指差し確認しながら手動で叩けばいいのだ。大事なのはデプロイの自動化ではなく、デプロイされる「ブツ」の信頼性である。

「クラウドは便利」「CI/CDで全自動」という浅薄な妄想は今すぐ捨てろ。

派手なツールに飛びつく前に、目の前の開発マシンの環境を本番と1ミリのズレもなく揃える。その泥臭い基本をやり切れない人間に、DevOpsを語る資格などない。

タイトルとURLをコピーしました