ソフトウェアのバージョン管理

ソフトウェアのバージョン管理を行うこともビルド職人の仕事です。
ソフトウェアのバージョンを適切に管理することで、以下に挙げるメリットを享受できます。

  • 不具合がどのバージョンで混入されたか
  • 不具合が混入される以前は、アプリケーションがどのような振る舞いをしていたか
  • リリースミスなどのソフトウェアのバージョンを元に戻したい事案が発生したときに、バージョンを即座に戻せる
  • フレームワークバージョンやアプリケーション基盤のライブラリバージョンを、開発しているアプリケーションへ適用するタイミングをコントロールできる

ソフトウェアのバージョン管理にはMavenとライブラリ管理を組み合わせる

SubversionやGitによるtag運用でもバージョン管理は行えますが、以前のバージョンに戻してすぐにリリースを行ったり、使用するライブラリバージョンを適用するタイミングをコントロールするということは行えません。
これを可能にするために、ライブラリ管理を使用します。 ライブラリ管理とは、コンパイルすることにより生成されたjarやwar、exeファイルなどの成果物を保存し、必要なときに取得できる仕組みです。 ライブラリ管理はインターネット上のMavenリポジトリが有名ですが、プロダクトコードの成果物はインターネット上に置けないことが殆どですので、Maven ArchaivaやArtifactoryなどのツールを使用して開発環境にライブラリ管理を立ち上げ使用しましょう。

ライブラリ管理へ成果物を登録する場合は、ライブラリ管理自体にアップロード機能が搭載されていることが殆どですが、依存しているライブラリの解決をするためのファイルを別途アップロードしないといけないなど、手動では手間がかかってしまうため、使い勝手が悪いです。 成果物のアップロードについては、ビルドツールを使用して、ビルドしたときに一緒にライブラリ管理にアップロードまでしましょう。
ビルド〜アップロードを自動化するときに役に立つのがMavenです。
Mavenはビルドの実行、依存ライブラリの自動解決などが行えます。 その他に、Mavenには周辺プラグインが豊富に存在するため、先に挙げたSonarQubeと連携したりと周辺プロダクトとの協調も計れ、非常に便利なツールです。 ただ、Mavenの使い始めからこういった機能を使い出すと挫折の元となります。 初めのうちは、「作成したプログラムをビルドするためのツール」くらいの認識で使ってみてください。

話を元に戻します。
Mavenを使用してライブラリ管理へ登録を行うことは非常に簡単で、versionタグに成果物のバージョンを記載して以下のコマンドを叩くだけです。

$ mvn deploy

コマンドは簡単なのですが、同じバージョンのものは原則再アップロードは行えないので、誤ってこのコマンドを叩かないように注意はしましょう。

ここでソフトウェアのバージョンについて少しだけ補足します。 OSSのライブラリを使用していると、ファイル名にバージョン番号が記載してあり、その後ろに"-SNAPSHOT"と書いてあったりするものがあります。これについての説明です。

  • -SNAPSHOTが付いていない
    バージョンがクロージングしていることを表します。本番環境にリリースするときは"-SNAPSHOT"を取りましょう。

  • -SNAPSHOTが付いている
    バージョンが開発中であることを表します。本番環境にリリースするためのビルドをした後は速やかにバージョン番号をインクリメントして、"-SNAPSHOT"を付けましょう。
    また、先ほど「mvn deploy」で成果物は再アップロードできないと書きましたが、この状態のバージョンは何度でもアップロードが行えます。

バージョン番号を変更しないといけない作業が発生するときだけは、開発を停止してもらいましょう。 この間に、アプリケーションのリリースブランチへのマージ、deploy、バージョン番号の変更などを行います。 Subversionを使用しているとマージが大変ですが、Gitをしっかりと運用している状態ならば、マージはスグに終わるので、開発を停止するといっても、10分程度で済みますので、開発に影響することはありません。