DevOps 技術: バージョン管理

Git、Subversion、Mercurial などのバージョン管理システムを使用すると、ファイルを整理し、チームや組織間でファイルの作成、アクセス制御、更新、削除を調整できます。バージョン管理は自動化と密接に関連しています。実際に、自動化と継続的インテグレーションは、自動化のソースコードだけでなく、自動化する構成および配布するデータについても、これらのファイルに依存します。

ソフトウェア配信を改善するには、ソースコード、テスト スクリプト、デプロイ スクリプト、インフラストラクチャの構成情報、アプリケーションの構成情報、およびこれらが依存する多くのライブラリとパッケージに、バージョン管理を使用する必要があります。バージョン管理システムでは、現在の(および、これまでの)環境の状態を照会できなければなりません。また、バージョン管理には、障害復旧や監査可能性などの直接的なメリットもあります。

調査によると、多くの機能の中でも特にバージョン管理を包括的に使用することで、継続的デリバリーを期待できます。特に、バージョン管理は次の重要な要件を満たすのに役立ちます。

  • 再現性。完全に自動化された方法で、あらゆる環境をプロビジョニングできる必要があります。また、同じ構成から新たに再現された環境は、すべて同一でなければなりません。この目標を達成するための前提条件は、環境のプロビジョニングに必要なスクリプトと構成情報が、アクセス可能な共有システムに格納されていることです。

  • トレーサビリティ。どの環境を選んでも、その環境を作成するために使用するすべての依存関係のバージョンをすばやく正確に判断できなければなりません。また、環境の 2 つのバージョンを比較し、その環境間の変更点を理解する必要があります。

これらの機能には、次のような重要なメリットがあります。

  • 障害復旧。ハードウェア障害やセキュリティ侵害など、環境になんらかの問題が発生した場合、サービスを復旧するために、決定性の時間内に環境を再現できる必要があります。

  • 監査可能性。配信プロセスの整合性を証明するために、すべてのデプロイメントから、そのバージョンを含む元の要素までのプロセスをさかのぼって提示できなければなりません。これは、包括的な構成管理とデプロイメント パイプラインを組み合わせることで可能になります。

  • 品質の向上。ソフトウェア配信プロセスでは、デプロイメント環境、テスト環境、本番環境の準備遅延による影響を受けることがよくあります。これらの準備をバージョン管理から自動的に実施すると、チームが加えた変更の影響に関するフィードバックをより迅速に得ることができ、ソフトウェアの品質をさらに向上できます。

  • 容量管理。さらに多くの容量を環境に追加する必要がある場合、既存のサーバーを複製する機能が不可欠です。この機能を使用すると、クラウドベースの最新の分散システムによる水平方向のスケーリングが可能になります。

  • 不具合に対する対応。システムの一部のコンポーネントで重大な不具合や脆弱性が発見された場合、ソフトウェアの新バージョンをできるだけ早くリリースする必要があります。すべてのアーティファクトをバージョン管理に保存することで、以前検証した作業状態にすばやく確実にロールバックできます。

環境の複雑化と異種混合が進むにつれ、これらの目標の達成は着実に難しくなります。複雑な企業システム(少なくとも実際のシステムすべてが状態をもつ)では、完全な再現性とトレーサビリティを実現することは不可能です。したがって、構成管理における重要なポイントは、期待されるメリットの達成に必要な投資を削減するために、アーキテクチャ、環境、プロセスの簡素化に取り組むことです。

バージョン管理の実装方法

バージョン管理の実装には、まず測定可能な条件で達成目標を定義することをおすすめします。これにより、目標を達成するための最適な手段を決定できます。また、選択した手段ではコストまたは時間がかかりすぎる場合には、方針の転換や目標の見直しも可能です。

バージョン管理システムは、システムに保存されているファイルへの変更を記録します。これらのファイルは、ソースコード、アセット、およびソフトウェア開発プロジェクトに含まれるその他のドキュメントなどです。変更は、「commit」または「リビジョン」と呼ばれる単位で加えられます。各リビジョンと、そのリビジョンに関連するメタデータ(変更の実施者や日時など)がシステムに保存されます。これにより、以前のリビジョンを commit、比較、統合、復元できるようになります。また、本番環境のオブジェクトを以前のバージョンに戻す方法を確立することで、リスクを最小限に抑えます。

