概要

Jenkinsに関するメモを記述しています。

トラブル

PipelineでStackOverflowError

  • 06/01にPipelineプラグイン(もしくはGitHubプラグイン)を最新に更新すると、StackOverflowErrorが発生するようになった?
  • 調査中
  • 旧プロジェクトは問題なく実行できる
Started by user TERAI Atsuhiro
 > git rev-parse --is-inside-work-tree # timeout=10
Setting origin to https://github.com/aterai/java-swing-tips
 > git config remote.origin.url https://github.com/aterai/java-swing-tips # timeout=10
Fetching origin...
Fetching upstream changes from origin
 > git --version # timeout=10
 > git fetch --tags --progress origin +refs/heads/*:refs/remotes/origin/*
Seen branch in repository origin/master
Seen 1 remote branch
Obtained Jenkinsfile from ...
[Pipeline] End of Pipeline
java.lang.StackOverflowError
	at java.io.UnixFileSystem.getBooleanAttributes0(Native Method)
	at java.io.UnixFileSystem.getBooleanAttributes(UnixFileSystem.java:242)
	at java.io.File.exists(File.java:819)
	at sun.misc.URLClassPath$FileLoader.getResource(URLClassPath.java:1282)
	at sun.misc.URLClassPath$FileLoader.findResource(URLClassPath.java:1249)
	at sun.misc.URLClassPath.findResource(URLClassPath.java:215)
	at java.net.URLClassLoader$2.run(URLClassLoader.java:569)
	at java.net.URLClassLoader$2.run(URLClassLoader.java:567)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findResource(URLClassLoader.java:566)
	at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:546)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Class.java:348)
	at com.sun.beans.finder.ClassFinder.findClass(ClassFinder.java:103)
	at com.sun.beans.finder.InstanceFinder.instantiate(InstanceFinder.java:93)
	at com.sun.beans.finder.InstanceFinder.find(InstanceFinder.java:66)
	at java.beans.Introspector.findExplicitBeanInfo(Introspector.java:448)
	at java.beans.Introspector.<init>(Introspector.java:398)
	at java.beans.Introspector.getBeanInfo(Introspector.java:173)
	at groovy.lang.MetaClassImpl$15.run(MetaClassImpl.java:3313)
	at java.security.AccessController.doPrivileged(Native Method)
	at groovy.lang.MetaClassImpl.addProperties(MetaClassImpl.java:3311)
	at groovy.lang.MetaClassImpl.initialize(MetaClassImpl.java:3288)
	at org.codehaus.groovy.reflection.ClassInfo.getMetaClassUnderLock(ClassInfo.java:260)
	at org.codehaus.groovy.reflection.ClassInfo.getMetaClass(ClassInfo.java:302)
	at org.codehaus.groovy.reflection.ClassInfo.getMetaClass(ClassInfo.java:312)
	at org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl.getMetaClass(MetaClassRegistryImpl.java:265)
	at org.codehaus.groovy.runtime.InvokerHelper.getMetaClass(InvokerHelper.java:879)
	at org.codehaus.groovy.runtime.callsite.CallSiteArray.createPojoSite(CallSiteArray.java:125)
	at org.codehaus.groovy.runtime.callsite.CallSiteArray.createCallSite(CallSiteArray.java:166)
	at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
	at org.codehaus.groovy.runtime.callsite.PojoMetaClassSite.call(PojoMetaClassSite.java:52)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
	at com.cloudbees.groovy.cps.CpsTransformer.visit(CpsTransformer.groovy:279)
...

インストール後ジョブがなければ再起動が無効

  • 最近のWeekly版(2.5x頃?)は、「インストール完了後、ジョブがなければJenkinsを再起動する」でジョブが実行中でも再起動されてしまい、ビルドが失敗する?
  • 「ビルドを並列実行」を「しない」にしているビルドを複数を実行すると、後から実行したビルドがビルドキューに入らず、並列実行されてしまう
    • 「システムの設定」で「同時ビルド数」を1にすれば、並列実行されなくなる
    • Jenkins Security Advisory 2017-04-26
      • SECURITY-412: Restart Jenkins immediately, after all builds are finished, or after all plugin installations and builds are finished
    • ジョブがエラーにはならなくなったが、実行中のジョブの終了は待たずにキャンセル扱いになる?
  • 同じく「ビルドを並列実行」しないに設定しても並列実行されてしまうようになった?

1.597でフォルダ構成が変更

  • Jenkins1.597にアップグレードしたら表示がおかしくなる
    • 1.597で、JENKINS_HOME以下のフォルダ構成が変更になった
    • Exceptionをみると、Disk usage pluginがフォルダ文字列をパースできずにエラーを出している
    • Important: Upgrading to Jenkins 1.597
    • 修正はまだスナップショットなので、当面Disk usage pluginを削除しておくことで対応

Jenkinsの自動更新に失敗

リポジトリブラウザの設定が保存されない

Jenkinsの設定

  • ホームディレクトリ(Windows環境)
    • デフォルトの~/.jenkinsに実行ファイルやビルド結果を一緒に保存すると、バックアップなどが面倒
    • C:\Program Files (x86)\Jenkins\jenkins.exejenkins.warをインストールするとjenkins.xmlなどが編集しづらいので、C:\Jenkins_JAR以下にインストールする
    • C:\Jenkins_JAR\jenkins.xmlを以下のように変更し、プラグインやビルドをC:\jenkinsに変更する
      • <env name="JENKINS_HOME" value="C:\jenkins"/>
    • システム環境変数JAVA_HOMEで指定したバージョンのJavaJenkinsが使用するようにC:\Jenkins_JAR\jenkins.xmlを変更
      • <executable>%JAVA_HOME%\bin\java</executable>
  • 高度な設定(Jenkinsの管理、システムの設定にあるボタンをクリック)
    • ワークスペース・ルートディレクトリ: C:/Edian/${ITEM_FULLNAME}
    • ビルド・ルートディレクトリ: ${ITEM_ROOTDIR}/builds

Jenkinsfile

pipeline {
    agent any
    stages {
        stage('Checkout') {
            steps {
                git url: 'https://github.com/aterai/java-swing-tips.git'
            }
        }
        stage('PMD') {
            steps {
                sh "~/.sdkman/candidates/ant/current/bin/ant -file all.xml pmd"
                step([$class: 'PmdPublisher', pattern: '**/pmd.xml'])
            }
        }
        stage('CheckStyle') {
            steps {
                sh "~/.sdkman/candidates/ant/current/bin/ant -file all.xml checkstyle"
                step([$class: 'CheckStylePublisher', pattern: '**/checkstyle-result.xml'])
            }
        }
    }
}

