SlideShare a Scribd company logo
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日金曜日

Recommended for you

Spring Boot概要
Spring Boot概要Spring Boot概要
Spring Boot概要

Java フレームワーク Spring Boot の概要です。 2017/09/16 Webフレームワーク品評会のLTで発表しました。

javaspring bootspring framework
Webサイト・フロントエンドの高速化とgrunt.jsについて
Webサイト・フロントエンドの高速化とgrunt.jsについてWebサイト・フロントエンドの高速化とgrunt.jsについて
Webサイト・フロントエンドの高速化とgrunt.jsについて
開発チームもIaCやってみたい~VSOとDockerの組合せにチャレンジ~
開発チームもIaCやってみたい~VSOとDockerの組合せにチャレンジ~開発チームもIaCやってみたい~VSOとDockerの組合せにチャレンジ~
開発チームもIaCやってみたい~VSOとDockerの組合せにチャレンジ~

「第29回 #TFSUG Visual Studio OnlineでDevOps」のデモの説明用資料です。プレゼンテーションというよりかは操作手順書ですね。

dockervsonlinetfs
多分書きます




             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日金曜日

Recommended for you

実は怖くないDevOps
実は怖くないDevOps実は怖くないDevOps
実は怖くないDevOps

DevOpsのOpsに関する話です。 インフラ側は、本番環境やそれに近い環境でテストする事があります。 しかし、開発側と環境が異なる為に、「あの環境でしか起きない」致命的な不具合に遭遇する事がままあります。 プロジェクトをスムースに回し、製品の品質向上に繋げる為には、インフラ側が「いつから」「何に」気を付ければ良いのでしょうか

devopsserverspecvisual studio online
システム開発を前進させるためのGradle導入法
システム開発を前進させるためのGradle導入法システム開発を前進させるためのGradle導入法
システム開発を前進させるためのGradle導入法

デブサミ2015 Growth! 【20-B-3】「システム開発を前進させるためのGradle導入法」の講演資料です。

gradlejggugdevsumi2015
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

Spring in Summer ハンズオン資料微修正版(回答例付き)です。

#jggug#gradle#jsug_sis
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日金曜日

Recommended for you

CIツールのまとめとSide CI - CIツール勉強会@福岡
CIツールのまとめとSide CI - CIツール勉強会@福岡CIツールのまとめとSide CI - CIツール勉強会@福岡
CIツールのまとめとSide CI - CIツール勉強会@福岡

CIツール勉強会@福岡 (2015/03/13 19:30〜)で発表した内容のスライド資料です。CIツールについてまとめてみました。

sidecicicircleci
Gradleどうでしょう
GradleどうでしょうGradleどうでしょう
Gradleどうでしょう

G*ワークショップ Z 札幌 2014 のスライドです。 某書の抜粋的な何かです。

gradlegroovyjava
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

Bundler kanazawa.rb meetup #2 2012/09/19

bundler kanazawa.rb
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日金曜日

Recommended for you

AsyncTask アンチパターン
AsyncTask アンチパターンAsyncTask アンチパターン
AsyncTask アンチパターン

Slides at Android Anti-pattern Session held on 2014-12-04

Jjug 20140430 gradle_basic
Jjug 20140430 gradle_basicJjug 20140430 gradle_basic
Jjug 20140430 gradle_basic

2014/4/30 JJUGナイトセミナーでの資料です。

jggugjjuggroovy
Pylons ユーザのための Pyramid 移行ガイド
Pylons ユーザのための Pyramid 移行ガイドPylons ユーザのための Pyramid 移行ガイド
Pylons ユーザのための Pyramid 移行ガイド
プロセス実行

   // コマンド
   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日金曜日

Recommended for you

3分間 開発環境クッキング 2012.07 #pyfes
3分間 開発環境クッキング 2012.07 #pyfes3分間 開発環境クッキング 2012.07 #pyfes
3分間 開発環境クッキング 2012.07 #pyfes
chefcontinuous delivery継続的デリバリー
Nseg20120929
Nseg20120929Nseg20120929
Nseg20120929
Gitの使い方あれこれ
Gitの使い方あれこれGitの使い方あれこれ
Gitの使い方あれこれ

2011年10月1日のminami.rbの第9回勉強会で発表したgitのtipsのプレゼン資料です。

git
Jelly

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



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



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

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

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

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

13年4月5日金曜日

Recommended for you

Apache Archiva を試す
Apache Archiva を試すApache Archiva を試す
Apache Archiva を試す

Apache Archiva を試してみたので、そのメモ。 Apache Archiva はリポジトリ管理ソフトウェア。Maven リポジトリの管理を行う。インハウスリポジトリとして、.jarのキャッシュや、自作リポジトリのデプロイなどができる。

apacheapache archivajava
Jjug 20140430 gradle_advanced
Jjug 20140430 gradle_advancedJjug 20140430 gradle_advanced
Jjug 20140430 gradle_advanced

2014/04/30 (水) 19:00 - 21:00 JJUG&JGGUG 共催ナイトセミナ 「4.30 2時間で分かる!次世代ビルドツールの本命Gradleの全貌」 「発展編」 会社で使うGradle

gradle
実践Go ツールの作成から配布まで
実践Go ツールの作成から配布まで実践Go ツールの作成から配布まで
実践Go ツールの作成から配布まで

Fukuoka.go#2の入門LTです http://connpass.com/event/7559/

golang
マイグレーション

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

Recommended for you

