Your SlideShare is downloading. ×
0
Jenkins plugin memo
Jenkins plugin memo
Jenkins plugin memo
Jenkins plugin memo
Jenkins plugin memo
Jenkins plugin memo
Jenkins plugin memo
Jenkins plugin memo
Jenkins plugin memo
Jenkins plugin memo
Jenkins plugin memo
Jenkins plugin memo
Jenkins plugin memo
Jenkins plugin memo
Jenkins plugin memo
Jenkins plugin memo
Jenkins plugin memo
Jenkins plugin memo
Jenkins plugin memo
Jenkins plugin memo
Jenkins plugin memo
Jenkins plugin memo
Jenkins plugin memo
Jenkins plugin memo
Jenkins plugin memo
Jenkins plugin memo
Jenkins plugin memo
Jenkins plugin memo
Jenkins plugin memo
Jenkins plugin memo
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Jenkins plugin memo

3,495

Published on

0 Comments
5 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
3,495
On Slideshare
0
From Embeds
0
Number of Embeds
9
Actions
Shares
0
Downloads
7
Comments
0
Likes
5
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Jenkins プラグイン開発 メモ @kiy0taka13年4月5日金曜日
  • 2. 自己紹介 •奥清隆(おく きよたか) •id:kiy0taka、@kiy0taka ※ 「0」は数字のゼロ •株式会社ニューキャスト所属 •日本Grails/Groovyユーザーグループ •関西Javaエンジニアの会13年4月5日金曜日
  • 3. プラグイン開発歴(公式) •Terminal •jQuery •jQueryUI •MongoDB •TEPCO •Groovy Remote Control13年4月5日金曜日
  • 4. プラグイン開発歴(非公式) •Backup •GCrawler •go-con •Xmas •irof13年4月5日金曜日
  • 5. 多分書きます http://beta.mybetabook.com/b/kiy0taka/Building+Jenkins+plugin+with+Groovy13年4月5日金曜日
  • 6. プラグインを作る •Apache Jelly •Stapler •Extension Point •http://wiki.jenkins-ci.org/display/ JENKINS/Extension+points13年4月5日金曜日
  • 7. 前準備 •JDK 1.6以上 •Maven 3.0.4以上が望ましい •好きなIDE13年4月5日金曜日
  • 8. Maven設定 • /.m2/settings.xmlに設定を追記 •参考: 850703 https://gist.github.com/kiy0taka/13年4月5日金曜日
  • 9. settings.xml <settings> [...] <pluginGroups> <pluginGroup>org.jenkins-ci.tools</pluginGroup> </pluginGroups> <profiles> [...] <profile> <id>jenkins</id> <pluginRepositories> <pluginRepository> <id>m.g.o-public</id> <url>http://maven.glassfish.org/content/groups/public/</url> </pluginRepository> </pluginRepositories> <repositories> <repository> <id>m.g.o-public</id> <url>http://maven.glassfish.org/content/groups/public/</url> </repository> </repositories> </profile> </profiles> [...] </settings> ※ profileを分けなくても良い13年4月5日金曜日
  • 10. Maven Jenkins Plugin •プロジェクト作成 •mvn hpi:create -P jenkins •実行 •mvn hpi:run •パッケージ、リリースなどは通常のターゲ ットで。(package, release:prepare)13年4月5日金曜日
  • 11. Describable/Descriptor •Describableインターフェースを実装する クラスにはDescriptorの実装が必要 •Descriptorはシングルトン、Describable なインスタンスはDescriptorから作られ る13年4月5日金曜日
  • 12. HelloWorldBuilder public class HelloWorldBuilder extends Builder { @Override public DescriptorImpl getDescriptor() { return (DescriptorImpl)super.getDescriptor(); } @Extension public static final class DescriptorImpl extends BuildStepDescriptor<Builder> { } }13年4月5日金曜日
  • 13. 13年4月5日金曜日
  • 14. 13年4月5日金曜日
  • 15. Stapler •JenkinsのオブジェクトとURLをマッピング •/descriptorByName/ org.jenkinsci.plugins.sample.HelloWorldB uilder/checkName?value=Hello •Jenkins.getInstance().getDescriptorByNa me("org.jenkinsci.plugins.sample.HelloWo rldBuilder")).doCheckName("Hello")13年4月5日金曜日
  • 16. Builder#perform() •AbstractBuild •実行中のビルド •Launcher •ノード上でコマンドを実行する •BuildListener •ログ出力したり13年4月5日金曜日
  • 17. プロセス実行 // コマンド ArgumentListBuilder args = new ArgumentListBuilder("ls", "-la"); // 実行 launcher.launch() .cmds(args) // コマンド設定 .stdout(listener.getLogger()) // 標準出力をビルドのログに出力 .join(); // 実行して待つ13年4月5日金曜日
  • 18. プロセス実行 // コマンド ArgumentListBuilder args = new ArgumentListBuilder("ls", "-la"); // 実行 launcher.launch() .cmds(args) // コマンド設定 .stdout(listener.getLogger()) // 標準出力をビルドのログに出力 .join(); // 実行して待つ13年4月5日金曜日
  • 19. ノード上で処理 // リモート上で実行する処理 static class MyTask implements Callable<String, Exception> { public String call() throws Exception { return "hello"; } } public boolean perform(...) { // 処理実行 launcher.getChannel().call(new MyTask()); }13年4月5日金曜日
  • 20. ノード上で処理 public boolean perform(...) { // callの引数はシリアライズされてリモートノード上で実行される // BuilderはSerializableではないのでこれはダメ launcher.getChannel().call(new Callable<String, Exception> { public String call() throws Exception { return "hello"; } }); }13年4月5日金曜日
  • 21. Jelly •JenkinsのViewを書く •Groovyスクリプトでも記述可能 •書き方についてはUI Samplesを参照 •どのjellyファイルを書かないといけないか は各ExtensionのJavadoc等を参照13年4月5日金曜日
  • 22. マイグレーション13年4月5日金曜日
  • 23. 13年4月5日金曜日
  • 24. マイグレーション •モデルのプロパティを変更した場合、古い データも変更する必要がある •プラグインのバージョンを上げてジョブの 設定が飛んだとかならないように •バージョンを下げても動くように13年4月5日金曜日
  • 25. マイグレーション // private final String name; private final String username; // Initializerを使って対象のデータが読み込まれる前に @Initializer(before = InitMilestone.JOB_LOADED) public static void migration() { Items.XSTREAM2.aliasAttribute( HelloWorldBuilder.class, "username", "name"); }13年4月5日金曜日
  • 26. テスト13年4月5日金曜日
  • 27. Jenkinsとの結合テスト •extens HudsonTestCase •@Rule JenkinsRule13年4月5日金曜日
  • 28. @Rule public JenkinsRule rule = new JenkinsRule(); @Test public void test() throws Exception { FreeStyleProject myJob = rule.createFreeStyleProject(); HelloWorldBuilder builder = new HelloWorldBuilder("World"); myJob.getBuildersList().add(builder); myJob.save(); FreeStyleBuild build = myJob.scheduleBuild2(0).get(); assertEquals(build.getResult(), Result.SUCCESS); assertTrue(readFileToString(build.getLogFile()) .contains("Hello, World!")); }13年4月5日金曜日
  • 29. src/test/resources/org/jenkinsci/plugins/sample/ HelloWorldBuilderTest/test以下にテスト用の JENKINS_HOMEを作っておく @Test @LocalData public void test() throws Exception { FreeStyleProject myJob = (FreeStyleProject) rule.jenkins.getItem("myJob"); FreeStyleBuild build = myJob.scheduleBuild2(0).get(); assertEquals(build.getResult(), Result.SUCCESS); assertTrue(readFileToString(build.getLogFile()) .contains("Hello, World!")); }13年4月5日金曜日
  • 30. @Recipe •LocalData •PresetData •WithPlugin •WithPluginManager •WithTimeout13年4月5日金曜日

×