SlideShare une entreprise Scribd logo
1  sur  30
Télécharger pour lire hors ligne
Jenkins
             プラグイン開発
                メモ
                @kiy0taka




13年4月5日金曜日
自己紹介
             •奥清隆(おく きよたか)
             •id:kiy0taka、@kiy0taka
               ※ 「0」は数字のゼロ

             •株式会社ニューキャスト所属
             •日本Grails/Groovyユーザーグループ
             •関西Javaエンジニアの会
13年4月5日金曜日
プラグイン開発歴(公式)

             •Terminal
             •jQuery
             •jQueryUI
             •MongoDB
             •TEPCO
             •Groovy Remote Control
13年4月5日金曜日
プラグイン開発歴(非公式)

             •Backup
             •GCrawler
             •go-con
             •Xmas
             •irof
13年4月5日金曜日
多分書きます




             http://beta.mybetabook.com/b/kiy0taka/Building+Jenkins+plugin+with+Groovy

13年4月5日金曜日
プラグインを作る

             •Apache Jelly
             •Stapler
             •Extension Point
              •http://wiki.jenkins-ci.org/display/
                JENKINS/Extension+points


13年4月5日金曜日
前準備


             •JDK 1.6以上
             •Maven 3.0.4以上が望ましい
             •好きなIDE


13年4月5日金曜日
Maven設定


             • /.m2/settings.xmlに設定を追記
             •参考:                   850703
                   https://gist.github.com/kiy0taka/




13年4月5日金曜日
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日金曜日
Maven Jenkins Plugin

             •プロジェクト作成
              •mvn hpi:create -P jenkins
             •実行
              •mvn hpi:run
             •パッケージ、リリースなどは通常のターゲ
              ットで。(package, release:prepare)


13年4月5日金曜日
Describable/Descriptor


             •Describableインターフェースを実装する
              クラスにはDescriptorの実装が必要

             •Descriptorはシングルトン、Describable
              なインスタンスはDescriptorから作られ
              る



13年4月5日金曜日
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年4月5日金曜日
13年4月5日金曜日
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日金曜日
Builder#perform()
             •AbstractBuild
              •実行中のビルド
             •Launcher
              •ノード上でコマンドを実行する
             •BuildListener
              •ログ出力したり
13年4月5日金曜日
プロセス実行

   // コマンド
   ArgumentListBuilder args = new ArgumentListBuilder("ls", "-la");

   // 実行
   launcher.launch()
     .cmds(args)                     // コマンド設定
     .stdout(listener.getLogger())   // 標準出力をビルドのログに出力
     .join();                        // 実行して待つ




13年4月5日金曜日
プロセス実行

   // コマンド
   ArgumentListBuilder args = new ArgumentListBuilder("ls", "-la");

   // 実行
   launcher.launch()
     .cmds(args)                     // コマンド設定
     .stdout(listener.getLogger())   // 標準出力をビルドのログに出力
     .join();                        // 実行して待つ




13年4月5日金曜日
ノード上で処理
     // リモート上で実行する処理
     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日金曜日
ノード上で処理

   public boolean perform(...) {

         // callの引数はシリアライズされてリモートノード上で実行される
         // BuilderはSerializableではないのでこれはダメ
         launcher.getChannel().call(new Callable<String, Exception> {
             public String call() throws Exception {
                 return "hello";
             }
         });
   }




13年4月5日金曜日
Jelly

             •JenkinsのViewを書く
             •Groovyスクリプトでも記述可能
             •書き方についてはUI Samplesを参照
             •どのjellyファイルを書かないといけないか
              は各ExtensionのJavadoc等を参照



13年4月5日金曜日
マイグレーション



13年4月5日金曜日
13年4月5日金曜日
マイグレーション

             •モデルのプロパティを変更した場合、古い
             データも変更する必要がある

             •プラグインのバージョンを上げてジョブの
             設定が飛んだとかならないように

             •バージョンを下げても動くように

13年4月5日金曜日
マイグレーション

             // 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日金曜日
テスト



13年4月5日金曜日
Jenkinsとの結合テスト


             •extens HudsonTestCase
             •@Rule JenkinsRule


13年4月5日金曜日
@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日金曜日
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日金曜日
@Recipe
             •LocalData
             •PresetData
             •WithPlugin
             •WithPluginManager
             •WithTimeout

