【Jenkins】パイプラインで、ドロップダウンリストでユーザからのパラメータ入力を受け付ける
はじめに
Jenkinsのパイプラインで、Linux上のどのフォルダを対象にジョブを動かすかをユーザに選択してもらいたかったので、ドロップダウンリストの出し方を調べてメモ。
内容
node('master') { stage('select directory path') { # ディレクトリ一覧を取得 def directoryPathList = sh( script: 'find /aaa/bbb/ccc/* -maxdepth 0 -type d' ,returnStdout: true ) def userInput = input( id: 'userInput', message: 'フォルダを選択して下さい', parameters: [ [$class: 'ChoiceParameterDefinition', name: 'directoryPath', choices: directoryPathList, description: 'a description.'] ]) echo "リカバリ対象:${userInput}" } }
↑のように、ChoiceParameterDefinitionを定義すればドロップダウンリストが出てきます。
choices
に、ドロップダウンリストの候補を改行区切りで指定します。
これでドロップダウンリストの候補からパラメータを選択してもらえるようになりました!
終わりに
シェルの実行結果を変数に保存したかったのですが、そもそも「シェルを実行した際の標準出力の内容を変数に格納する」かどうかを引数で指定(returnStdout)できたようです。
Pipeline: Nodes and Processes
ドロップダウンリストの定義は、ChoiceParameterDefinitionクラスのコンストラクタを指定しています。 ChoiceParameterDefinition (Jenkins core 2.107 API)
なので、同じようにコンストラクタを指定すればPasswordParameterDefinitionなどの他のDefinitionクラスも対応可能だと思います。
tomcatのみJavaのバージョンを変更する
はじめに
Jenkinsのバージョンを最近あげていなかったのであげようと思ったのですが、どうやら最新バージョンはJava1.8が必須のようです。
ただ、他のアプリケーションの兼ね合いでデフォルトのJavaバージョンは1.7のままにしておきたかったので、tomcatのみJavaバージョンを1.8にすることにしました。その時に調べた内容をメモ。
tomcatのバージョン確認
まず、tomcatを動かしているJavaのバージョンを以下のコマンドで確認します。(インストールディレクトリ/usr/local/tomcat
は適宜読み替えて下さい)
# /usr/local/tomcat/bin/version.sh
… 省略
JVM Version: 1.7.0_05-b05
… 省略
tomcatがJava1.7で動いていることを確認しました。
解決方法
調べてみた所、Starck Overflowの以下のページがヒット。
Starck Overflowの通り、catalina.shにJAVA_HOMEの設定を追加します
catalina.sh
# Java1.8がインストールされているディレクトリを指定 JAVA_HOME="/usr/java/jdk1.8.0_131" JRE_HOME="${JAVA_HOME}/jre"
この状態でtomcatを再起動し、再度バージョンを調べてみます。
# /usr/local/tomcat/bin/version.sh
… 省略
JVM Version: 1.8.0_131-b11
… 省略
うまくいきました!
【Jenkins】パイプラインからジョブを呼び出す際、パラメータを指定する
はじめに
Jenkinsの複数ジョブをまとめて実行する必要があったのでパイプラインを使用することにしたのですが、ジョブのパラメータを指定する方法を調べたのでメモ。
文字列パラメータを指定
調べてみたらstackoverflowに載っていたので早速やってみます。
呼び出し先のジョブが文字列のパラメータを指定している場合、下記でOKです。
build job: '呼び出し先のジョブ名', parameters: [ [$class: 'StringParameterValue', name: 'パラメータ名', value: 'パラメータ値'] ]
文字列以外のパラメータを指定
例えば、このようなパラメータを設定しているジョブがあったとします。
この場合、下記で呼び出し可能となります。
build job: 'pipeline-test-child', parameters: [ [$class: 'TextParameterValue', name: 'PARAMETER_TEXT', value: 'test text'] ,[$class: 'StringParameterValue', name: 'PARAMETER_STRING', value: 'test string'] ,[$class: 'BooleanParameterValue', name: 'PARAMETER_BOOLEAN', value: true] ,[$class: 'StringParameterValue', name: 'PARAMETER_SELECT', value: 'test select'] ]
最後に
JenkinsのJavaDocを見る限り、これらの他にパスワードやファイルなどを指定する別のパラメータもあるようですので、必要な方は参照してみてください。
static イニシャライザを握りつぶす
はじめに
JUnitでテストコードを書くにあたって、JMockitを使用して適宜モック化してテストを実施していました。 staticイニシャライザにテストとは関係ないコードがあったので実行しないようにモック化したかったのですが、JMockitによるモック化はできなそうだったのでJavassistを使用して解決することにしました。
解決方法
CtClassからstaticイニシャライザオブジェクトを取得できるので、setBodyメソッドを実行してメソッドの中身を書き換えればOK
※Javassistそのものの説明は省きます
package cpp0302.test; /** モック化対象のクラス */ public class Hoge { private static int count; static { // 検証用に無理やり例外を発生させる count = 1 / 0; } public static void printCount() { System.out.println("count: " + count); } }
CrushStaticInitializer.java
package cpp0302.test; import javassist.ClassPool; import javassist.CtClass; import javassist.CtConstructor; public class CrushStaticInitializer { public static void main(String[] args) throws Exception { ClassPool cp = ClassPool.getDefault(); cp.appendSystemPath(); CtClass hogeClass = cp.get("cpp0302.test.crush.Hoge"); CtConstructor classInitializer = hogeClass.getClassInitializer(); // staticイニシャライザの内容を変更 classInitializer.setBody("{ count = 78; System.out.println(\"staticイニシャライザを握りつぶした\"); }"); hogeClass.toClass(); // クラスメソッド実行前にstaticイニシャライザが実行される Hoge.printCount(); } }
実行結果
staticイニシャライザを握りつぶした count: 78
これでテストコード実行に関係ない処理を握りつぶすことができました
Git Bash で svn status を実行すると日本語のファイル名が文字化けする & 対処法
はじめに
Windows環境でSubversionでマージを自動で実行する仕組みを作りたかったのですが、今回はGit Bashでシェルを実行する方針で作成を進めていました。
マージする前に不要なファイルのゴミ掃除をしたかったので、下記を参考にバージョン管理外のファイルを削除しようと思ったのですが、うまく行かなかったのでその原因と解決策をメモ。
エラー内容
テストとして、Subversion管理外のファイルを下記のフォルダ構成で配置しています。
current directory/ ├src/ │ └ abc.txt ├ test.txt ├ 新しいテキスト ドキュメント (2).txt └ 新しいテキスト ドキュメント.txt
なので、以下のコマンドを実行した場合
$ svn status | grep ^? ? src\abc.txt ? test.txt ? 新しいテキスト ドキュメント (2).txt ? 新しいテキスト ドキュメント.txt
上記の結果であれば、cutで9文字目を切り出しxargsで対象を全て削除することができるのですが…
実際は下記の内容が出力されました
$ svn status ? src\abc.txt ? test.txt ? ▒V▒▒▒▒▒e▒L▒X▒g ▒h▒L▒▒▒▒▒▒▒g (2).txt ? ▒V▒▒▒▒▒e▒L▒X▒g ▒h▒L▒▒▒▒▒▒▒g.txt
解決策
Subversionの出力が明らかに文字化けしているので、文字コードをShift-JISからUTF-8に変換してみました。
$ svn status | iconv -f Shift-JIS -t UTF-8 | grep ^? ? src\abc.txt ? test.txt ? 新しいテキスト ドキュメント (2).txt ? 新しいテキスト ドキュメント.txt
これで想定通り検出できました。
そもそもSubversionの出力の文字コードをUTF-8に変更できたらこんなことはする必要ありませんね。(変更できるかどうかは調べていません。。)
おわりに
Git bash 上でバージョン管理外のファイルを削除するコマンドは、最終的に以下のようになってます。
svn status | sed -e 's@\\@/@g' | iconv -f Shift-JIS -t UTF-8 | grep ^? | cut -c9- | xargs -I{} rm -rf "{}"
理由は以下のとおりです。
- Git Bashなので、フォルダ区切り文字を \ から / に変える必要がある
- ファイル名にスペースが入っている場合うまく消せないので、rm するときはダブルクォーテーションで囲む必要あり
【Spring】Streamを使用したらArrayIndexOutOfBoundsException
はじめに
新規プロジェクトのJavaのバージョンは1.8というとだったので、早速Streamを使おうと思ったら java.lang.ArrayIndexOutOfBoundsException が発生したので修正内容をメモ。
エラー内容
原因
いろいろ探した結果下記がヒット
spring - ArrayOutOfBoundsException on Bean creation while using Java 8 constructs - Stack Overflow
Springのバージョンが3以下だとStreamは使えないとのこと。
ということで現在のプロジェクトのバージョンをチェック
Mac OS X 10.11 環境下でiReportを動かす
はじめに
会社でJasparReportsを使うことになったのでデザイナであるiReportをインストールしたところ、いくらアイコンをダブルクリックしてもアプリが起動しなかったので起動するまでの設定をメモ。
手順
Java6をインストール
iReportを動かすためにはJava6が必要らしいので、Java6をインストールします。
Mac版のJava6はAppleから提供されているので、以下からインストール
ダウンロード - Java for OS X 2015-001
ireport.confを編集
iReportの設定ファイルにjdkhomeを設定する箇所があるので、インストールしたJava6を指定します。
iReportのアプリ配下にある
Contents/Resources/ireport/etc/ireport.conf
を開いてjdkhomeの設定値を書き換えます
jdkhome="/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home"
これで動きました。