Jenkins と groovy

9,282 views

Published on

JGGUGで2011/2/24にした発表です

Published in: Technology
1 Comment
11 Likes
Statistics
Notes
  • Hello,
    How are you doing and how is life down there in your Country? I guess you are having good time. My name is Cordelia . I would love to be communicating with you for a mutual and well established friendship. I am really consumed by your profile, giving me the impression that you will be a type i desire to have as a friend. Pleas i will like you to write me back on my email address(ask4pretycordelia@hotmail.com) so that we can share our photos and experience of life and every other things in common with each other. I will wait to hear from you.

    Take care of yourself.
    Cordelia
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total views
9,282
On SlideShare
0
From Embeds
0
Number of Embeds
1,896
Actions
Shares
0
Downloads
22
Comments
1
Likes
11
Embeds 0
No embeds

No notes for slide

Jenkins と groovy

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

×