
開発手法・プロセス
技術的負債
Technical Debt
ソフトウェアの作りに改善の余地が残存し、以後の変更に余分な手間がかかる状態を借金にたとえた言葉です。速さのために意図して負うことも、知識不足や運用後の発見で生じることもあります。
しーあいしーでぃー / CICD / CI / CD / 継続的インテグレーション/継続的デリバリー / Continuous Integration / Continuous Delivery
ソースコードの変更をこまめに取り込み、自動でテストして、いつでも本番に反映できる状態を維持する開発の進め方とその仕組みです。リリースが速くなるほか不具合を混入させたときに前のバージョンへ切り戻しやすくなります。

CI/CDはCI(Continuous Integration)とCD(Continuous Delivery)の総称です。日本語ではそれぞれ継続的インテグレーション、継続的デリバリーと訳します。CIは各開発者の変更を小さな単位でこまめに共通のソースコードへ取り込む進め方です。取り込むたびにテストを自動で実行し、変更同士の矛盾を早期に発見します。CDはテストに合格した変更を、いつでも本番環境へリリースできる状態に維持することを指します。リリースの手順は自動化しておき、リリースの時期だけを人が決定します。
工場でいえば月末にまとめて行っていた出荷前の試験を、製品が1つできるたびに試験装置へ通す方式に変更するのに近いです。試験に合格した製品はいつでも出荷でき、出荷の時期は別に決定できます。
GitHub ActionsのようなCIサービスは、この進め方を自動で実行するためのサービスにあたります。変更の取り込みからテスト、本番への反映までを自動でつないだ処理はパイプラインと呼びます。
複数の開発者が別々に作業し、数週間分の変更を最後に一括して統合すると、変更同士がぶつかります。どこで不具合が混入したかの特定にも時間がかかります。リリース前に統合とテストだけの期間を何週間も確保し、夜間や休日に手順書を参照しながら手作業で本番へ反映する進め方になりやすくなります。反映が重い作業になるほどリリースの回数は減少し、1回に含まれる変更が増加して、失敗したときの影響も拡大します。
CDの考え方を整理したcontinuousdelivery.comは、統合とテストのための期間やコードの凍結期間をなくすことを目的に挙げています。
開発と運用の分断を組織と文化の面から解消しようとする考え方がDevOpsで、CI/CDはそれを支える技術的な実践の1つに位置づけられます。
テストを通った変更を人の判断を挟まずに自動で本番へ反映する運用は継続的デプロイと呼び、継続的デリバリーとは別の運用です。継続的デリバリーはいつでも反映できる状態を保つことまでを指し、反映するかどうかとその時期は事業側が決定してかまいません。DORAも両者は混同されやすいが別の実践だとしています。スマートフォンアプリや機器に組み込むソフトウェア、規制のある業種は継続的デプロイに向きませんが、継続的デリバリーは実践できます。承認の手順を維持したまま導入してかまいません。
1回あたりの変更が小規模になるため、失敗の原因を特定しやすく、切り戻す作業も軽くなります。DORAは指標の解説で、反映の速さと安定性は二者択一ではなく、成績の良いチームは両方の指標で良好な結果を示すとしています。
本番への反映手順の自動化と、最低限の自動テストまでは小規模でも導入したほうがよいです。凝った仕組みは必要ありません。
更新が年に数回のシステムほど、反映の手順を記憶している人がいなくなります。そのため久しぶりの改修や担当者の交代で障害が発生しやすくなります。手順をパイプラインとして記述しておけば、それ自体が手順書を兼ねます。脆弱性が見つかって急いで反映しなければならない場面でも、手順の確認から着手する必要がありません。
開発者が1〜2人でリリースが年に数回、変更が文言や設定の修正程度なら、反映の自動化と主要な画面や処理の動作確認を数本用意すれば十分です。これが目安です。初期構築は数日から2週間程度で、クラウドのCIサービスの費用は無料枠から月数万円程度に収まることが多いです。CIを実行するサーバーを自社で構築する構成を選択すると、サーバー代と保守の手間が別にかかります。月に数回以上リリースするか、3人以上が同じコードを編集するなら、変更を取り込むたびに自動テストを実行する体制まで構築します。
本番環境を備えない用途では考慮しなくてかまいません。一度きりのデータ移行に使用するスクリプトや、数人が手元で実行するだけの集計ツールが該当します。
使用しているツールの名前ではなく、本番への反映と切り戻しを実際にどう行っているかを質問します。CI/CDに対応という記載だけでは見極められません。
反映を手作業の手順書に頼り、夜間や休日にしか実施できない体制では、継続的デリバリーは実現できていません。不具合を前のバージョンへ切り戻すのに半日以上かかる体制も同様です。目安として数十分以内に切り戻せるかを確認します。この目安はリリースで混入させた不具合に対するもので、サーバーの故障や災害からの復旧時間とは別に定めます。回数の数字は他社と比較せず、同じシステムで推移を確認します。DORAの指標の解説にもチームや組織の間で比較する使い方を避けるよう記載されています。
あわせて納品後にソースコードとパイプラインの設定を発注者のアカウントで保有できるかを確認します。開発会社のアカウントにしかないと、乗り換えや内製化のときに反映の仕組みを一から再構築することになります。
導入してかまいません。先に反映の自動化と切り戻しの手順を用意し、自動テストは停止すると影響の大きい業務から順に追加していきます。全機能のテストが完成してから着手する必要はありません。
反映の自動化はテストが少なくても効果が表れます。手作業による反映ミスと担当者への依存が解消されるためで、費用も少額で済みます。テストは変更が多い箇所と、障害が発生すると売上や業務が停止する箇所から作成します。受注・決済・請求額の計算などが典型例です。テストの網羅率を目標の数字にせず、本番で不具合が発生したらその箇所のテストを追加する運用で充実させていきます。
テストの作成と保守は継続的にかかります。重要な処理に限定すれば開発工数の1〜3割、手厚く作成すれば本体と同程度の工数が目安です。見積もりではテストの工数が別に示されているかを確認します。既存システムにテストを追加する作業は技術的負債の返済の一部でもあるため、負債返済の予算と二重に計上しません。導入の初期は手動確認の残りや旧来のコードの整理に手間がかかり、一時的にかえって遅くなることがあります。数か月単位で反映の所要時間と切り戻しの回数を確認して、投資を継続するかを決定します。
事業の課題や技術的な悩みなどどんなことでもお聞かせください