hudson using groovy #jggug

21
HudsonGroovy 2010/12/09 @kimukou_26

Upload: kimukou26-kimukou

Post on 06-Jul-2015

2.317 views

Category:

Technology


4 download

TRANSCRIPT

Page 1: Hudson using Groovy  #jggug

HudsonでGroovy

2010/12/09

@kimukou_26

Page 2: Hudson using Groovy  #jggug

みなさん、Groovyスクリプトを書くとき

何使っていますか~

自分はGroovyConsoleのWebStart版使ってます( http://d.hatena.ne.jp/bluepapa32/20101006/1286337869 )

ここをクリック

Page 3: Hudson using Groovy  #jggug

インストールは手軽~

1. ウインドウ閉じた時に記述保持機能あるよ

2. Grape やAntBuilderも問

題なしに使えます

Page 4: Hudson using Groovy  #jggug

@kiy0taka さんのブログで[ groovyでsay読み上げ ]の話見て

Page 5: Hudson using Groovy  #jggug

WindowsでGroovyConsole+AquesTalk(音声再生dll)で

出来ないもんかな~

AquesTalkDa.dll

JNAGroovyClassLoaderを

使って対象コードを読むgroovyコード

JNAを使ってAquesTalkDa.dll

を読込むgroovyコード

Page 6: Hudson using Groovy  #jggug

ファイル構成(GConsole)

LTHudson/standalonegcon_jnatest.groovy (UTF-8)AquesTalkByJNA.groovy (UTF-8)libgroovy-all-1.7.5.jarjna.jarplatform.jar

AquesTalkDa.dlldll/音声タイプ/AquesTalkDa.dll

Page 7: Hudson using Groovy  #jggug

で、ソースとDLLの位置同じにして書いてみた

String talk = "ゆっくり'/して'いってね。したからく'るぞ、きをつ'けろ"ClassLoader parent = ClassLoader.getSystemClassLoader()CompilerConfiguration config = new CompilerConfiguration([

sourceEncoding:'UTF-8' //equals -Dgroovy.source.encoding=UTF-8])GroovyClassLoader loader = new GroovyClassLoader(parent,config)new File("$LIBPATH").eachFileRecurse{ loader.addURL it.toURL()}

fname="$SRCPATH/AquesTalkByJNA.groovy"File fn = new File(fname)def source = new GroovyCodeSource(fn,"UTF-8") //equals -Dfile.encoding=UTF-8def groovyClass = loader.parseClass(source)def groovyObject = groovyClass.newInstance()

groovyObject.setProperty("args", [talk]as Object[])groovyObject.invokeMethod("run", [] as Object[])

<呼び元( gcon_jnatest.groovy )>

Page 8: Hudson using Groovy  #jggug

<呼び先(AquesTalkByJNA.groovy )>

String talk=args[1]

// AquesTalkDa.dll の宣言関数interface Aques extends Library {

Aques INSTANCE = Native.loadLibrary("AquesTalkDa", Aques.class)Pointer AquesTalkDa_Create()void AquesTalkDa_Release(Pointer hMe)int AquesTalkDa_PlaySync(String koe, int iSpeed)Pointer AquesTalkDa_Play(Pointer hMe, String koe, int iSpeed, Pointer

hWnd, int msg,int dwUser)int AquesTalkDa_IsPlay(Pointer hMe)

}// ハンドラの作成Pointer data = Aques.INSTANCE.AquesTalkDa_Create()// 再生Aques.INSTANCE.AquesTalkDa_Play(data, talk, 100, null, 0, 0)Thread.sleep(6000) //★ 再生時間の確保// ハンドラの開放Aques.INSTANCE.AquesTalkDa_Release(data)

Page 9: Hudson using Groovy  #jggug

でも、NG!(DLLが見つからない)

WebStartで実行するアプリって、

カレントディレクトリはデスクトップ dllをデスクトップに置くって微妙・・・。

Javaはカレントディレクトリって変えられないよね~

<呼び先(AquesTalkByJNA.groovy )>

String talk=args[1]//DLL検索パスの明示NativeLibrary.addSearchPath(“AquesTalkDa”,DLLPATH) //★

// AquesTalkDa.dll の宣言関数public interface Aques extends Library {

Aques INSTANCE = Native.loadLibrary("AquesTalkDa", Aques.class)

★)DLLの検索ディレクトリを指定!(DLL位置も動的指定可能!)

Page 10: Hudson using Groovy  #jggug

で見事再生!<デモ有>(ランダムで音声も変更できるよ)

AquesTalk の制限事項全角ひらがな、カタカナのみ <不正文字がある時は再生しない「‘」でアクセント、1ワード1個(/ 、。?で区切り)

JNA制限事項NativeLibrary.addSearchPath は先宣言のみ有効

=>同一ClassLoaderでは繰り返し変更は不可 <残念!

Page 11: Hudson using Groovy  #jggug

ならJenkins(旧Hudson)のジョブ上でも

しゃべらせられるかも?

Page 12: Hudson using Groovy  #jggug

Jenkins(旧Hudson)とは

OSSのCI(Continuous Integration)ツール 実行は [ java –jar jenkins.war]で手軽! Groovyスクリプトも使えます

HudsonTerminal Plugin Go-kon pluginとか拡張Pluginも豊富です

Jenkins CLI というコマンドラインIFもあります

groovyコードJENKINS.

CLI

java -jar jenkins-cli.jar [-s JENKINS_URL] XX.groovy

Page 13: Hudson using Groovy  #jggug

ファイル構成(Hudson.CLI)

LTHudson/hudson-mst ・・Hudsonの実行フォルダhudson.bat ・・hudson起動BAThudson-cli.bat ・・hudson-cli用BATJob ・・実行されるジョブScript

gcon_jnatest.groovy (UTF8 =>SJISで保存)AquesTalkByJNA.groovy(UTF8)liblibjna

jna.jarplatform.jar

dll音声タイプ/AquesTalkDa.dll

War/WEB-INF/hudson-cli.jarWar/WEB-INF/lib/groovy-all-1.6.0.jarWar/WEB-INF/lib/groovy-all-1.7.5.jar

Page 14: Hudson using Groovy  #jggug

BATの中身Hudson.bat ・・Hudson起動バッチファイル

set JAVA_HOME=C:¥opt¥jdk

set CMD_OPTION=--httpPort=38080 --httpsPort=38081 --ajp13Port=-1

%JAVA_HOME%/bin/java -XX:MaxPermSize=256m -Xms256m -Xmx256m

-jar hudson.war %CMD_OPTION%

Hudson-cli.bat ・・Jenkinsに接続するプロセスBAT

cd /d %0¥..set JAVA_HOME=C:¥opt¥jdkset CMD_URL=http://127.0.0.1:38080set CLASSPATH=./war/WEB-INF/*;./script/lib/*%JAVA_HOME%/bin/java -cp "%CLASSPATH%" hudson.cli.CLI

-s %CMD_URL% groovy %* %CMD_URL%

Page 15: Hudson using Groovy  #jggug

手間取りましたが動きました!<デモ有>

Page 16: Hudson using Groovy  #jggug
Page 17: Hudson using Groovy  #jggug

何点か注意点 このジョブはgrooby-all 1.7系でしか動きません(要差替え)

Jenkins同梱のgroovy-all.jarは1.6.0 new GroovyCodeSource(fn,“UTF-8”) を使えるのは、1.7系から

1.6.0だとスクリプト上のインナークラス宣言がエラーが出てしまう

groovy-all-1.7.5.jar なら問題なく動く!(既存も今の所問題なし)

core/src/main/java/ hudson.cli.GroovyCommand で下記のようなコード実装が・・ ジョブ上から呼べるGroovyスクリプトがOSエンコードに依存してしまう

WinだとSJIS(MACはUTF8なので対処は要らないけど・・) 日本語を扱ったり、日本語コメントがあると動かないということ

Command直の実行groovyをSJIS保存で一応回避は出来るけど・・。

Binding binding = new Binding();binding.setProperty("out",new PrintWriter(stdout,true));GroovyShell groovy = new GroovyShell(binding);groovy.run(loadScript(),“RemoteClass”,~

今後のWin対応(UTF8指定可能対応)期待したいな~

Goovy-all-1.7.5.jar に本体のjarが差し替え期待!

Page 18: Hudson using Groovy  #jggug

資料リンク Jenkins(旧Hudson)公式サイト

https://wiki.jenkins-ci.org/display/JA/Jenkins 使用Plugin

setEnv PluginBatchTask PluginGo-kon plugin

AquesTalk公式サイト http://www.a-quest.com/products/aquestalk.html

使ったライブラリAquesTalk Win拡張声種ライブラリ(Win用)

検証コードのURL https://github.com/kimukou26/hudsontest

LTHudsonのフォルダ

Page 19: Hudson using Groovy  #jggug

こんな事も出来ます(1)3回同じJOBを3回実行して次のJOBへ進む

JenkinsCLI + HttpUnit(jar) のコンボで

Groovyファイル内で下記のURLを呼ぶとJOB動きます

$JENKINS_URL/job/$JOB_NAME/build?delay=30sec

3回繰り返して先に進むJOB例

次の繰り返しJOB

予約

Page 20: Hudson using Groovy  #jggug

こんな事も出来ます(2)

GradlePluginを入れるとGriffonのコンパイルもJOBで出来ます!Grails 用は Grails Pluginが有ります!

Page 21: Hudson using Groovy  #jggug

気づいた事メモ1. ビルド履歴を全部消す

1. $JENKINS_HOME/Jobs/$JOB_NAME/buildsの中身を消す

2. $JENKINS_HOME/Jobs/$JOB_NAME/nextBuildNumberを消す

プラグインの手動インストール $JENKINS_HOME/plugin にいれる Jenkinsを再起動する

Jenkins.warのアップグレード $JENKINS_HOME に jenkins.warを置く Jenkinsを再起動 Warフォルダ配下は再作成される(groovy-all-1.7.5.jar も消されちゃいます)