自分の速さで

調べたこと、忘れそうなことをゆるゆると書いていく

【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に、ドロップダウンリストの候補を改行区切りで指定します。

これでドロップダウンリストの候補からパラメータを選択してもらえるようになりました!

f:id:cpp_0302:20180223105714p:plainf:id:cpp_0302:20180223105719p:plain
パラメータ選択画面

終わりに

シェルの実行結果を変数に保存したかったのですが、そもそも「シェルを実行した際の標準出力の内容を変数に格納する」かどうかを引数で指定(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の以下のページがヒット。

stackoverflow.com

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に載っていたので早速やってみます。

stackoverflow.com

呼び出し先のジョブが文字列のパラメータを指定している場合、下記でOKです。

build job: '呼び出し先のジョブ名', parameters: [
    [$class: 'StringParameterValue', name: 'パラメータ名', value: 'パラメータ値']
]

文字列以外のパラメータを指定

例えば、このようなパラメータを設定しているジョブがあったとします。

f:id:cpp_0302:20171129121103p:plain

この場合、下記で呼び出し可能となります。

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を見る限り、これらの他にパスワードやファイルなどを指定する別のパラメータもあるようですので、必要な方は参照してみてください。

ParameterValue (Jenkins core 2.76 API)

static イニシャライザを握りつぶす

はじめに

JUnitでテストコードを書くにあたって、JMockitを使用して適宜モック化してテストを実施していました。 staticイニシャライザにテストとは関係ないコードがあったので実行しないようにモック化したかったのですが、JMockitによるモック化はできなそうだったのでJavassistを使用して解決することにしました。

解決方法

CtClassからstaticイニシャライザオブジェクトを取得できるので、setBodyメソッドを実行してメソッドの中身を書き換えればOK

Javassistそのものの説明は省きます

Hoge.java

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でシェルを実行する方針で作成を進めていました。

マージする前に不要なファイルのゴミ掃除をしたかったので、下記を参考にバージョン管理外のファイルを削除しようと思ったのですが、うまく行かなかったのでその原因と解決策をメモ。

kakakakakku.hatenablog.com

エラー内容

テストとして、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は使えないとのこと。
ということで現在のプロジェクトのバージョンをチェック

pom.xml

f:id:cpp_0302:20160308141037p:plain

Springのバージョンは3.1.1.RELEASEでした。
そもそも何でこんな古いバージョンでプロジェクトを作ってたんだ。。。

修正内容

ということで、Springのバージョンを4以降にバージョンアップします。

pom.xml

f:id:cpp_0302:20160308143550p:plain

これでうまくいきました。

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"

これで動きました。