« LeopardでJava6を標準のJavaにする | メイン | Jyazo 0.0.6 プロキシとマルチポストに対応したGyazoクローン »

MavenとGitHubの連携

Mavenはプロジェクトのバージョンを「x.x.x-SNAPSHOT」のように管理するのが標準のようだ。
「SNAPSHOT」は開発中を示す。
Mavenで管理しているJyazoのプロジェクトのソースをGitHubで管理しようとすると、リリース時に次のようなオペレーションになってしまう。
pom.xml内に書かれているプロジェクトのバージョンから「-SNAPSHOT」を削除
git commit -aを実行
git tagを実行
git push origin masterを実行
pom.xml内のプロジェクトのバージョンを挙げて「-SNAPSHOT」を追加
git commit -aを実行
git push origin masterを実行
面倒くさい。
なんとかならないものかと調べていると、Twitterで以下のような情報を頂いた。
@kanasan 使ったことは無いんですが maven-release-plugin で何とかできるそうです。 [たいぷぴぃ]
そこでmaven-release-pluginを調べてみた。
まず、1.「リリースタグを付ける」などのリリース前準備を行うため、次のコマンドを実行します。

C:\work\6\webdb-webapp_1_0_x> mvn release:prepare

リリースバージョン名などを聞かれますので、デフォルトのままでよければEnterキーを押します。このコマンドでは、次のような作業が行われました。

   1. コミットしていないソースコードがないかチェック
   2. SNAPSHOTバージョンのライブラリに依存していないかチェック
   3. pom.xmlのバージョン設定「1.0.0-SNAPSHOT」を「1.0.0」に変更
   4. ビルド
   5. 変更したpom.xmlをバージョン管理(Subversion)にコミット
   6. バージョン管理へのリリースタグ付け(webdbwebpp-1.0.0)
   7. pom.xmlのバージョン設定を、次の開発バージョン「1.0.1-SNAPSHOT」に変更
   8. 変更したpom.xmlをバージョン管理(Subversion)にコミット
なるほど。これは良い。
しかし、Subversionとの連携については色々見つかったが、gitやGitHubとの連携については探しきれなかった。
検索範囲を日本語以外に広げて探していたら次のようなページが見つかった。
長文で最初は怖じ気づいたが、良く見ると書いていることはそんなに難しい内容ではないようだ。
gitのインストールやGitHubのアカウント取得方法とSSHのキーの登録、Mavenのインストールやpom.xmlの作成やGitHubでのレポジトリの作成等、非常に丁寧に細かく書いている様子。
で、Step 9.にMavenとGitHubを連携するための設定と思しき記述を発見。
これをもとに、手元のプロジェクトのpom.xmlに以下の設定を追記した。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<!--略-->
  <scm>
    <connection>scm:git:git@github.com:Kanasansoft/Jyazo.git</connection>
    <url>scm:git:git@github.com:Kanasansoft/Jyazo.git</url>
    <developerConnection>scm:git:git@github.com:Kanasansoft/Jyazo.git</developerConnection> 
  </scm>
<!--略-->
  <build>
<!--略-->
    <plugins>
<!--略-->
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-release-plugin</artifactId>
        <version>2.0-beta-9</version>
      </plugin>
<!--略-->
    </plugins>
<!--略-->
  </build>
<!--略-->
</project>
前のエントリーの通り、Eclipse上で実行する方法がわからなかったので、プロジェクト配下(同時にgit管理かでもある)で、以下のコマンドを実行した。
% mvn release:prepare
[INFO] Scanning for projects...
(略)
そうすると、途中で次のように聞かれる。
What is the release version for "Jyazo"? (com.kanasansoft.Jyazo:Jyazo) 0.0.3: : 
What is SCM release tag or label for "Jyazo"? (com.kanasansoft.Jyazo:Jyazo) Jyazo-0.0.3: : 
What is the new development version for "Jyazo"? (com.kanasansoft.Jyazo:Jyazo) 0.0.4-SNAPSHOT: : 
つまり、(1)「今からコミットするプロジェクトのバージョンの指定」、(2)「コミットにつけるタグの名前」、(3)「コミットした後にプロジェクトにつけるのバージョンの指定」。
ここまでのバージョンは「0.0.3-SNAPSHOT」だったため、(1)には「0.0.3」を指定した。
入力しなくても既定と同じだったのでそのままEnter。
(2)は余り考えずにそのまま既定値。
(3)も勝手にバージョンを挙げて「-SNAPSHOT」をつけたものが既定だったためそのまま。
たったこれだけで、最初に「面倒くさい。」と言っていた作業を全部やってくれた。
ちょっと感動して興奮した。
maven-release-pluginが直接GitHubにpushしに行っているようなので、一人で開発していたとしてもローカルリポジトリのソースは古くなっている点に注意。
後は、「Jyazo-0.0.3」タグのついているやつをpullしてパッケージ化してGitHubのDownloadのところにアップするも良し、「0.0.4-SNAPSHOT」をpullして開発を続けるも良し。
pullの仕方を忘れたので、銀のgit本見てくる。
関連するエントリー
2009/11/22 追記
考えてみたら、ローカルリポジトリと同期すればローカルは常に最新状態かも...。
でも、ローカルでつけられたタグはGitHubとどうやって同期するのかわからない...。
2009/11/22 追記2
「mvn release:prepare」を実行した後は「mvn release:perform」を実行して、パッケージ化したファイルを公開サーバに転送するらしい。
ところがJyazoは公開サーバを持っておらず、GitHub上でやりくりしようと思っていたので、pom.xmlには「distributionManagement」が存在しない。
このような場合、「mvn release:perform」は実行途中でエラーとなる。
「mvn release:perform」が正常に行なわれなかった場合、次の「mvn release:prepare」は何もしてくれない。
メッセージには「Release preparation already completed. You can now continue with release:perform, or start again using the -Dresume=false flag」と書かれていた。
「release:perform」を実行するか「-Dresume=false flag」をつけて実行し直すからしい。
そこで、「mvn release:prepare -Dresume=false」と実行してみたところ、GitHubと連携した。
(ローカルにも「SNAPSHOTのないバージョンのパッケージ」が生成されている。)
これは気付かないとちょっとはまりそうだ。

トラックバック

このエントリーのトラックバックURL:
http://www.kanasansoft.com/cgi/mt/mt-tb.cgi/266

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

Google

タグ クラウド