Djangoとweb2pyをapacheに組込む
Djangoとweb2pyをapacheに組込むDjangoとweb2pyをapacheに組込む
Djangoとweb2pyをapacheに組込む
#glassfishjp GlassFishとProfiler
#glassfishjp GlassFishとProfiler#glassfishjp GlassFishとProfiler
#glassfishjp GlassFishとProfiler

#glassfishjp 2012/09/24の発表資料。

profilerglassfishjpglassfish
Introduction to JShell #JavaDayTokyo #jdt_jshell
Introduction to JShell #JavaDayTokyo #jdt_jshellIntroduction to JShell #JavaDayTokyo #jdt_jshell
Introduction to JShell #JavaDayTokyo #jdt_jshell

Introduction to JShell: Official REPL tool for Java Platform

jdt_jshelljava9jshell
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日金曜日

More Related Content

What's hot

What makes pyramid unique
What makes pyramid uniqueWhat makes pyramid unique
What makes pyramid unique
Atsushi Odagiri
 
Gitのよく使うコマンド
Gitのよく使うコマンドGitのよく使うコマンド
Gitのよく使うコマンド
YUKI Kaoru
 
Maven2 plugin
Maven2 pluginMaven2 plugin
Maven2 plugin
Funato Takashi
 
Spring Boot概要
Spring Boot概要Spring Boot概要
Spring Boot概要
af not found
 
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
 
実は怖くないDevOps
実は怖くないDevOps実は怖くないDevOps
実は怖くないDevOps
Masanori Ishigami
 
システム開発を前進させるための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-withanswers
Takuma 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/19
Hitoshi Kurokawa
 
AsyncTask アンチパターン
AsyncTask アンチパターンAsyncTask アンチパターン
AsyncTask アンチパターン
Hiroshi Kurokawa
 
Jjug 20140430 gradle_basic
Jjug 20140430 gradle_basicJjug 20140430 gradle_basic
Jjug 20140430 gradle_basic
Takuma 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 #pyfes
Takeshi Komiya
 
Nseg20120929
Nseg20120929Nseg20120929
Nseg20120929
hiro345
 
Gitの使い方あれこれ
Gitの使い方あれこれGitの使い方あれこれ
Gitの使い方あれこれ
よしだ あつし
 
Apache Archiva を試す
Apache Archiva を試すApache Archiva を試す
Apache Archiva を試す
bouzuya
 
Jjug 20140430 gradle_advanced
Jjug 20140430 gradle_advancedJjug 20140430 gradle_advanced
Jjug 20140430 gradle_advanced
Masatoshi Hayashi
 

What's hot (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
 

Similar to 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とProfiler
Yuji Kubota
 
Introduction to JShell #JavaDayTokyo #jdt_jshell
Introduction to JShell #JavaDayTokyo #jdt_jshellIntroduction to JShell #JavaDayTokyo #jdt_jshell
Introduction to JShell #JavaDayTokyo #jdt_jshell
bitter_fox
 
React Native GUIDE
React Native GUIDEReact Native GUIDE
React Native GUIDE
dcubeio
 
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 Android
Taisuke Oe
 
はてなにおける継続的デプロイメントの現状と Docker の導入
はてなにおける継続的デプロイメントの現状と Docker の導入はてなにおける継続的デプロイメントの現状と Docker の導入
はてなにおける継続的デプロイメントの現状と Docker の導入
Yu Nobuoka
 
Hyper → Highspeed → Development
Hyper → Highspeed → DevelopmentHyper → Highspeed → Development
Hyper → Highspeed → Development
aktsk
 
Mysql casual talks vol4
Mysql casual talks vol4Mysql casual talks vol4
Mysql casual talks vol4
matsuo 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 Apps
Yoshimasa Tanabe
 
Gradle布教活動
Gradle布教活動Gradle布教活動
Gradle布教活動
Nemoto Yusuke
 
EC-CUBE + PHPUnit で 実践テスト駆動開発
EC-CUBE + PHPUnit で 実践テスト駆動開発EC-CUBE + PHPUnit で 実践テスト駆動開発
EC-CUBE + PHPUnit で 実践テスト駆動開発
Kentaro Ohkouchi
 
Heroku java
Heroku javaHeroku java
Heroku java
Kazuyuki Kawamura
 
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基礎
真哉 杉野
 

Similar to 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基礎
 

More from Kiyotaka Oku

Osaka Venture Meetup #3
Osaka Venture Meetup #3Osaka Venture Meetup #3
Osaka Venture Meetup #3
Kiyotaka 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
 
GroovyConsole2
GroovyConsole2GroovyConsole2
GroovyConsole2
Kiyotaka Oku
 
GroovyConsole
GroovyConsoleGroovyConsole
GroovyConsole
Kiyotaka Oku
 
JJUG CCC 2011 Spring
JJUG CCC 2011 SpringJJUG CCC 2011 Spring
JJUG CCC 2011 Spring
Kiyotaka Oku
 
Jenkinsプラグインの作り方
Jenkinsプラグインの作り方Jenkinsプラグインの作り方
Jenkinsプラグインの作り方
Kiyotaka Oku
 
Jenkins and Groovy
Jenkins and GroovyJenkins and Groovy
Jenkins and Groovy
Kiyotaka Oku
 
とある断片の超動的言語
とある断片の超動的言語とある断片の超動的言語
とある断片の超動的言語
Kiyotaka Oku
 

More from 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日金曜日