すべてのアーティファクトに名前と番号が必要な理由

チームは毎日コードをビルドする。金曜日になると、リポジトリには7つの異なるアーティファクトが並ぶ。どれがテスト済みで、どれにホットフィックスが含まれ、どれを本番に出すべきか、誰も覚えていない。「どのビルドをデプロイすればいい?」という質問に、返ってくるのは肩をすくめるだけの反応だ。

これこそ、明確な命名がないアーティファクトは、もはやアーティファクトではなく、単なるファイルに過ぎないと気づく瞬間である。適切な命名と番号付けの仕組みがなければ、パイプラインは確実性ではなくノイズを生み出す。

ラベルのないアーティファクトの問題

アーティファクトに明確な識別子がないと、すべてのデプロイが推測ゲームになる。チームはタイムスタンプやフォルダ名、あるいは記憶に頼り始める。「火曜日の午後のビルドに修正が入っていたはず」——そういう考え方は危険だ。間違ったバージョンをデプロイしたり、テストもされていないものにロールバックしたり、最悪の場合、どれが最新か誰にもわからず壊れたアーティファクトを本番に流してしまう。

核心は単純だ:アーティファクトを一意に識別できなければ、確実にデプロイすることはできない。そして確実にデプロイできなければ、自信を持ってリリースすることもできない。

アーティファクトを識別可能にするもの

すべてのアーティファクトには、名前と番号の2つが必要だ。名前はアーティファクトが何かを示し、番号はその何番目のバージョンかを示す。この2つを組み合わせることで、チーム全員が曖昧さなく参照できる一意の識別子が生まれる。

名前は通常、アプリケーション名やコンポーネント名である。番号はバージョンだ。これらを組み合わせると、payment-service-2.1.3 のような文字列になる。この文字列は、ただ一つのアーティファクトを指し示す。先週のものではない。似た名前のものでもない。まさにその一つだけだ。

バージョニングは飾りではない

バージョニングは、アーティファクト識別子の番号部分に意味を与える仕組みである。単なるカウンターではない。優れたバージョニングスキームは、アーティファクト自体について何かを教えてくれる。変更の性質、リスクレベル、以前のバージョンとの関係を伝える。

最も広く使われているのはセマンティックバージョニングだ。ドットで区切られた3つの数字、MAJOR.MINOR.PATCH で構成される。各数字には明確な意味がある。

  • MAJOR は、後方互換性を壊す変更を行ったときに増える。既存のユーザーがコードやワークフローを変更する必要がある場合、それはメジャーバージョンアップである。
  • MINOR は、従来の方法でも動作する新機能を追加したときに増える。ユーザーは何も壊さずにアップグレードできる。
  • PATCH は、新機能を導入せず、既存の機能も壊さないバグ修正に対して増える。

バージョン 2.1.3 を見れば、そのアプリケーションが2回のメジャーな互換性破壊、1回の機能追加、3回のバグ修正を経ていることがわかる。小さな文字列にこれだけの情報が詰まっている。

イミュータビリティはバージョニングから始まる

バージョン番号は単なるラベルではない。契約である。一度アーティファクトがビルドされ、バージョンがタグ付けされたら、そのバージョンは決して変わってはならない。同じコードを再ビルドすれば、同じアーティファクトが得られるはずだ。何かが変わったなら、バージョンも変わらなければならない。

これこそがアーティファクトをイミュータブル(不変)にする所以である。バージョン 2.1.3 は常に同じバイナリ、同じコンテナイメージ、同じパッケージを指す。今日ダウンロードしても、来週でも、6ヶ月後でも同じだ。アーティファクトは同一である。この確実性こそが、ステージングでテストしたものを、本番にまったく同じものをデプロイできる基盤となる。

バージョニングとリリースは別物

よくある間違いは、バージョニングとリリースを同じ概念として扱うことだ。これらは異なる。バージョニングはアーティファクトにラベルを付けること。リリースは、そのアーティファクトをユーザーが利用できるようにするかどうかを決定することである。

バージョン 2.2.0-beta をビルドし、テスト用にステージングにデプロイすることもできる。そのバージョンはアーティファクトとして存在するが、リリースではない。テスト後、2.2.0 として本番リリースする判断をするかもしれない。あるいは問題が見つかり、代わりに 2.2.1 をビルドするかもしれない。

この分離が柔軟性を生む。アーティファクトのビルドとバージョン付与は頻繁に行い、リリースは確信が持てたときだけ行えばよい。バージョン番号はアーティファクトの同一性を追跡し、リリース判断はその準備状態を追跡する。

パイプラインへの実践的な影響

明確な命名とバージョニングの仕組みが整えば、いくつかのことが容易になる。

トレーサビリティが自動化される。 本番でバグが報告されたら、その環境で動作しているバージョンを確認する。そのバージョンにどのような変更が含まれているかを調べる。以前の安定バージョンと比較する。これらすべてが可能なのは、すべてのアーティファクトに一意の識別子があり、それがソースコードとビルドプロセスにリンクしているからだ。

ロールバックが正確になる。 以前どのバージョンが動いていたかを推測する必要はない。先週どのバージョンが動いていたか正確にわかり、その同じアーティファクトを再デプロイできる。アーティファクトはイミュータブルなので、まったく同じバイナリをデプロイすることになり、再ビルドによって動作が変わる心配はない。

コミュニケーションが明確になる。 「最新のビルドをデプロイして」ではなく、「payment-service 2.1.3 を本番にデプロイして」と言えば、全員がその意味を正確に理解する。DBAはどのデータベースマイグレーションが来るか、QAチームはどのテストが実行されたか、運用チームは何を監視すべきかがわかる。

アーティファクト命名のためのシンプルなチェックリスト

初めてアーティファクトの命名ルールを設定するなら、以下のチェックリストを参考にするとよい。

  • すべてのアーティファクトに、アプリケーション名またはコンポーネント名と一致する名前が付いている。
  • すべてのアーティファクトに、一貫したスキームに従ったバージョン番号が付いている。
  • バージョン番号はビルド時に割り当てられ、その後変更されない。
  • アーティファクトリポジトリは、タイムスタンプやフォルダではなく、名前とバージョンでアーティファクトを保存する。
  • チームはバージョニング(ラベル付け)とリリース(利用可能にすること)の違いを理解している。
  • バージョニングスキームが変更の性質(メジャー、マイナー、パッチ)を伝えている。

まとめ

アーティファクトの命名とバージョニングは、官僚的な作業ではない。信頼性の高いデプロイの基盤である。これがなければ、パイプラインは不確実性を生み出す。適切に実装すれば、すべてのアーティファクトは明確なアイデンティティを持ち、すべてのデプロイには明確なターゲットがあり、すべてのロールバックには明確な目的地がある。アーティファクトに名前を付け、一貫して番号を振り、イミュータブルにせよ。そうすれば、自信を持ってデプロイできる。