Git の Tag が打たれる毎に Travis CI を使って fat-jar を GitHub Releases にリリースする
Java で書かれた CLI ツールやアプリケーションを配布する時,依存するモジュールを全部まとめて1つの jar ファイルに固めて,単独で実行可能にしておくと何かと便利です.巷ではこうした jar ファイルを fat-jar と呼ぶようです.
この fat-jar ファイルをどこにホスティングしようかと考えた時,Perl だと fatpacked なスクリプト (fat-jar のように全部の依存を1つにまとめたスクリプト) をモジュールのコンポーネントに含めてそれごと CPAN にアップロードして CPAN 経由で配布するというのが一般的だったんですが,Maven Central ではどうやらそういう方法は人気が無いようなので,今回は GitHub Releases で配布することにしました.
今回は Git の Tag が切られて push された時 (つまりリリース処理がされた時) に自動的に fat-jar をビルドして GitHub Releases にリリースしたかったので,Travis CI の deploy 機能 (まじ便利!!) を利用して実現することにしました.
以下,その為に実行した手順です.
java-mysql-diff で同様のことを行っているので,適宜参照してもらうと良いと思います.
Releases · moznion/java-mysql-diff · GitHub
1. fat-jar な jar ファイルを maven でビルドする
Maven で fat-jar を生成する為に, pom.xml を以下のように記述しました.
... <profiles> <profile> <id>fatjar</id> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>2.5.3</version> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </profile> </profiles> ...
maven-assembly-plugin を使い,
を有効にしておいて,package フェイズで走らせるようにする設定にしておくと,fat-jar を 生成する事が出来ます *1.
以下のようにコマンドを走らせると fat-jar を生成することが出来ます.-P fatjar
は profile の id です.
$ mvn -P fatjar package
参考: java - Building Maven fat jar conditionally - Stack Overflow
2. .travis.yml を編集して,tag が打たれて push される毎に GitHub Releases にリリースするようにする
手始めに travis
コマンドをインストールします.travis
コマンドは Ruby Gems で配布されているので適宜やっていきます.
travis | RubyGems.org | your community gem host
$ gem install travis
次に travis setup
コマンドを実行して,リリースに必要な .travis.yml の内容を生成します.
今回は GitHub Releases にリリースするので,travis setup releases
を実行します.
$ travis setup releases Detected repository as your/repository, is this correct? |yes| Username: foobar Password for foobar: ****************************** File to Upload: target/fat.jar Deploy only from your/repository? |yes| Encrypt API key? |yes|
コマンドを実行すると色々訊かれるので適宜答えます.デフォルト値が yes になってるところは大体 yes で良いような気がしています.
正常に完了すると,以下の様な内容が .travis.yml に追加されると思います.
deploy: provider: releases api_key: secure: <SECRET KEY> file: target/$TRAVIS_TAG.jar on: repo: your/repository
これに色々足していきます.
deploy: provider: releases api_key: secure: <SECRET KEY> file: target/$TRAVIS_TAG.jar skip_cleanup: true on: repo: your/repository all_branches: true tags: true
all_branches
と tags
が有効になってないと,tag を切った時にリリースというのが上手く動かなかったので追記しておきます.skip_cleanup: true
はまあ適当にという感じ.
あとは .travis.yml に before_deploy
のフェイズでデプロイ対象となる fat-jar (今回の場合は file: target/$TRAVIS_TAG.jar
) を生成してやる設定を追記します.
before_deploy: - mvn -P fatjar clean package -DskipTests=true -Dproject.finalName=$TRAVIS_TAG
環境変数 $TRAVIS_TAG
には git の tag 名が入っているので,それを上手いこと使ってやると mvn release:prepare
のようなコマンドでリリース処理を行う時に,自動的に切られる tag 名と噛み合って便利だったりします.まあここらへんはお好みでという感じです.