13年4月5日金曜日

Contenu connexe

Tendances

What makes pyramid unique
What makes pyramid uniqueWhat makes pyramid unique
What makes pyramid uniqueAtsushi Odagiri
 
Gitのよく使うコマンド
Gitのよく使うコマンドGitのよく使うコマンド
Gitのよく使うコマンドYUKI Kaoru
 
Webサイト・フロントエンドの高速化とgrunt.jsについて
Webサイト・フロントエンドの高速化とgrunt.jsについてWebサイト・フロントエンドの高速化とgrunt.jsについて
Webサイト・フロントエンドの高速化とgrunt.jsについてTomo Fujita
 
開発チームもIaCやってみたい~VSOとDockerの組合せにチャレンジ~
開発チームもIaCやってみたい~VSOとDockerの組合せにチャレンジ~開発チームもIaCやってみたい~VSOとDockerの組合せにチャレンジ~
開発チームもIaCやってみたい~VSOとDockerの組合せにチャレンジ~CubedKachi
 
システム開発を前進させるためのGradle導入法
システム開発を前進させるためのGradle導入法システム開発を前進させるためのGradle導入法
システム開発を前進させるためのGradle導入法Takuma Watabiki
 
Spring in-summer-gradle-hands on-withanswers
Spring in-summer-gradle-hands on-withanswersSpring in-summer-gradle-hands on-withanswers
Spring in-summer-gradle-hands on-withanswersTakuma Watabiki
 
CIツールのまとめとSide CI - CIツール勉強会@福岡
CIツールのまとめとSide CI - CIツール勉強会@福岡CIツールのまとめとSide CI - CIツール勉強会@福岡
CIツールのまとめとSide CI - CIツール勉強会@福岡Koichiro Sumi
 
Gradleどうでしょう
GradleどうでしょうGradleどうでしょう
GradleどうでしょうTakuma Watabiki
 
Bundler kanazawa.rb meetup #2 2012/09/19
Bundler kanazawa.rb meetup #2 2012/09/19Bundler kanazawa.rb meetup #2 2012/09/19
Bundler kanazawa.rb meetup #2 2012/09/19Hitoshi Kurokawa
 
AsyncTask アンチパターン
AsyncTask アンチパターンAsyncTask アンチパターン
AsyncTask アンチパターンHiroshi Kurokawa
 
Jjug 20140430 gradle_basic
Jjug 20140430 gradle_basicJjug 20140430 gradle_basic
Jjug 20140430 gradle_basicTakuma Watabiki
 
Pylons ユーザのための Pyramid 移行ガイド
Pylons ユーザのための Pyramid 移行ガイドPylons ユーザのための Pyramid 移行ガイド
Pylons ユーザのための Pyramid 移行ガイドNozomu Kaneko
 
3分間 開発環境クッキング 2012.07 #pyfes
3分間 開発環境クッキング 2012.07 #pyfes3分間 開発環境クッキング 2012.07 #pyfes
3分間 開発環境クッキング 2012.07 #pyfesTakeshi Komiya
 
Nseg20120929
Nseg20120929Nseg20120929
Nseg20120929hiro345
 
Apache Archiva を試す
Apache Archiva を試すApache Archiva を試す
Apache Archiva を試すbouzuya
 
Jjug 20140430 gradle_advanced
Jjug 20140430 gradle_advancedJjug 20140430 gradle_advanced
Jjug 20140430 gradle_advancedMasatoshi Hayashi
 

Tendances (20)

What makes pyramid unique
What makes pyramid uniqueWhat makes pyramid unique
What makes pyramid unique
 
Gitのよく使うコマンド
Gitのよく使うコマンドGitのよく使うコマンド
Gitのよく使うコマンド
 
Maven2 plugin
Maven2 pluginMaven2 plugin
Maven2 plugin
 
Spring Boot概要
Spring Boot概要Spring Boot概要
Spring Boot概要
 
Webサイト・フロントエンドの高速化とgrunt.jsについて
Webサイト・フロントエンドの高速化とgrunt.jsについてWebサイト・フロントエンドの高速化とgrunt.jsについて
Webサイト・フロントエンドの高速化とgrunt.jsについて
 
