ひよっこ。

I want to…

Posts Tagged ‘Hudson’

HudsonをバージョンUPしたらNoClassDefFoundError

Posted by hikaruworld : 2010 1月 19

Hudsonさんには毎日お世話になっています。
そんなHudsonさんを最近VersionUpしていなかったので、
今回ver1.323からver1.341にバージョンUPしました。

私の家では彼(プロジェクトによっては彼女ですが)はTomcat上で動いていて、バージョンは6.0.18になります。
再起動後、以下のようなエラーになりました。

SEVERE: Failed to initialize Hudson
java.lang.NoClassDefFoundError: hudson/Main (wrong name: Main)
at java.lang.ClassLoader.defineClass1(Native Method)
…以下略

とりあえずググって見ると以下のURLを発見。
http://n4.nabble.com/Error-deploying-1-324-to-tomcat-td361411.html
同様の件のようなのでスレッドを追っていると、川口氏のこんなコメントが。
http://n4.nabble.com/Error-deploying-1-324-to-tomcat-tp361411p361415.html

Can you go to $TOMCAT_HOME/webapps/hudson/WEB-INF/lib and run

javap -classpath hudson-core-*.jar hudson.Main

… to make sure you see “public class hudson.Main extends
java.lang.Object” ?

ふむふむ、実行クラスを逆アセンブラしてMainメソッドがあるか確認してみろと。
これに従って実行してみる。
以下ログ。

Compiled from "Main.java"
public class hudson.Main extends java.lang.Object{
    public static boolean isUnitTest;
    public hudson.Main();
    public static void main(java.lang.String[]);
    public static int run(java.lang.String[])       throws java.lang.Exception;
    public static int remotePost(java.lang.String[])       throws java.lang.Exception;
    static {};
}

ちゃんとMainが存在しているようです。
改めて、Tomcatを再起動。

問題なくアクセスできてしまいました。
うーん、原因が謎。。。

ところで、Hudsonのバージョンをver1.341にバージョンアップすると

Get Support Subscription
Commercial support subscription available from Sun Microsystems.

というものが表示されていました。

いつの間にさサポート契約まで出来ていたとは。。。
結構なお値段ですが、企業とかであるとその価値は十分ありそうな気がします。

Subscription Level Master # of additional slaves

Price
Basic 1 1 $999/yr
Silver 1 10 $2999/yr
Gold 1 25 $5999/yr
広告

Posted in program | タグ: , , | Leave a Comment »

FlexのCI用のビルド環境を構築する。

Posted by hikaruworld : 2009 9月 20

先日FlexPMDが出たと話題になっていましたが、
これ幸いと思い、Hudsonと一緒にCI環境を構築する事にしました。

# 今回のエントリはメモ的要素が非常に大きいです。
# 会社に持っていってそのまま使いたかったので…

具体的には、基本的な項目のみで以下のように行っています。

  • コンパイル
  • ASDocの出力
  • FlexPMDの実行

なお、今回とりあえず放置したことも多々あります。

  • パブリッシュ(.air化)
  • 自動テストの実行(FlexMonkey & Flexcover & FlexUnit4)

以下は実際の手順になりますが、
今回試したのはAir環境なので必要に応じてFlexと読み替えてください(aasdocがasdocとか)。
また、基本的な方針として出来る限り1プロジェクト内にすべてのbuildファイルを含める方針でいきたいと思います。
ディレクトリ構成は以下の通り。

