業務でJavaのテキスト変換ツールを作成。
プログラムよりもCIツールを使って他人の環境下で正常に稼動させるためにどうするかの調査に時間かかりましたね。
今回やりたかったことは下記の通りです。いわゆるCIの初歩です。
- ローカルでNetbeansを使って、コーディング
- 出来上がったらGitで開発サーバーにアップ&redmineと連携
- jenkinsでビルド&デプロイ
- 他のメンバーがそこからダウンロードして使う。
という流れです。
まずやりたかったことですが、以下の点がポイントです。
- 実行ファイルと設定系の情報ファイルをわけ、実行ファイルはjar形式にして固める。
- 設定系のファイルは変更する可能性があるためjarにいれず、そのままディレクトリの中においておく(jarにいれてもいいのかもしれませんが練習のため)
- デプロイされた成果物はjava -jar で実行し、同じディレクトリにある設定ファイルを指定すれば処理が無事に実行される。
これがnetbeansがない環境でもできるようにしないといけないです。(ビルド&デプロイはjenkinsが行うため。)
なのでまずやっておくこととして、下記の処理を行います。
設定系のファイルをjarにいれない
これはNetbeansで除外の設置をしておきます。
jarファイルから除外ファイルを作りたいとき
Netbeansのプロジェクトのディレクトリで
右クリック→プロパティ→ビルド→パッケージングで「JARファイルから除外」を選択。
除外パターンは下記の通りです。(それぞれのパターンはカンマ区切りで定義。)
regex.csvを除外したいとき
**/regex.csv
sampleディレクトリを除外したいとき
**/sample/
拡張子がpropertiesのファイルを除外したいとき
**/*.properties
これで設定系のファイルを除外することができます。
jenkins環境下でビルド&デプロイ
予備知識として、
Netbeansでの実行→コンパイルし、クラスファイルの起動
ビルド→Antやmavenを元にclean,compile,test,jarなどの処理
※netbeansでビルドしたときに出力を見ると何をしているかわかります。
※clean,compileなどの動作のことをターゲットといいます。
今回はAntを使いましたが、mavenでも流れは一緒だと思います。
NetbeansでビルドをしたときはAntがbuild.xmlを実行しています。
ためしに、antを直で実行すると自分でbuildできます。
netbeansの場合、AntのパスはC:\Program Files\NetBeans 8.0.2\extide\ant\bin
なので、ここに移動し、
ant -f ビルドファイル ターゲット
と入力してあげれば処理が始まります。jenkinsでも同様のことを行います。
jenkinsのプロジェクトの画面に移動し、
ビルドでAntの呼び出し、
使用するAnt:Ant
ターゲット:jar(buildなどでもよいかもしれません。)
ビルドファイル: ./build.xml
と入力してあげればビルド実行時にAntがbuild.xmlを読み込んでビルド&デプロイをしてくれます。(無事にjarファイルができます。)
※注意!
jenkinsはJavaやAnt,mavenなどを自動でインストールできます。逆に言うとjenkinsを使わずにインストールした場合、下記エラーがでます。
FATAL: Cannot find executable from the chosen Ant installation “Ant”
Error: JAVA_HOME is not defined correctly.
この場合、Jenkinsの設定画面でAntやJavaのインストールパスを設定してあげないと正常に動きません。コマンドからecho $JAVA_HOMEとかやっても普通に存在しているのにjenkinsでは動かないということがおきてしまいます。
ビルド後の処理
が、このままだと設定系のファイルがjarと同じディレクトリにありません。srcディレクトリにはあるんですがいちいち別々にダウンロードするのはもったいないため、
コピーコマンドでコピーするようにしました。
jenkinsではビルド後に任意の処理を実行することができます。(ようやく便利さがわかってきたかも・・・)
個々のプロジェクトの画面に移動し、ビルド→ビルド手順の追加→シェルの実行を選んで下記コマンドを実行。
1 2 3 4 |
cd /var/lib/jenkins/jobs/replaceTemplate/workspace/ cp -pr ./src/templatereplace/regex.csv ./dist/ cp -pr ./src/templatereplace/config.properties ./dist/ cp -pr ./src/templatereplace/sample ./dist/ |
regex.csv、config.properties、sampleというファイルとディレクトリをdist以下に移動させることが目的です。
これで一通り、ビルド&デプロイが終了しました。ほんとはテストまでやらないといけないのですが・・・また後日。
他にも他の環境で実行させるときにネックがひとつあったのでメモ
javaで実行中のファイルのディレクトリを取りたいとき
1 2 3 |
String jarPath = System.getProperty("java.class.path"); String dirPath = jarPath.substring(0, jarPath.lastIndexOf(File.separator)+1); props.load(new FileInputStream(dirPath + "hoge.properties")); |
で表示できます。意外に情報なかったんで書いときました。