skillup

技術ブログ

Java プログラミング全般

CIことはじめ

投稿日:

業務でJavaのテキスト変換ツールを作成。

プログラムよりもCIツールを使って他人の環境下で正常に稼動させるためにどうするかの調査に時間かかりましたね。

今回やりたかったことは下記の通りです。いわゆるCIの初歩です。

  1. ローカルでNetbeansを使って、コーディング
  2. 出来上がったらGitで開発サーバーにアップ&redmineと連携
  3. jenkinsでビルド&デプロイ
  4. 他のメンバーがそこからダウンロードして使う。

という流れです。

まずやりたかったことですが、以下の点がポイントです。

  • 実行ファイルと設定系の情報ファイルをわけ、実行ファイルは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ではビルド後に任意の処理を実行することができます。(ようやく便利さがわかってきたかも・・・)

個々のプロジェクトの画面に移動し、ビルド→ビルド手順の追加→シェルの実行を選んで下記コマンドを実行。

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で実行中のファイルのディレクトリを取りたいとき

String jarPath = System.getProperty(“java.class.path”);
String dirPath = jarPath.substring(0, jarPath.lastIndexOf(File.separator)+1);
props.load(new FileInputStream(dirPath + “hoge.properties”));

で表示できます。意外に情報なかったんで書いときました。

 

-Java, プログラミング全般
-

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

リファクタリング

業務で大幅なリファクタリングをする機会があり、その際の注意だったり、気をつけるべきことなどをまとめておきます。 自分用なので自分にしかわからない言葉で書いてある可能性が大きいです。 気になる方は問い合 …

no image

BeanValidationの動的メッセージ出力について

JSF+ManagedBeanでは基本的にbeanValidationを使ってバリデーションを行い、エラーメッセージなどはプロパティファイルで管理するのが一般的です。 アノテーションなどを付与してあげ …

no image

フィールド以外のプロパティをエンティティに持たせる

JPAでは基本的に1テーブル、1クラスです。 このためプロパティは必然的にテーブルのフィールドに対応しています。 ただ、必ずしもプロパティだけでなく、臨時で持たせておきたい、プロパティがあったりします …

no image

Optionalについて その2

JavaEEブログなはずなのに11月はcakeのことばかり書いていて、Javaのことすら書いていないですね(汗) 今日はOptionalについて書きます。 いまいち使い方がわからなかったんですが、自分 …

no image

オブジェクト指向 アプリケーション間連携(主にWebAPI)

本日も引き続き「現場で役立つシステム設計の原則」を読み進めてます。 本日はプレゼンテーション層、いわゆるMVCのViewにあたる部分。 Contents1 アプリケーション間連携(主にWEBAPIに関 …