Jenkins             プラグイン開発                メモ                @kiy0taka13年4月5日金曜日
自己紹介             •奥清隆(おく きよたか)             •id:kiy0taka、@kiy0taka               ※ 「0」は数字のゼロ             •株式会社ニューキャスト所属    ...
プラグイン開発歴(公式)             •Terminal             •jQuery             •jQueryUI             •MongoDB             •TEPCO      ...
プラグイン開発歴(非公式)             •Backup             •GCrawler             •go-con             •Xmas             •irof13年4月5日金曜日
多分書きます             http://beta.mybetabook.com/b/kiy0taka/Building+Jenkins+plugin+with+Groovy13年4月5日金曜日
プラグインを作る             •Apache Jelly             •Stapler             •Extension Point              •http://wiki.jenkins-ci....
前準備             •JDK 1.6以上             •Maven 3.0.4以上が望ましい             •好きなIDE13年4月5日金曜日
Maven設定             • /.m2/settings.xmlに設定を追記             •参考:                   850703                   https://gist.git...
settings.xml             <settings>               [...]               <pluginGroups>                 <pluginGroup>org.jenk...
Maven Jenkins Plugin             •プロジェクト作成              •mvn hpi:create -P jenkins             •実行              •mvn hpi:r...
Describable/Descriptor             •Describableインターフェースを実装する              クラスにはDescriptorの実装が必要             •Descriptorはシン...
HelloWorldBuilder  public class HelloWorldBuilder extends Builder {         @Override         public DescriptorImpl getDes...
13年4月5日金曜日
13年4月5日金曜日
Stapler         •JenkinsのオブジェクトとURLをマッピング         •/descriptorByName/             org.jenkinsci.plugins.sample.HelloWorldB...
Builder#perform()             •AbstractBuild              •実行中のビルド             •Launcher              •ノード上でコマンドを実行する     ...
プロセス実行   // コマンド   ArgumentListBuilder args = new ArgumentListBuilder("ls", "-la");   // 実行   launcher.launch()     .cmds(...
プロセス実行   // コマンド   ArgumentListBuilder args = new ArgumentListBuilder("ls", "-la");   // 実行   launcher.launch()     .cmds(...
ノード上で処理     // リモート上で実行する処理     static class MyTask implements Callable<String, Exception> {         public String call() ...
ノード上で処理   public boolean perform(...) {         // callの引数はシリアライズされてリモートノード上で実行される         // BuilderはSerializableではないのでこれ...
Jelly             •JenkinsのViewを書く             •Groovyスクリプトでも記述可能             •書き方についてはUI Samplesを参照             •どのjellyフ...
マイグレーション13年4月5日金曜日
13年4月5日金曜日
マイグレーション             •モデルのプロパティを変更した場合、古い             データも変更する必要がある             •プラグインのバージョンを上げてジョブの             設定が飛んだとかな...
マイグレーション             // private final String name;             private final String username;             // Initializerを使...
テスト13年4月5日金曜日
Jenkinsとの結合テスト             •extens HudsonTestCase             •@Rule JenkinsRule13年4月5日金曜日
@Rule   public JenkinsRule rule = new JenkinsRule();   @Test   public void test() throws Exception {         FreeStyleProj...
src/test/resources/org/jenkinsci/plugins/sample/             HelloWorldBuilderTest/test以下にテスト用の                     JENKIN...
@Recipe             •LocalData             •PresetData             •WithPlugin             •WithPluginManager             ...
Upcoming SlideShare
Loading in …5
×

Jenkins plugin memo

4,527 views

Published on

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

No Downloads
Views
Total views
4,527
On SlideShare
0
From Embeds
0
Number of Embeds
2,039
Actions
Shares
0
Downloads
8
Comments
0
Likes
5
Embeds 0
No embeds

No notes for slide

Jenkins plugin memo

  1. 1. Jenkins プラグイン開発 メモ @kiy0taka13年4月5日金曜日
  2. 2. 自己紹介 •奥清隆(おく きよたか) •id:kiy0taka、@kiy0taka ※ 「0」は数字のゼロ •株式会社ニューキャスト所属 •日本Grails/Groovyユーザーグループ •関西Javaエンジニアの会13年4月5日金曜日
  3. 3. プラグイン開発歴(公式) •Terminal •jQuery •jQueryUI •MongoDB •TEPCO •Groovy Remote Control13年4月5日金曜日
  4. 4. プラグイン開発歴(非公式) •Backup •GCrawler •go-con •Xmas •irof13年4月5日金曜日
  5. 5. 多分書きます http://beta.mybetabook.com/b/kiy0taka/Building+Jenkins+plugin+with+Groovy13年4月5日金曜日
  6. 6. プラグインを作る •Apache Jelly •Stapler •Extension Point •http://wiki.jenkins-ci.org/display/ JENKINS/Extension+points13年4月5日金曜日
  7. 7. 前準備 •JDK 1.6以上 •Maven 3.0.4以上が望ましい •好きなIDE13年4月5日金曜日
  8. 8. Maven設定 • /.m2/settings.xmlに設定を追記 •参考: 850703 https://gist.github.com/kiy0taka/13年4月5日金曜日
  9. 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. 10. Maven Jenkins Plugin •プロジェクト作成 •mvn hpi:create -P jenkins •実行 •mvn hpi:run •パッケージ、リリースなどは通常のターゲ ットで。(package, release:prepare)13年4月5日金曜日
  11. 11. Describable/Descriptor •Describableインターフェースを実装する クラスにはDescriptorの実装が必要 •Descriptorはシングルトン、Describable なインスタンスはDescriptorから作られ る13年4月5日金曜日
  12. 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. 13年4月5日金曜日
  14. 14. 13年4月5日金曜日
  15. 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. 16. Builder#perform() •AbstractBuild •実行中のビルド •Launcher •ノード上でコマンドを実行する •BuildListener •ログ出力したり13年4月5日金曜日
  17. 17. プロセス実行 // コマンド ArgumentListBuilder args = new ArgumentListBuilder("ls", "-la"); // 実行 launcher.launch() .cmds(args) // コマンド設定 .stdout(listener.getLogger()) // 標準出力をビルドのログに出力 .join(); // 実行して待つ13年4月5日金曜日
  18. 18. プロセス実行 // コマンド ArgumentListBuilder args = new ArgumentListBuilder("ls", "-la"); // 実行 launcher.launch() .cmds(args) // コマンド設定 .stdout(listener.getLogger()) // 標準出力をビルドのログに出力 .join(); // 実行して待つ13年4月5日金曜日
  19. 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. 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. 21. Jelly •JenkinsのViewを書く •Groovyスクリプトでも記述可能 •書き方についてはUI Samplesを参照 •どのjellyファイルを書かないといけないか は各ExtensionのJavadoc等を参照13年4月5日金曜日
  22. 22. マイグレーション13年4月5日金曜日
  23. 23. 13年4月5日金曜日
  24. 24. マイグレーション •モデルのプロパティを変更した場合、古い データも変更する必要がある •プラグインのバージョンを上げてジョブの 設定が飛んだとかならないように •バージョンを下げても動くように13年4月5日金曜日
  25. 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. 26. テスト13年4月5日金曜日
  27. 27. Jenkinsとの結合テスト •extens HudsonTestCase •@Rule JenkinsRule13年4月5日金曜日
  28. 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. 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. 30. @Recipe •LocalData •PresetData •WithPlugin •WithPluginManager •WithTimeout13年4月5日金曜日

×