.
|-- report											APPLICATION_ROOT
    |-- AIR_readme.txt								FlashDevelopにより生成されたファイル
    |-- CreateCertificate.bat						FlashDevelopにより生成されたファイル(証明書付与用)
    |-- Report.as3proj								FlashDevelopにより生成されたファイル(FD用の設定ファイル)
    |-- PackageApplication.bat						FlashDevelopにより生成されたファイル(パッケージ化用)
    |-- SelfSigned.pfx								証明書ファイル
    |-- air											PackageApplication.batにより生成されるリリース用ディレクトリ
    |   `-- Report.air								パッッケージ化されたAirファイル
    |-- bin											swfファイルの保存場所(Antにより生成)
    |   `-- Report.swf								コンパイルされたswfファイル
    |-- bin-debug									デバック用ディレクトリ(FlexBuilder及びFlashDevelopにより生成)
    |-- build										hudson用の各種ビルドファイル
    |   |-- build-doc.xml							ASDocビルド用
    |   |-- build-pmd.xml							FlexPMD実行用
    |   |-- build.xml								コンパイル用
    |   |-- ruleset.xml								FlexPMD用のルールセット(今回は利用しない)
    |   `-- output									ビルドファイルの実行結果格納先
    |       |-- AppDocs								build-doc.xmlによって書き出されたASDoc
    |       `-- pmd.xml								FlexPMDの出力結果
    |-- libs
    |   `-- ext
    |       |-- flexpmd								FlexPMDで利用されるライブラリ。
    |       |   |-- LICENSE.txt
    |       |   |-- ant-1.7.0.jar
    |       |   |-- as3-parser-1.0.RC3.jar
    |       |   |-- as3-parser-api-1.0.RC3.jar
    |       |   |-- as3-plugin-utils-1.0.RC3.jar
    |       |   |-- commons-lang-2.4.jar
    |       |   |-- flex-pmd-ant-task-1.0.RC3.jar
    |       |   |-- flex-pmd-core-1.0.RC3.jar
    |       |   |-- flex-pmd-files-1.0.RC3.jar
    |       |   |-- flex-pmd-ruleset-1.0.RC3.jar
    |       |   |-- flex-pmd-ruleset-api-1.0.RC3.jar
    |       |   |-- plexus-utils-1.0.2.jar
    |       |   `-- pmd-4.2.2.jar
    |       `-- flexunit4							FlexUnit4関連のライブラリ(今回は利用しない)
    |-- obj											FlashDevelopにより生成される
    |-- src											ソースディレクトリ
    |   |-- Report-app.xml						設定ファイル
    |   |-- Report.mxml							メインクラス
    |   `-- com
    |       `-- wordpress
    |           `-- prepro
    `-- test										テストディレクトリ
        |-- com
            `-- wordpress
                `-- prepro
OS CentOS5.3 VMWareの仮想アピアランスを利用
SCM Subversion1.4.2 yumにてインストール
CI hudson1.3.23 ViolationsPluginをインストール済み。
Ant 1.7 Hudson上の自動インストールを用いてインストール
FlexSDK 3.3.0.4852 /usr/local/flexはシンボリックリンクで定義しており、実体は/usr/local/flex3.3/

0. Subversion & Hudson & Ant & FlexSDKのインストール

省略。SubversionとHudsonは同一PC上にあるものとします。
SubversionはApache上で動かし、Hudsonはとりあえずjava -jar hudson.warで起動します。
また、Antに関しても、Hudsonの自動インストールを利用するものとします。

なお、FlexSDKに関しては/usr/local/flex以下にFlex3.3系の最新版を/usr/local/flexにインストールします。

1. コンパイル

FlexSDK3.3系ではFlexAntは既にSDkに内部に含まれていますのでFlexSDKをインストールしていれば不要です。
mxmlcをもちいてswfファイルを出力しているのは、後にFlexcoverやFlexmonkeyで読み込ませてテストを行う場合に必要になることを考えての事です(今回は意味ない..)。

<?xml version="1.0" encoding="UTF-8"?>
<project name="flexAnt" default="main" basedir="./">
	<description>
		FlexAntを用いてAirのコンパイルを行います
	</description>

	<!-- Hudsonの提供する環境変数を設定(実際にはこのbuild.xmlでは使われない) -->
	<property environment="env" />

	<!-- 各種プロパティ定義 -->
	<!-- FlexSDKのホーム -->
	<property name="FLEX_HOME" value="/usr/local/flex"/>
	<!-- アプリケーションのルート -->
	<property name="APP_ROOT" value="../"/>

	<!-- flex用Antタスクを読み込む -->
	<taskdef resource="flexTasks.tasks" classpath="${FLEX_HOME}/ant/lib/flexTasks.jar"/>

	<!-- mxmlcの実行 -->
	<target name="main">
		<mxmlc file="${APP_ROOT}/src/Report.mxml" output="${APP_ROOT}/bin/Report.swf">
		<!-- mxmlc file="${APP_ROOT}/src/Report.mxml" keep-generated-actionscript="true" -->
			<!-- load-config filename="${FLEX_HOME}/frameworks/flex-config.xml"/ -->
			<load-config filename="${FLEX_HOME}/frameworks/air-config.xml"/>
			<source-path path-element="${FLEX_HOME}/frameworks"/>
		</mxmlc>
	</target>
</project>

2. ASDocの出力

ASDocを出力するためには、FlexSDK配下のbin/asdocを利用します。
が、FlexはasdocですがAirの場合aasdocを利用することになりますので注意してください。
また、ここでも指摘されていますが、linuxやmacでaasdocを利用する場合改行コードの
CRLFになっており正常に実行できませんので、改行コードを置き換える必要があります。

以下がasdocを出力するためのantになります。基本的にはここのテンプレート利用して任意に修正してください。

<?xml version="1.0" encoding="UTF-8"?>
<project name="asdoc" default="main" basedir=".">
	<description>
		AsDoc出力用のAntファイルです
	</description>
	
	<!-- Hudsonの提供する環境変数を設定(実際ここでは利用されない) -->
	<property environment="env" />

	<!-- 各種プロパティ定義 -->
	<!-- FlexSDKのホーム -->
	<property name="FLEX_HOME" value="/usr/local/flex"/>
	<!-- アプリケーションのルート -->
	<property name="APP_ROOT" value="../"/>
	<!-- aasdocへのパス -->
	<property name="ASDOC_EXE" location="${FLEX_HOME}/bin/aasdoc"/>
	<!-- ASDoc出力対象のソースディレクトリ -->
	<property name="AppClasses.dir" location="${APP_ROOT}/src/"/>
	<!-- ASDocの出力対象のディレクトリ -->
	<property name="Output.dir" location="${basedir}/output/AppDocs" />

	<!-- flex用Antタスクを読み込む -->
	<taskdef resource="flexTasks.tasks" classpath="${FLEX_HOME}/ant/lib/flexTasks.jar"/>

	<!-- デフォルトの実行クラス -->
	<target name="main" depends="clean,compile" description="full build of asdocs"/>

	<!-- 既存のOutputを削除して新規作成するCleanUp -->
	<target name="clean">
		<delete dir="${Output.dir}" failOnError="false" includeEmptyDirs="true"/>
		<mkdir dir="${Output.dir}"/>
	</target>
	<!--
	 -	ASDocの実行。FlexAntタスクなどで定義されているわけではないので、execタスクを利用して直接aasdocを実行する。
	-->
	<target name="compile">
		<exec executable="${ASDOC_EXE}" failonerror="false">
			<arg line='-source-path ${AppClasses.dir} ${FLEX_HOME}/frameworks/'/>
			<arg line='-doc-sources ${AppClasses.dir}/com/wordpress/prepro'/>
			<arg line='-window-title "Report"'/>
			<arg line='-output ${Output.dir}'/>
		</exec>
	</target>
</project>

3. FlexPMDの実行

FlexPMDを実行するためには以下から必要な物をダウンロードする必要があります。
本来であれば外部にjarファイルをおいてそちらを参照すべきなのですが、
今回はプロジェクト内部に含める形にします(諸事情により)。
はまった点としてはチュートリアルにある方法では上手くいかなくて、classpathをはずしたら上手くいきました。
また、チュートリアルでは値を変数設定していますが、ここでは割り切って相対パスで指定しています。

<?xml version="1.0" encoding="UTF-8"?>
<project name="Flex PMD example" default="test" basedir=".">
    <description>
        taskdef flexPmdの定義テスト
    </description>

    <!--**************************************************** 
                FlexPMDを定義する
        *****************************************************-->
	<taskdef name="flexPmd" classname="com.adobe.ac.pmd.ant.FlexPmdAntTask" >
        <classpath>
            <pathelement location="../libs/ext/flexpmd/as3-parser-1.0.RC3.jar"/>
            <pathelement location="../libs/ext/flexpmd/as3-parser-api-1.0.RC3.jar"/>
            <pathelement location="../libs/ext/flexpmd/as3-plugin-utils-1.0.RC3.jar"/>
            <pathelement location="../libs/ext/flexpmd/commons-lang-2.4.jar"/>
            <pathelement location="../libs</classpath>/ext/flexpmd/flex-pmd-ant-task-1.0.RC3.jar"/>
            <pathelement location="../libs/ext/flexpmd/flex-pmd-core-1.0.RC3.jar"/>
            <pathelement location="../libs/ext/flexpmd/flex-pmd-files-1.0.RC3.jar"/>
            <pathelement location="../libs/ext/flexpmd/flex-pmd-ruleset-1.0.RC3.jar"/>
            <pathelement location="../libs/ext/flexpmd/flex-pmd-ruleset-api-1.0.RC3.jar"/>
            <pathelement location="../libs/ext/flexpmd/plexus-utils-1.0.2.jar"/>
            <pathelement location="../libs/ext/flexpmd/pmd-4.2.2.jar"/>
        </classpath>
    </taskdef>

	<target name="test">
        <flexPmd 
        	shortFilenames="false"
            sourceDirectory="../src" 
            outputDirectory="output/" />
	</target>
</project>

これでoutput以下に、pmd.xmlを出力しますので、hudson側でこんな感じに設定してやります。

HusonのViolations設定

HusonのViolations設定


すると、HudsonのView上で確認することが出来るようになります。
Violation結果

Violation結果

問題点

本来はこれで問題なく参照できるはずですが、sourceが表示されず対応行がビジュアルに表示されませんでした。
Violationの設定がおかしかったのかなとも思ったのですが、filenameが絶対パスで示されている関係なのかなぁと思ったりして検索してみたら、こんなのを見つけました。

RC4で対応されるみたいなので、また改めて試してみようと思います。

2009/09/20 追記

これを書いたのは9/8頃だったんですが(そのまま放置(汗))今日(9/20)に見たら、
know issureとしてFlexPMDのトップページに以下が表示されるようになっていました。
今後に期待ということで…

Stack traces can be thrown during parsing. They are caught though during analyzing the code base, and hence fails over

Posted in program | タグ: , , | Leave a Comment »

HudsonでFindBugsプラグインの出力結果を日本語化する方法

Posted by hikaruworld : 2009 3月 18

具体的には、プロジェクト→FindBugs WarningsのDetailsの各内容。

Hudsonは非常に便利なCIツールで、多様なプラグインが存在しているが、
日本語化されていないものも多い。

基本的には、英語でも問題ないのだが、FindBugsやCheckStyleといった
静的解析ツールの出力結果が日本語で表示されていないのは、色々と使いづらい。
※別にメニューや、見出しが英語なのは気にしないが。

今のプロジェクトではFindBugsやCheckStyleのエラーは「努力目標」に過ぎないため、理解しやすさは大切。
特にFindBugsは致命的な潜在バグを検出してくれるため、
「エラーメッセージが良くわからなくて修正できませんでした」なんていわれた日には
後で、痛い目にあう羽目になる。

それで、出力結果を日本語化できないものかと思い、試行錯誤してみた。

FindBugsの最新版を落としてきて、AntでHTML出力してみると問題なく日本語されていた。
で、1.3.2とは古いなぁと思いつつfindbugs-1.3.2.jarの中を覗いてみると、案の定、日本語ロケールのmessages.xmlがない。
この感じだと、Findbugsを最新版に置き換えれば簡単に解決しそうな感じなのでやってみるとOKだった。

で、前置きが長くなってしまったが、以下が対応方法。
結論から言うと、先述の通りFindBugsのライブラリを最新に置き換えたら解決した。
Hudsonのワークスペース(hudson.warではない)は/var/hudsonに存在していることが前提。

  1. hudsonを停止(自分の環境ではTomcat上で動いているのでTomcatを停止)
  2. 最新版のFindBugsをダウンロード(この時点では1.3.7)して展開(/usr/local/findbugsへ)
  3. Findbugsプラグインのlibがあるディレクトリ(/var/hudson/plugins/findbugs/WEB-INF/)に移動
  4. 既存のlibを./lib.dstに退避(理由は後で後述)
  5. 新規にダウンロードしたfindbugs内部のlibをHudsonのFindBugsプラグイン側にコピー
  6. 確認のためDiff

    lib.dist/だけに発見: annotations-1.0.0.jar
    lib/だけに発見: annotations.jar
    lib/だけに発見: ant.jar
    lib.dist/だけに発見: asm-3.0.jar
    lib/だけに発見: asm-3.1.jar
    lib.dist/だけに発見: asm-analysis-3.0.jar
    lib/だけに発見: asm-analysis-3.1.jar
    lib.dist/だけに発見: asm-commons-3.0.jar
    lib/だけに発見: asm-commons-3.1.jar
    lib.dist/だけに発見: asm-tree-3.0.jar
    lib/だけに発見: asm-tree-3.1.jar
    lib.dist/だけに発見: asm-util-3.0.jar
    lib/だけに発見: asm-util-3.1.jar
    lib.dist/だけに発見: asm-xml-3.0.jar
    lib/だけに発見: asm-xml-3.1.jar
    lib.dist/だけに発見: bcel-1.3.2.jar
    lib/だけに発見: bcel.jar
    lib/だけに発見: buggy.icns
    lib/だけに発見: commons-lang-2.4.jar
    lib.dist/だけに発見: coreplugin-1.3.2.jar
    lib.dist/だけに発見: dom4j-1.3.jar
    lib/だけに発見: dom4j-1.6.1.jar
    lib.dist/だけに発見: findbugs-1.3.2.jar.dist
    lib/だけに発見: findbugs-ant.jar
    lib/だけに発見: findbugs.jar
    lib/だけに発見: jFormatString.jar
    lib.dist/だけに発見: java2html-5.0.jar
    lib/だけに発見: jaxen-1.1.1.jar
    lib.dist/だけに発見: jsr305-1.3.2.jar
    lib/だけに発見: jsr305.jar

  7. 既存で退避したもののうち、バージョン違い以外で存在しているjarファイルをコピー。
    • coreplugin-1.3.2.jar
    • java2html-5.0.jar
  8. Hudsonを再起動
  9. 再度ビルドを実行

libを丸ごと置き換えるとFindBugsのソースコードviewでNoClassDeffoundErrorで落ちたので、java2html-5.0.jarをコピーしてきたら解決した。

Posted in server | タグ: , , | Leave a Comment »