開発チームもIaCやってみたい~VSOとDockerの組合せにチャレンジ~
開発チームもIaCやってみたい~VSOとDockerの組合せにチャレンジ~開発チームもIaCやってみたい~VSOとDockerの組合せにチャレンジ~
開発チームもIaCやってみたい~VSOとDockerの組合せにチャレンジ~
 
実は怖くないDevOps
実は怖くないDevOps実は怖くないDevOps
実は怖くないDevOps
 
システム開発を前進させるためのGradle導入法
システム開発を前進させるためのGradle導入法システム開発を前進させるためのGradle導入法
システム開発を前進させるためのGradle導入法
 
Spring in-summer-gradle-hands on-withanswers
Spring in-summer-gradle-hands on-withanswersSpring in-summer-gradle-hands on-withanswers
Spring in-summer-gradle-hands on-withanswers
 
CIツールのまとめとSide CI - CIツール勉強会@福岡
CIツールのまとめとSide CI - CIツール勉強会@福岡CIツールのまとめとSide CI - CIツール勉強会@福岡
CIツールのまとめとSide CI - CIツール勉強会@福岡
 
Gradleどうでしょう
GradleどうでしょうGradleどうでしょう
Gradleどうでしょう
 
Bundler kanazawa.rb meetup #2 2012/09/19
Bundler kanazawa.rb meetup #2 2012/09/19Bundler kanazawa.rb meetup #2 2012/09/19
Bundler kanazawa.rb meetup #2 2012/09/19
 
AsyncTask アンチパターン
AsyncTask アンチパターンAsyncTask アンチパターン
AsyncTask アンチパターン
 
Jjug 20140430 gradle_basic
Jjug 20140430 gradle_basicJjug 20140430 gradle_basic
Jjug 20140430 gradle_basic
 
Pylons ユーザのための Pyramid 移行ガイド
Pylons ユーザのための Pyramid 移行ガイドPylons ユーザのための Pyramid 移行ガイド
Pylons ユーザのための Pyramid 移行ガイド
 
3分間 開発環境クッキング 2012.07 #pyfes
3分間 開発環境クッキング 2012.07 #pyfes3分間 開発環境クッキング 2012.07 #pyfes
3分間 開発環境クッキング 2012.07 #pyfes
 
Nseg20120929
Nseg20120929Nseg20120929
Nseg20120929
 
Gitの使い方あれこれ
Gitの使い方あれこれGitの使い方あれこれ
Gitの使い方あれこれ
 
Apache Archiva を試す
Apache Archiva を試すApache Archiva を試す
Apache Archiva を試す
 
Jjug 20140430 gradle_advanced
Jjug 20140430 gradle_advancedJjug 20140430 gradle_advanced
Jjug 20140430 gradle_advanced
 

Similaire à Jenkins plugin memo

実践Go ツールの作成から配布まで
実践Go ツールの作成から配布まで実践Go ツールの作成から配布まで
実践Go ツールの作成から配布までYusuke Miyake
 
Djangoとweb2pyをapacheに組込む
Djangoとweb2pyをapacheに組込むDjangoとweb2pyをapacheに組込む
Djangoとweb2pyをapacheに組込む2bo 2bo
 
#glassfishjp GlassFishとProfiler
#glassfishjp GlassFishとProfiler#glassfishjp GlassFishとProfiler
#glassfishjp GlassFishとProfilerYuji Kubota
 
Introduction to JShell #JavaDayTokyo #jdt_jshell
Introduction to JShell #JavaDayTokyo #jdt_jshellIntroduction to JShell #JavaDayTokyo #jdt_jshell
Introduction to JShell #JavaDayTokyo #jdt_jshellbitter_fox
 
React Native GUIDE
React Native GUIDEReact Native GUIDE
React Native GUIDEdcubeio
 
sbtマルチプロジェクトビルドの使いどころ
sbtマルチプロジェクトビルドの使いどころsbtマルチプロジェクトビルドの使いどころ
sbtマルチプロジェクトビルドの使いどころKazuhiro Hara
 
Scala2.10.x bytecode problems in Android
Scala2.10.x bytecode problems in AndroidScala2.10.x bytecode problems in Android
Scala2.10.x bytecode problems in AndroidTaisuke Oe
 
