SlideShare a Scribd company logo
Jenkins と Groovy川口耕介CloudBees, Inc.
Jenkins と groovy
スクリプトコンソール任意のGroovyスクリプトをeval実行中のアプリケーションの内部を操作VMWareESXiのsshアクセスみたいなものトラブル対応デバッグフラグをon/offしたりバッチ処理ジョブの設定を一括で変えたり情報収集実行中のスレッドの一覧
スクリプトコンソール以前は運用中のJenkinsにデバッガを接続してやっていたデバッガでしかできない事もあるでも不便な事もあるスクリプトを渡してユーザーに実行してもらうJenkinsユーザーは開発者なので自分でクリエイティブに活用する人も
実装GroovyShellを使えば簡単GroovyShell shell = new GroovyShell(cl);StringWriter out = new StringWriter();PrintWriter pw = new PrintWriter(out);shell.setVariable("out", pw);Object output = shell.evaluate(script);pw.println("Result: "+output);
リクエスト・レスポンス方式の限界ウェブページという仕組み上の制約長く実行するプログラムを書けないスクリプトをコピペしないといけないスクリプトに他の入力を渡すのが大変スクリプトをscriptingできない
やっぱりCLI!コマンドラインから実行すれば問題解決Jenkins JVMClient JVMJenkins remotingGroovyShell
デモ
2つのJVMを跨ぐJenkins remoting layerを利用よく考えると色々面白い問題がSystem.outはどこへ?new File(“data.txt”)はどこへ?両方アクセスできるようにする工夫が色々new FilePath(channel, “data.txt”)©2010 CloudBees, Inc. All Rights Reserved
2つのJVMを跨ぐデータアクセスをtransparentにJenkins JVMClient JVMJenkins remotingGroovyShellFilePath
更に次のステップへ計算を他のVMへ送りたい
更に次のステップへ計算を他のVMへ送りたい
実験プロジェクト Droovy分散計算プラットフォームHadoopと勝負!ではなく、ちょっとしたやつ複数の計算機を気軽に跨ぎたいJenkinsの分散ビルド環境を利用
ここでJenkins分散ビルドについて一言マスターHTTPリクエストを処理重要なデータを保管スレーブ170KB jar信頼性は低くてよい200位は普通に繋げるリンク双方向バイトストリームで接続
Back to Droovy複数の計算機を跨いでスクリプトを書きたい負荷テスト処理の並列化暗黙にコードを共有したい通信路を意識しないプログラムを書きたい
クロージャをリモート実行slave = connect();slave {println “This code executes on a slave”;}println “This code executes on master”;
クロージャには束縛された変数を含むslave = connect();name = “Duke”;slave {println “Hello from ${name}”;}
コードは暗黙に共有されるdef sayHello(name) {println “Hello from ${name}”;  }slave = connect();name = “Duke”;slave {sayHello(name);}
デモ
Droovyまとめコード共有とかの問題はJenkins remotingで解決済みなぜGroovy?クロージャ概念がリモート実行とうまくマッチ誰か使ってみませんか?
Jenkins Groovy Shell Groovyshもアプリケーションに埋め込めるだからやってみたモデルは前と同じ実行はJenkinsの中I/OはクライアントJVMで対話性は便利障害対応とかスクリプトを書くための練習環境として
 Jenkins & GroovyMavenを使っていると時々…些細なプラグインを書かされる羽目になったり既存のプラグインの設定項目が足りなかったりAntを使ったほうが早い時があったり
<plugin>  <groupId>org.codehaus.mojo</groupId>  <artifactId>build-helper-maven-plugin</artifactId>  <version>1.5</version>  <executions>    <execution>      <id>add-source</id>      <phase>generate-sources</phase>      <goals>        <goal>add-source</goal>      </goals>      <configuration>        <sources>          <source>some directory</source>        </sources>      </configuration>    </execution>  </executions></plugin>
Mavenなんてやってられるか!
GMavenそこでGMavenビルドの一部をGroovyで書けるMavenの内部コンポーネントにアクセスできるAntBuilderも当然使える利用例コードカバレッジの取得と集計
GMavenの欠点しかし…Groovyを呼び出すだけで15行位書かないといけない呼べるコンポーネントの量が少ないMavenProjectへの変更が反映されない利用できる局面は限定的にパッチを当てたバージョンを作ったhttp://github.com/kohsuke/gmaven今後はGradleとかも試してみたいPolyglot Mavenがメンテナンスされれば…
Groovyでテストを記述Jenkinsのテストの一部はGroovyで書かれている型宣言の手間が省けるそれでいてauto-completionは使えるリテラルの構築が楽さようならthrows節プロパティアクセスなどが楽実行速度?
void testVariablesResolved() {		def project = createFreeStyleProject();hudson.nodeProperties.replaceBy([  new EnvironmentVariablesNodeProperty(				new Entry("KEY1", "value"),				new Entry("KEY2",'$KEY1'))]);		def builder = new CaptureEnvironmentBuilder();project.buildersList.add(builder);buildAndAssertSuccess(project);		def envVars = builder.envVars;assertEquals("value", envVars["KEY1"]);assertEquals("value", envVars["KEY2"]);}
とはいえ…思ったよりGroovyテストが増えてないMaven+Groovy+IntelliJが壊れやすいソースディレクトリが認識されなかったり型安全でなくてもいいが、補完は必須Closure周りで型情報が失われる
Jelly -> GroovyJenkinsではHTMLのレンダリングにJellyを使っている (JSTLのようなもの)<html>  <head>    <meta name="ROBOTS" content="INDEX,NOFOLLOW" />    <j:set var="mode" value="header" />    <j:forEach var="pd" items="${h.pageDecorators}">      <st:include it="${pd}" page="header.jelly" />    </j:forEach>  ...
Jelly -> GroovyBuilderを書いてGroovyで置き換えてみたhtml {  head {    meta(name:"ROBOTS",content:"INDEX,NOFOLLOW")    mode = "header";h.pageDecorators.each { pd ->st.include(it:pd, page:"header.jelly")    }...
Jellyの欠点を解消ツールサポートがないExpression Languageが補完できないデバッガでステップ実行できないタグ・属性が補完されない
欠点を解消したつもり…ELの補完は今ひとつ暗黙の変数などタグ・属性の補完は今ひとつ実行速度は大丈夫?IntelliJにはDSLの補完を助ける機構があるらしいので試してみたい
YouDebug障害対応の選択肢を広げるログやスタックトレースでは予期できない時が開発中でも…ブレークする条件が複雑な場合ソースがない場合リモートで実行する場合デバッガプロトコルを制御するDSLを作った
YouDebugブレークポイントでクロージャを実行クロージャ内からローカル変数等にアクセス“@1”などで序数からアクセスもできるbreakpoint("org.acme.Main",15) {println "x=${x},y=${y}"}
YouDebugJDIがサポートする全てのブレークポイントの種類が使えるデバッガの用にターゲットVMで任意のメソッド・フィールドにアクセスできる
デモ©2010 CloudBees, Inc. All Rights Reserved
まとめJenkinsでは色々Groovyを使ってみた実行時にユーザーに使わせる機能として文句なしに便利開発時の生産性を上げるために結局はツールサポートの問題にJavaには優れたツールサポートがあるのでGroovyで置き換えてもメリットが薄い場合も

More Related Content

Jenkins と groovy