プラグイン

GIT plugin

  • Git cliant plugin も一緒にインストールされる
    • ログのエンコーディングが変更できない
      • ログの文字コードをShift_JISにカスタマイズする
      • 2.3.5付近で修正された?ようなので、変更は不要になった

Warnings Plug-in

ソースコード管理

  • git
       [i18n]
       	filesEncoding = Shift_JIS
       	#不要: logoutputencoding = Shift_JIS #UTF-8
   - または、Jenkinsのサービスを起動するユーザになって、以下を実行
       > git config --global i18n.filesEncoding Shift_JIS
   - ~~Git plugin は、別ブランチでShift_JIS版を作成し、mvn コマンドでビルドしている(注: テストはスキップ、現状JDK 1.8.0 ではエラーになる!)~~
       ~~> mvn -Dmaven.test.skip=true~~

### ビルド・トリガ

  • ~定期的に実行~

       - ~~(例えば月-金の8-9時に一回ビルド): H H(8-9) * * 1-5~~
       - ~~「定期的に実行」するのは master版とdevelop版で、release版は中止~~
       - 「ビルド回数が無駄に増加するので辞めたら」と提案があったので中止、以下の「SCMをポーリング」する方法に変更
  • SCMをポーリング
       - (例えば月-金の8-9時に一回 gitリポジトリをチェックし、更新があればビルド): H H(8-9) * * 1-5
       - 「SCMをポーリング」して、ビルドするのは master版と develop版
       - release版は手動ビルドのみ

### ビルド後の処理

  • コンパイラの警告の集計
       -  ログの集計: MSBuild
           - ~~Warning pluginが標準出力をUTF-8固定で読み込んでいるので、文字化けする~~
           - ~~`java "-Dfile.encoding=Shift_JIS" "-Dsun.jnu.encoding=Shift_JIS" -jar jenkins.war` などで指定しても無駄...~~ このオプションを指定することで文字化けしなくなった。よって以下は不要。
           - cl.exe が標準出力に出す文字コードを変換する方法は存在しない?
           - 仕方がないので、以下のようにWarning pluginを修正して差し替える
               - `mvn install -Dmaven.test.skip=true`
               - 上記で`warnings.hpi`を生成して、プラグインの管理、高度な設定、プラグインのアップロードでインストール
               - `-Dmaven.test.skip=true`オプションを付けて、テストをスキップしないと時間が掛かる(テスト用jarのダウンロード時間、テスト環境設定不備でhpiの生成に失敗など)
          public class WarningsPublisher extends HealthAwareRecorder {
              private static final String CONSOLE_LOG_ENCODING = "MS932"; //"UTF-8";
  • 静的解析結果を集計

コメント