はてなにおける継続的デプロイメントの現状と Docker の導入
はてなにおける継続的デプロイメントの現状と Docker の導入はてなにおける継続的デプロイメントの現状と Docker の導入
はてなにおける継続的デプロイメントの現状と Docker の導入Yu Nobuoka
 
Hyper → Highspeed → Development
Hyper → Highspeed → DevelopmentHyper → Highspeed → Development
Hyper → Highspeed → Developmentaktsk
 
Mysql casual talks vol4
Mysql casual talks vol4Mysql casual talks vol4
Mysql casual talks vol4matsuo kenji
 
Sqale の Puppet と Chef (と テスト)
Sqale の Puppet と Chef (と テスト)Sqale の Puppet と Chef (と テスト)
Sqale の Puppet と Chef (と テスト)hiboma
 
Firefoxの開発プロセス
Firefoxの開発プロセスFirefoxの開発プロセス
Firefoxの開発プロセスMakoto Kato
 
WildFly Swarm - Rightsize Your Java EE Apps
WildFly Swarm - Rightsize Your Java EE AppsWildFly Swarm - Rightsize Your Java EE Apps
WildFly Swarm - Rightsize Your Java EE AppsYoshimasa Tanabe
 
EC-CUBE + PHPUnit で 実践テスト駆動開発
EC-CUBE + PHPUnit で 実践テスト駆動開発EC-CUBE + PHPUnit で 実践テスト駆動開発
EC-CUBE + PHPUnit で 実践テスト駆動開発Kentaro Ohkouchi
 
Playbay Play 2.0 plugin イロハのイ
Playbay Play 2.0 plugin イロハのイPlaybay Play 2.0 plugin イロハのイ
Playbay Play 2.0 plugin イロハのイKazuhiro Hara
 
JBoss Application Server におけるディレクトリトラバーサルの脆弱性
JBoss Application Server におけるディレクトリトラバーサルの脆弱性JBoss Application Server におけるディレクトリトラバーサルの脆弱性
JBoss Application Server におけるディレクトリトラバーサルの脆弱性JPCERT Coordination Center
 
勉強会 Cvml python基礎
勉強会 Cvml python基礎勉強会 Cvml python基礎
勉強会 Cvml python基礎真哉 杉野
 

Similaire à Jenkins plugin memo (20)

実践Go ツールの作成から配布まで
実践Go ツールの作成から配布まで実践Go ツールの作成から配布まで
実践Go ツールの作成から配布まで
 
Djangoとweb2pyをapacheに組込む
Djangoとweb2pyをapacheに組込むDjangoとweb2pyをapacheに組込む
Djangoとweb2pyをapacheに組込む
 
#glassfishjp GlassFishとProfiler
#glassfishjp GlassFishとProfiler#glassfishjp GlassFishとProfiler
#glassfishjp GlassFishとProfiler
 
Introduction to JShell #JavaDayTokyo #jdt_jshell
Introduction to JShell #JavaDayTokyo #jdt_jshellIntroduction to JShell #JavaDayTokyo #jdt_jshell
Introduction to JShell #JavaDayTokyo #jdt_jshell
 
React Native GUIDE
React Native GUIDEReact Native GUIDE
React Native GUIDE
 
Grails 2.0.0.M1の話
Grails 2.0.0.M1の話 Grails 2.0.0.M1の話
Grails 2.0.0.M1の話
 
sbtマルチプロジェクトビルドの使いどころ
sbtマルチプロジェクトビルドの使いどころsbtマルチプロジェクトビルドの使いどころ
sbtマルチプロジェクトビルドの使いどころ
 
Scala2.10.x bytecode problems in Android
Scala2.10.x bytecode problems in AndroidScala2.10.x bytecode problems in Android
Scala2.10.x bytecode problems in Android
 
はてなにおける継続的デプロイメントの現状と Docker の導入
はてなにおける継続的デプロイメントの現状と Docker の導入はてなにおける継続的デプロイメントの現状と Docker の導入
はてなにおける継続的デプロイメントの現状と Docker の導入
 
Hyper → Highspeed → Development
Hyper → Highspeed → DevelopmentHyper → Highspeed → Development
Hyper → Highspeed → Development
 
Mysql casual talks vol4
Mysql casual talks vol4Mysql casual talks vol4
Mysql casual talks vol4
 