重大な障害が発生した場合でも、本番環境のサービスを繰り返しかつ予想通りに(そして、理想としては、すばやく)復旧するため、次のアセットを共有のバージョン管理リポジトリにチェックインする必要があります。

  • すべてのアプリケーション コードと依存関係(ライブラリ、静的コンテンツなど)
  • データベース スキーマ、アプリケーション参照データなどの作成に使用するすべてのスクリプト
  • 前の手順で説明したすべての環境作成ツールとアーティファクト(VMware または AMI イメージ構築スクリプト、Chef レシピなど)
  • コンテナの作成および構成に使用するすべてのファイル(Docker ファイルやビルドパックなど)
  • サポートするすべての自動テストと手動テストのスクリプト
  • コードのパッケージ化、デプロイメント、データベース移行、環境プロビジョニングをサポートするすべてのスクリプト
  • サポートするプロジェクトのアーティファクト(要件に関するドキュメント、デプロイメント手順、リリースノートなど)
  • コンテナ オーケストレーション(Kubernetes 構成、Mesos 構成、Docker Swarm 構成など)
  • すべてのクラウド構成ファイル(AWS Cloudformation テンプレート、Cloud Deployment Manager 構成、Microsoft Azure Stack DSC ファイル、OpenStack HEAT、Terraform ファイル、Pulumi スタックなど)
  • 複数のサービスをサポートするインフラストラクチャの構築に必要となる、その他すべてのスクリプトまたは構成情報(エンタープライズ サービス バス、データベース管理システム、DNS ゾーンファイル、ファイアウォールの構成ルール、その他のネットワーキング デバイスなど)

Git のような従来のファイルベースのバージョン管理システム以外にも、バージョン管理はさまざまな形式を取ることができます。ソースコードと一緒にバージョニング、ラベル付け、およびタグ付けされた、さまざまな種類のオブジェクトやサービスにリポジトリが複数ある場合もあります。たとえば、大きな仮想マシンイメージ、ISO ファイル、コンパイル済みバイナリなどを、Nexus や Artifactory などのアーティファクト リポジトリに保存することも考えられます。あるいは、Cloud Storage や Amazon S3 などの blob ストアにオブジェクトを配置することや、Docker レジストリに Docker イメージを格納することもできます。これらの手段は再現性とトレーサビリティの要件を満たし、同様のメリットをもたらします。

本番環境前のあらゆる状態を再現する以外にも、運用前プロセスおよびビルドプロセスを再作成できなければなりません。そのため、ツールや依存する環境など、ビルドプロセスが活用するあらゆるものをバージョン管理にチェックインする必要があります。

バージョン管理の主な注意点

バージョン管理の使用で特に注意すべき点は、用途または使用の制限です。つまり、バージョン管理はソフトウェア アプリケーション コードにのみ適用されます。ベスト プラクティスには、バージョン管理に保存されたスクリプト、ソースコード、構成情報を使用して、デプロイされたソフトウェアを含むテスト環境と本番環境すべてを、完全に自動化された方法で再現する機能が必要です。

バージョン管理の改善方法

バージョン管理を改善するには、多くの方法があります。おすすめの方法は次のとおりです。

  • バージョン管理への commit のたびに、バージョン管理の情報のみを使用して環境にデプロイされるパッケージの自動作成がトリガーされるようにします。
  • バージョン管理のスクリプトおよび構成情報のみを使用して、本番環境に似たテスト環境をオンデマンドで作成できるようにします。また、前の方法で説明した自動プロセスを使用してパッケージを作成できるようにします。
  • 容量追加および障害復旧が完全に自動化された方法でできるように、テストおよび本番環境のインフラストラクチャのスクリプトを作成します。

バージョン管理システムを実装する際は、制約を重視してください。たとえば、次のような制約です。バージョン管理から本番環境への迅速な変更を妨げる最大の要因は何ですか?ビルドは遅いですか?デプロイ可能なパッケージを再作成するのは難しいですか?本番環境に似たテスト環境を作成するのは難しいですか?これらの制約が、目標達成を阻んでいる可能性があります。また、システムのアーキテクチャに、解消すべき問題点が存在していることも考えられます。

バージョン管理の測定方法

バージョン管理をシステムでどの程度効果的に使用しているかを測定するには、次の方法を試すことをおすすめします。

  • アプリケーション コード。アプリケーション コードにバージョン管理を使用していますか? バージョン管理に保存しているアプリケーション コードの割合はどのくらいですか?バージョン管理システムから、簡単かつ迅速にアプリケーション コードを復元できますか?

  • システム構成。システム構成にバージョン管理を使用していますか?バージョン管理に保存しているシステム構成の割合はどのくらいですか?バージョン管理から、簡単かつ迅速にシステムを再構築できますか?

  • アプリケーション構成。アプリケーション構成にバージョン管理を使用していますか?バージョン管理に保存しているアプリケーション構成の割合はどのくらいですか?バージョン管理システムのコードから、簡単かつ迅速にアプリケーションを再構成できますか?

  • ビルドと構成の自動化スクリプト。ビルドと構成を自動化するためのスクリプトをバージョン管理に保存していますか?バージョン管理に保存している割合はどのくらいですか?バージョン管理のスクリプトを使用して、システムを簡単かつ迅速に再プロビジョニングできますか?

これらの推奨事項はほんの一例ですが、きわめて重要です。まずはこれらの推奨事項から取りかかり、十分に理解を深めることをおすすめします。それからこの記事を見直し、ソフトウェア開発および配信に使用する他のアーティファクトに対して同様の質問を行います。バージョン管理に含まれるそれらのアーティファクトの割合はどのくらいですか?バージョン管理のアセットを使用して、新しいシステムや構成を簡単かつ迅速にデプロイできますか?

次のステップ

  • DevOps ページで他の記事やリソースへのリンクを確認する。