Sqale の Puppet と Chef (と テスト)
Sqale の Puppet と Chef (と テスト)Sqale の Puppet と Chef (と テスト)
Sqale の Puppet と Chef (と テスト)
 
Firefoxの開発プロセス
Firefoxの開発プロセスFirefoxの開発プロセス
Firefoxの開発プロセス
 
WildFly Swarm - Rightsize Your Java EE Apps
WildFly Swarm - Rightsize Your Java EE AppsWildFly Swarm - Rightsize Your Java EE Apps
WildFly Swarm - Rightsize Your Java EE Apps
 
Gradle布教活動
Gradle布教活動Gradle布教活動
Gradle布教活動
 
EC-CUBE + PHPUnit で 実践テスト駆動開発
EC-CUBE + PHPUnit で 実践テスト駆動開発EC-CUBE + PHPUnit で 実践テスト駆動開発
EC-CUBE + PHPUnit で 実践テスト駆動開発
 
Heroku java
Heroku javaHeroku java
Heroku java
 
Playbay Play 2.0 plugin イロハのイ
Playbay Play 2.0 plugin イロハのイPlaybay Play 2.0 plugin イロハのイ
Playbay Play 2.0 plugin イロハのイ
 
JBoss Application Server におけるディレクトリトラバーサルの脆弱性
JBoss Application Server におけるディレクトリトラバーサルの脆弱性JBoss Application Server におけるディレクトリトラバーサルの脆弱性
JBoss Application Server におけるディレクトリトラバーサルの脆弱性
 
勉強会 Cvml python基礎
勉強会 Cvml python基礎勉強会 Cvml python基礎
勉強会 Cvml python基礎
 

Plus de Kiyotaka Oku

Osaka Venture Meetup #3
Osaka Venture Meetup #3Osaka Venture Meetup #3
Osaka Venture Meetup #3Kiyotaka Oku
 
巨大不明ビルドの継続的統合を目的とするビルドパイプラインを主軸とした作戦要綱
巨大不明ビルドの継続的統合を目的とするビルドパイプラインを主軸とした作戦要綱巨大不明ビルドの継続的統合を目的とするビルドパイプラインを主軸とした作戦要綱
巨大不明ビルドの継続的統合を目的とするビルドパイプラインを主軸とした作戦要綱Kiyotaka Oku
 
BaseScriptについて
BaseScriptについてBaseScriptについて
BaseScriptについてKiyotaka Oku
 
ミニ四駆ジャパンカップで勝つ方法を考える
ミニ四駆ジャパンカップで勝つ方法を考えるミニ四駆ジャパンカップで勝つ方法を考える
ミニ四駆ジャパンカップで勝つ方法を考えるKiyotaka Oku
 
GDK48総選挙の裏側
GDK48総選挙の裏側GDK48総選挙の裏側
GDK48総選挙の裏側Kiyotaka Oku
 
Grails/Groovyによる開発事例紹介
Grails/Groovyによる開発事例紹介Grails/Groovyによる開発事例紹介
Grails/Groovyによる開発事例紹介Kiyotaka Oku
 
Griffon不定期便〜G*ワークショップ編〜
Griffon不定期便〜G*ワークショップ編〜Griffon不定期便〜G*ワークショップ編〜
Griffon不定期便〜G*ワークショップ編〜Kiyotaka Oku
 
日本Grails/Groovyユーザーグループ
日本Grails/Groovyユーザーグループ日本Grails/Groovyユーザーグループ
日本Grails/GroovyユーザーグループKiyotaka Oku
 
JJUG CCC 2011 Spring
JJUG CCC 2011 SpringJJUG CCC 2011 Spring
JJUG CCC 2011 SpringKiyotaka Oku
 
Jenkinsプラグインの作り方
Jenkinsプラグインの作り方Jenkinsプラグインの作り方
Jenkinsプラグインの作り方Kiyotaka Oku
 
Jenkins and Groovy
Jenkins and GroovyJenkins and Groovy
Jenkins and GroovyKiyotaka Oku
 
とある断片の超動的言語
とある断片の超動的言語とある断片の超動的言語
とある断片の超動的言語Kiyotaka Oku
 

Plus de Kiyotaka Oku (20)

Osaka Venture Meetup #3
Osaka Venture Meetup #3Osaka Venture Meetup #3
Osaka Venture Meetup #3
 
巨大不明ビルドの継続的統合を目的とするビルドパイプラインを主軸とした作戦要綱
巨大不明ビルドの継続的統合を目的とするビルドパイプラインを主軸とした作戦要綱巨大不明ビルドの継続的統合を目的とするビルドパイプラインを主軸とした作戦要綱
巨大不明ビルドの継続的統合を目的とするビルドパイプラインを主軸とした作戦要綱
 
BaseScriptについて
BaseScriptについてBaseScriptについて
BaseScriptについて
 
javafx-mini4wd
javafx-mini4wdjavafx-mini4wd
javafx-mini4wd
 
ミニ四駆ジャパンカップで勝つ方法を考える
ミニ四駆ジャパンカップで勝つ方法を考えるミニ四駆ジャパンカップで勝つ方法を考える
ミニ四駆ジャパンカップで勝つ方法を考える
 
Spockの基礎
Spockの基礎Spockの基礎
Spockの基礎
 
JUC2012
JUC2012JUC2012
JUC2012
 
GDK48総選挙の裏側
GDK48総選挙の裏側GDK48総選挙の裏側
GDK48総選挙の裏側
 
Jenkins入門
Jenkins入門Jenkins入門
Jenkins入門
 
Grails/Groovyによる開発事例紹介
Grails/Groovyによる開発事例紹介Grails/Groovyによる開発事例紹介
Grails/Groovyによる開発事例紹介
 
Griffon不定期便〜G*ワークショップ編〜
Griffon不定期便〜G*ワークショップ編〜Griffon不定期便〜G*ワークショップ編〜
Griffon不定期便〜G*ワークショップ編〜
 
日本Grails/Groovyユーザーグループ
日本Grails/Groovyユーザーグループ日本Grails/Groovyユーザーグループ
日本Grails/Groovyユーザーグループ
 
GroovyConsole2
GroovyConsole2GroovyConsole2
GroovyConsole2
 
GroovyConsole
GroovyConsoleGroovyConsole
GroovyConsole
 
JJUG CCC 2011 Spring
JJUG CCC 2011 SpringJJUG CCC 2011 Spring
JJUG CCC 2011 Spring
 
Jenkinsプラグインの作り方
Jenkinsプラグインの作り方Jenkinsプラグインの作り方
Jenkinsプラグインの作り方
 
Devsumi Openjam
Devsumi OpenjamDevsumi Openjam
Devsumi Openjam
 
Jenkins and Groovy
Jenkins and GroovyJenkins and Groovy
Jenkins and Groovy
 
とある断片の超動的言語
とある断片の超動的言語とある断片の超動的言語
とある断片の超動的言語
 
Mote Hudson
Mote HudsonMote Hudson
Mote Hudson
 

Jenkins plugin memo

  • 1. Jenkins プラグイン開発 メモ @kiy0taka 13年4月5日金曜日
  • 2. 自己紹介 •奥清隆(おく きよたか) •id:kiy0taka、@kiy0taka ※ 「0」は数字のゼロ •株式会社ニューキャスト所属 •日本Grails/Groovyユーザーグループ •関西Javaエンジニアの会 13年4月5日金曜日
  • 3. プラグイン開発歴(公式) •Terminal •jQuery •jQueryUI •MongoDB •TEPCO •Groovy Remote Control 13年4月5日金曜日
  • 4. プラグイン開発歴(非公式) •Backup •GCrawler •go-con •Xmas •irof 13年4月5日金曜日
  • 5. 多分書きます http://beta.mybetabook.com/b/kiy0taka/Building+Jenkins+plugin+with+Groovy 13年4月5日金曜日
  • 6. プラグインを作る •Apache Jelly •Stapler •Extension Point •http://wiki.jenkins-ci.org/display/ JENKINS/Extension+points 13年4月5日金曜日
  • 7. 前準備 •JDK 1.6以上 •Maven 3.0.4以上が望ましい •好きなIDE 13年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日金曜日
  • 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日金曜日
  • 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日金曜日
  • 27. Jenkinsとの結合テスト •extens HudsonTestCase •@Rule JenkinsRule 13年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 •WithTimeout 13年4月5日金曜日