Hudson以外の何か with 任意

Preview:

Citation preview

Hudson以外の何か with 任意

bleis-tift

May 28, 2011

自己紹介

id:bleis-tift / @bleis

名古屋で働くプログラマGitとか Jenkinsとかが好物F#とか Scalaも大好き

自己紹介

id:bleis-tift / @bleis

名古屋で働くプログラマ

Gitとか Jenkinsとかが好物F#とか Scalaも大好き

自己紹介

id:bleis-tift / @bleis

名古屋で働くプログラマGitとか Jenkinsとかが好物

F#とか Scalaも大好き

自己紹介

id:bleis-tift / @bleis

名古屋で働くプログラマGitとか Jenkinsとかが好物F#とか Scalaも大好き

自己紹介

自己紹介

今日話すこと

.

. .1 CIの完了通知

デモ

.

.

.

2 中身の話

大事なのはデモまでです。

それ以降はPerlとかGitとかGroovyとかRubyとかF#とか伺かとかの話を時間が許すまでします。

今日話すこと

.

. .1 CIの完了通知

デモ

.

.

.

2 中身の話

大事なのはデモまでです。

それ以降はPerlとかGitとかGroovyとかRubyとかF#とか伺かとかの話を時間が許すまでします。

今日話すこと

.

. .1 CIの完了通知

デモ

.

.

.

2 中身の話

大事なのはデモまでです。

それ以降はPerlとかGitとかGroovyとかRubyとかF#とか伺かとかの話を時間が許すまでします。

きのこ本

きのこ 51

プロジェクト自身にしゃべらせる

XFD(eXtreme Feedback Device)とかを使ってCIの結果を伝える、ということ

きのこ本

きのこ 51

プロジェクト自身にしゃべらせる

XFD(eXtreme Feedback Device)とかを使ってCIの結果を伝える、ということ

XFD

XFD

XFD

CI

Continuous Integration(継続的インテグレーション)commit(push)のたびにコンパイルやテストを行い、自分の作業で何かまずいことをやっていないか素早くフィードバックこの発表では Jenkinsを使います

CI

Continuous Integration(継続的インテグレーション)

commit(push)のたびにコンパイルやテストを行い、自分の作業で何かまずいことをやっていないか素早くフィードバックこの発表では Jenkinsを使います

CI

Continuous Integration(継続的インテグレーション)commit(push)のたびにコンパイルやテストを行い、自分の作業で何かまずいことをやっていないか素早くフィードバック

この発表では Jenkinsを使います

CI

Continuous Integration(継続的インテグレーション)commit(push)のたびにコンパイルやテストを行い、自分の作業で何かまずいことをやっていないか素早くフィードバックこの発表では Jenkinsを使います

CIだけでは満足できない

壊れたことは検知できるけど、そもそも壊したくない

最新版をとってきたらコンパイルできない最新版をとってきたらテストに失敗するこんなのぜったいおかしいよ

何かを壊すような変更はRejectしたい!

CIだけでは満足できない

壊れたことは検知できるけど、そもそも壊したくない

最新版をとってきたらコンパイルできない最新版をとってきたらテストに失敗するこんなのぜったいおかしいよ

何かを壊すような変更はRejectしたい!

CIだけでは満足できない

壊れたことは検知できるけど、そもそも壊したくない

最新版をとってきたらコンパイルできない

最新版をとってきたらテストに失敗するこんなのぜったいおかしいよ

何かを壊すような変更はRejectしたい!

CIだけでは満足できない

壊れたことは検知できるけど、そもそも壊したくない

最新版をとってきたらコンパイルできない最新版をとってきたらテストに失敗する

こんなのぜったいおかしいよ

何かを壊すような変更はRejectしたい!

CIだけでは満足できない

壊れたことは検知できるけど、そもそも壊したくない

最新版をとってきたらコンパイルできない最新版をとってきたらテストに失敗するこんなのぜったいおかしいよ

何かを壊すような変更はRejectしたい!

CIだけでは満足できない

壊れたことは検知できるけど、そもそも壊したくない

最新版をとってきたらコンパイルできない最新版をとってきたらテストに失敗するこんなのぜったいおかしいよ

何かを壊すような変更はRejectしたい!

こんなのがいい

最新版は常にビルドできる最新版は常にテストが通る壊れたものは反映されない

これができたら素敵!

こんなのがいい

最新版は常にビルドできる

最新版は常にテストが通る壊れたものは反映されない

これができたら素敵!

こんなのがいい

最新版は常にビルドできる最新版は常にテストが通る

壊れたものは反映されない

これができたら素敵!

こんなのがいい

最新版は常にビルドできる最新版は常にテストが通る壊れたものは反映されない

これができたら素敵!

こんなのがいい

最新版は常にビルドできる最新版は常にテストが通る壊れたものは反映されない

これができたら素敵!

実現してみた

きれいなリポジトリ

簡単に言うと、

Private System Buildをサーバ側で勝手に行ってくれる仕組み

きれいなリポジトリ

簡単に言うと、

Private System Buildをサーバ側で勝手に行ってくれる仕組み

問題点

フィードバックをどうするか?

問題点

問題点

フィードバックをどうするか?

ブラウザに張り付く→

だるいメール、IM→見ないRSS→リアルタイム性に欠けるXFD→Private System Buildを大々的に通知されてもウザいだけ

リアルタイム性に優れた通知方法はないものか・・・

問題点

フィードバックをどうするか?ブラウザに張り付く→

だるい

メール、IM→見ないRSS→リアルタイム性に欠けるXFD→Private System Buildを大々的に通知されてもウザいだけ

リアルタイム性に優れた通知方法はないものか・・・

問題点

フィードバックをどうするか?ブラウザに張り付く→だるい

メール、IM→

見ないRSS→リアルタイム性に欠けるXFD→Private System Buildを大々的に通知されてもウザいだけ

リアルタイム性に優れた通知方法はないものか・・・

問題点

フィードバックをどうするか?ブラウザに張り付く→だるいメール、IM→

見ない

RSS→リアルタイム性に欠けるXFD→Private System Buildを大々的に通知されてもウザいだけ

リアルタイム性に優れた通知方法はないものか・・・

問題点

フィードバックをどうするか?ブラウザに張り付く→だるいメール、IM→見ない

RSS→

リアルタイム性に欠けるXFD→Private System Buildを大々的に通知されてもウザいだけ

リアルタイム性に優れた通知方法はないものか・・・

問題点

フィードバックをどうするか?ブラウザに張り付く→だるいメール、IM→見ないRSS→

リアルタイム性に欠ける

XFD→Private System Buildを大々的に通知されてもウザいだけ

リアルタイム性に優れた通知方法はないものか・・・

問題点

フィードバックをどうするか?ブラウザに張り付く→だるいメール、IM→見ないRSS→リアルタイム性に欠ける

XFD→

Private System Buildを大々的に通知されてもウザいだけ

リアルタイム性に優れた通知方法はないものか・・・

問題点

フィードバックをどうするか?ブラウザに張り付く→だるいメール、IM→見ないRSS→リアルタイム性に欠けるXFD→

Private System Buildを大々的に通知されてもウザいだけ

リアルタイム性に優れた通知方法はないものか・・・

問題点

フィードバックをどうするか?ブラウザに張り付く→だるいメール、IM→見ないRSS→リアルタイム性に欠けるXFD→Private System Buildを大々的に通知されてもウザいだけ

リアルタイム性に優れた通知方法はないものか・・・

問題点

フィードバックをどうするか?ブラウザに張り付く→だるいメール、IM→見ないRSS→リアルタイム性に欠けるXFD→Private System Buildを大々的に通知されてもウザいだけ

リアルタイム性に優れた通知方法はないものか・・・

なければ作ればいいじゃない!

リアルタイム性があってウザくなくて何かあったら絶対にみてしゃべるもの・・・

伺かしか!異論は認めますが受け付けません

なければ作ればいいじゃない!

リアルタイム性があって

ウザくなくて何かあったら絶対にみてしゃべるもの・・・

伺かしか!異論は認めますが受け付けません

なければ作ればいいじゃない!

リアルタイム性があってウザくなくて

何かあったら絶対にみてしゃべるもの・・・

伺かしか!異論は認めますが受け付けません

なければ作ればいいじゃない!

リアルタイム性があってウザくなくて何かあったら絶対にみて

しゃべるもの・・・

伺かしか!異論は認めますが受け付けません

なければ作ればいいじゃない!

リアルタイム性があってウザくなくて何かあったら絶対にみてしゃべるもの・・・

伺かしか!異論は認めますが受け付けません

なければ作ればいいじゃない!

リアルタイム性があってウザくなくて何かあったら絶対にみてしゃべるもの・・・

伺かしか!

異論は認めますが受け付けません

なければ作ればいいじゃない!

リアルタイム性があってウザくなくて何かあったら絶対にみてしゃべるもの・・・

伺かしか!異論は認めますが受け付けません

伺か?

デスクトップマスコットです。もちろんみなさん使ってますよね?俺は最近また使い始めました。

伺か?

デスクトップマスコットです。もちろんみなさん使ってますよね?俺は最近また使い始めました。

伺か?

デスクトップマスコットです。

もちろんみなさん使ってますよね?俺は最近また使い始めました。

伺か?

デスクトップマスコットです。もちろんみなさん使ってますよね?

俺は最近また使い始めました。

伺か?

デスクトップマスコットです。もちろんみなさん使ってますよね?俺は最近また使い始めました。

どうやってしゃべらせるの?

SSTP Sakura Script Tranfer Protocol

Secure Socket Tunneling Protocolじゃないよ!伺かに SSTPを投げるとしゃべらせたり色々できる

どうやってしゃべらせるの?

SSTP Sakura Script Tranfer ProtocolSecure Socket Tunneling Protocolじゃないよ!

伺かに SSTPを投げるとしゃべらせたり色々できる

どうやってしゃべらせるの?

SSTP Sakura Script Tranfer ProtocolSecure Socket Tunneling Protocolじゃないよ!伺かに SSTPを投げるとしゃべらせたり色々できる

SSTP

SSTP

SSTP

SSTP

全体概要

全体概要

1. push

1. push

pushをトリガーにCIのジョブをキック

Gitのフックスクリプトを使用シェルスクリプトとPerl

→Gitを入れるとPerlは絶対入っているのでPerlならどんな環境でも使える

1. push

pushをトリガーにCIのジョブをキックGitのフックスクリプトを使用

シェルスクリプトとPerl

→Gitを入れるとPerlは絶対入っているのでPerlならどんな環境でも使える

1. push

pushをトリガーにCIのジョブをキックGitのフックスクリプトを使用シェルスクリプトとPerl

→Gitを入れるとPerlは絶対入っているのでPerlならどんな環境でも使える

1. push

pushをトリガーにCIのジョブをキックGitのフックスクリプトを使用シェルスクリプトとPerl→Gitを入れるとPerlは絶対入っているのでPerlならどんな環境でも使える

2. CI

3. 通知

3. 通知

Notification Pluginはビルドの開始しか通知できない

Groovy Postbuild Pluginはビルドが終わった後に動くので、何でもできるGroovyのRuntimeは Jenkinsに同梱されているため自分で用意する必要なし

3. 通知

Notification Pluginはビルドの開始しか通知できないGroovy Postbuild Pluginはビルドが終わった後に動くので、何でもできる

GroovyのRuntimeは Jenkinsに同梱されているため自分で用意する必要なし

3. 通知

Notification Pluginはビルドの開始しか通知できないGroovy Postbuild Pluginはビルドが終わった後に動くので、何でもできるGroovyのRuntimeは Jenkinsに同梱されているため自分で用意する必要なし

4. 通知

4. 通知

JenkinsはWindows上で動いている

サービスとして動かす必要がある

cygrunsrvを使うと簡単にサービスが作れる!RubyなのはPerlとPythonよりも慣れているから標準ライブラリだけでTCPサーバ/クライアントが 100行以下

4. 通知

JenkinsはWindows上で動いているサービスとして動かす必要がある

cygrunsrvを使うと簡単にサービスが作れる!

RubyなのはPerlとPythonよりも慣れているから標準ライブラリだけでTCPサーバ/クライアントが 100行以下

4. 通知

JenkinsはWindows上で動いているサービスとして動かす必要があるcygrunsrvを使うと簡単にサービスが作れる!

RubyなのはPerlとPythonよりも慣れているから標準ライブラリだけでTCPサーバ/クライアントが 100行以下

4. 通知

JenkinsはWindows上で動いているサービスとして動かす必要があるcygrunsrvを使うと簡単にサービスが作れる!RubyなのはPerlとPythonよりも慣れているから

標準ライブラリだけでTCPサーバ/クライアントが 100行以下

4. 通知

JenkinsはWindows上で動いているサービスとして動かす必要があるcygrunsrvを使うと簡単にサービスが作れる!RubyなのはPerlとPythonよりも慣れているから標準ライブラリだけでTCPサーバ/クライアントが 100行以下

5. 情報の取得/6. 通知

5. 情報の取得/6. 通知

通知されるのは Job名とBuild番号のみで、具体的な情報は取りに行く

Rubyであんまゴリゴリ書きたくなかったScalaとF#の二択だけど、JVM常時起動とかあんまりしたくないので F#

5. 情報の取得/6. 通知

通知されるのは Job名とBuild番号のみで、具体的な情報は取りに行くRubyであんまゴリゴリ書きたくなかった

ScalaとF#の二択だけど、JVM常時起動とかあんまりしたくないので F#

5. 情報の取得/6. 通知

通知されるのは Job名とBuild番号のみで、具体的な情報は取りに行くRubyであんまゴリゴリ書きたくなかったScalaとF#の二択だけど、JVM常時起動とかあんまりしたくないので F#

どうやって通知してるの?

Ruby側で IPのリストを保持して、そこに対して通知F#側で 1時間ごとにどの Jobを通知してほしいかリクエストを出すRuby側は3時間リクエストが来ない IPを削除

どうやって通知してるの?

Ruby側で IPのリストを保持して、そこに対して通知

F#側で 1時間ごとにどの Jobを通知してほしいかリクエストを出すRuby側は3時間リクエストが来ない IPを削除

どうやって通知してるの?

Ruby側で IPのリストを保持して、そこに対して通知F#側で 1時間ごとにどの Jobを通知してほしいかリクエストを出す

Ruby側は3時間リクエストが来ない IPを削除

どうやって通知してるの?

Ruby側で IPのリストを保持して、そこに対して通知F#側で 1時間ごとにどの Jobを通知してほしいかリクエストを出すRuby側は3時間リクエストが来ない IPを削除

デモ

・・・ふぅ

以降ほとんど蛇足です。

bleis-tiftの取り留めもない話をお楽しみください。

以降ほとんど蛇足です。bleis-tiftの取り留めもない話をお楽しみください。

F#部分の設定

設定画面作るの面倒F#のコードで設定すればいいんじゃね?という同僚まえしぃ☆ですよねー

F#部分の設定

設定画面作るの面倒

F#のコードで設定すればいいんじゃね?という同僚まえしぃ☆ですよねー

F#部分の設定

設定画面作るの面倒F#のコードで設定すればいいんじゃね?という同僚まえしぃ☆

ですよねー

F#部分の設定

設定画面作るの面倒F#のコードで設定すればいいんじゃね?という同僚まえしぃ☆ですよねー

F#のコード片を動的に実行

.

こんな感じ

.

.

.

use provider = new FSharpCodeProvider()

let src = "module Temp\n\

let body (arg: " + argType + "): " +

retType + " =\n" + expr

let param = CompilerParameters(

GenerateInMemory=true)

let res = provider

.CompileAssemblyFromSource(param, src)

let asm = res.CompiledAssembly

let t = asm.GetType("Temp")

t.GetMethod("body").Invoke(null, arg)

F#のコード片を動的に実行

.

こんな感じ

.

.

.

use provider = new FSharpCodeProvider()

let src = "module Temp\n\

let body (arg: " + argType + "): " +

retType + " =\n" + expr

let param = CompilerParameters(

GenerateInMemory=true)

let res = provider

.CompileAssemblyFromSource(param, src)

let asm = res.CompiledAssembly

let t = asm.GetType("Temp")

t.GetMethod("body").Invoke(null, arg)

デモ

うーん・・・

コンソールっぽいものを作らないと使い物にならない・・・

まえしぃ☆「fsi使えればいいんじゃね?」

そ れ だ !

うーん・・・

コンソールっぽいものを作らないと使い物にならない・・・まえしぃ☆「fsi使えればいいんじゃね?」

そ れ だ !

うーん・・・

コンソールっぽいものを作らないと使い物にならない・・・まえしぃ☆「fsi使えればいいんじゃね?」

そ れ だ !

fsiでアプリケーションを操作

-rオプションを使えば fsi.exeに dllを読み込ませることができるこれで必要な dll読み込ませたら、fsiから各種設定できる!慣れ親しんだREPLの機能が使える!!みんなハッピー!!!

fsiでアプリケーションを操作

-rオプションを使えば fsi.exeに dllを読み込ませることができる

これで必要な dll読み込ませたら、fsiから各種設定できる!慣れ親しんだREPLの機能が使える!!みんなハッピー!!!

fsiでアプリケーションを操作

-rオプションを使えば fsi.exeに dllを読み込ませることができるこれで必要な dll読み込ませたら、fsiから各種設定できる!

慣れ親しんだREPLの機能が使える!!みんなハッピー!!!

fsiでアプリケーションを操作

-rオプションを使えば fsi.exeに dllを読み込ませることができるこれで必要な dll読み込ませたら、fsiから各種設定できる!慣れ親しんだREPLの機能が使える!!

みんなハッピー!!!

fsiでアプリケーションを操作

-rオプションを使えば fsi.exeに dllを読み込ませることができるこれで必要な dll読み込ませたら、fsiから各種設定できる!慣れ親しんだREPLの機能が使える!!みんなハッピー!!!

fsiのオプション

–lib:path dllを検索するディレクトリの指定-r asmfile 参照に追加する dllの指定–use:file fsi起動時に読み込むプログラムの指定

これを使って、fsi起動時に

起動元プログラムのパスを libに指定起動元プログラムとやり取りを行うための dllを rに指定モジュールの openと、設定を取得するだけのプログラムを useに指定

fsiのオプション

–lib:path dllを検索するディレクトリの指定

-r asmfile 参照に追加する dllの指定–use:file fsi起動時に読み込むプログラムの指定

これを使って、fsi起動時に

起動元プログラムのパスを libに指定起動元プログラムとやり取りを行うための dllを rに指定モジュールの openと、設定を取得するだけのプログラムを useに指定

fsiのオプション

–lib:path dllを検索するディレクトリの指定-r asmfile 参照に追加する dllの指定

–use:file fsi起動時に読み込むプログラムの指定

これを使って、fsi起動時に

起動元プログラムのパスを libに指定起動元プログラムとやり取りを行うための dllを rに指定モジュールの openと、設定を取得するだけのプログラムを useに指定

fsiのオプション

–lib:path dllを検索するディレクトリの指定-r asmfile 参照に追加する dllの指定–use:file fsi起動時に読み込むプログラムの指定

これを使って、fsi起動時に

起動元プログラムのパスを libに指定起動元プログラムとやり取りを行うための dllを rに指定モジュールの openと、設定を取得するだけのプログラムを useに指定

fsiのオプション

–lib:path dllを検索するディレクトリの指定-r asmfile 参照に追加する dllの指定–use:file fsi起動時に読み込むプログラムの指定

これを使って、fsi起動時に

起動元プログラムのパスを libに指定起動元プログラムとやり取りを行うための dllを rに指定モジュールの openと、設定を取得するだけのプログラムを useに指定

fsiのオプション

–lib:path dllを検索するディレクトリの指定-r asmfile 参照に追加する dllの指定–use:file fsi起動時に読み込むプログラムの指定

これを使って、fsi起動時に起動元プログラムのパスを libに指定

起動元プログラムとやり取りを行うための dllを rに指定モジュールの openと、設定を取得するだけのプログラムを useに指定

fsiのオプション

–lib:path dllを検索するディレクトリの指定-r asmfile 参照に追加する dllの指定–use:file fsi起動時に読み込むプログラムの指定

これを使って、fsi起動時に起動元プログラムのパスを libに指定起動元プログラムとやり取りを行うための dllを rに指定

モジュールの openと、設定を取得するだけのプログラムを useに指定

fsiのオプション

–lib:path dllを検索するディレクトリの指定-r asmfile 参照に追加する dllの指定–use:file fsi起動時に読み込むプログラムの指定

これを使って、fsi起動時に起動元プログラムのパスを libに指定起動元プログラムとやり取りを行うための dllを rに指定モジュールの openと、設定を取得するだけのプログラムを useに指定

起動元プログラムとのやり取り

起動元プログラムとのやり取り

設定の取得

設定の取得

設定の取得

設定の取得

設定の取得

設定の取得

設定の反映

設定の反映

設定の反映

設定の反映

設定の反映

デモ

結論

GUIなんていらんかったんや・・・

結論

GUIなんていらんかったんや・・・

Gitのフックスクリプト

Gitに限らず、DVCSのフックスクリプトには配布の問題がある基本的にはリポジトリの作成時にテンプレートからコピーされるので、スクリプトの更新に弱い「多人数開発でGitを使う場合の環境構築」というエントリ「間接的に使えばいいじゃない!」という解決策

Gitのフックスクリプト

Gitに限らず、DVCSのフックスクリプトには配布の問題がある

基本的にはリポジトリの作成時にテンプレートからコピーされるので、スクリプトの更新に弱い「多人数開発でGitを使う場合の環境構築」というエントリ「間接的に使えばいいじゃない!」という解決策

Gitのフックスクリプト

Gitに限らず、DVCSのフックスクリプトには配布の問題がある基本的にはリポジトリの作成時にテンプレートからコピーされるので、スクリプトの更新に弱い

「多人数開発でGitを使う場合の環境構築」というエントリ「間接的に使えばいいじゃない!」という解決策

Gitのフックスクリプト

Gitに限らず、DVCSのフックスクリプトには配布の問題がある基本的にはリポジトリの作成時にテンプレートからコピーされるので、スクリプトの更新に弱い「多人数開発でGitを使う場合の環境構築」というエントリ「間接的に使えばいいじゃない!」という解決策

こんな感じ

こんな感じ

こんな感じ

発展させてみた

全てのフックに対応フック管理用コマンドインストール用スクリプト

わりと便利。

発展させてみた

全てのフックに対応

フック管理用コマンドインストール用スクリプト

わりと便利。

発展させてみた

全てのフックに対応フック管理用コマンド

インストール用スクリプト

わりと便利。

発展させてみた

全てのフックに対応フック管理用コマンドインストール用スクリプト

わりと便利。

発展させてみた

全てのフックに対応フック管理用コマンドインストール用スクリプト

わりと便利。

フック管理用コマンドでできること

フックの一覧表示現在のリポジトリで有効化なフック一覧現在のリポジトリで無効化なフック一覧フックスクリプトの有効化フックスクリプトの無効化フックスクリプトの更新

フック管理用コマンドでできること

フックの一覧表示現在のリポジトリで有効化なフック一覧現在のリポジトリで無効化なフック一覧フックスクリプトの有効化フックスクリプトの無効化フックスクリプトの更新

コード

http://github.com/bleis-tift/Git-Hooks で公開してます。これの rewriteブランチが今回紹介したやつ。

コード

http://github.com/bleis-tift/Git-Hooks で公開してます。

これの rewriteブランチが今回紹介したやつ。

コード

http://github.com/bleis-tift/Git-Hooks で公開してます。これの rewriteブランチが今回紹介したやつ。

Groovy Postbuild Plugin

Jenkinsの中で一番気に入っているプラグインJenkinsを使っている人は、このプラグインのためだけだとしてもGroovy使えるようになるべき今までPost build taskというプラグインと外部プログラムを使ってやっていたことをこいつで置き換えた結果、Jobの管理がしやすくなり、正確さも増し、機能も強化できた

Groovy Postbuild Plugin

Jenkinsの中で一番気に入っているプラグイン

Jenkinsを使っている人は、このプラグインのためだけだとしてもGroovy使えるようになるべき今までPost build taskというプラグインと外部プログラムを使ってやっていたことをこいつで置き換えた結果、Jobの管理がしやすくなり、正確さも増し、機能も強化できた

Groovy Postbuild Plugin

Jenkinsの中で一番気に入っているプラグインJenkinsを使っている人は、このプラグインのためだけだとしてもGroovy使えるようになるべき

今までPost build taskというプラグインと外部プログラムを使ってやっていたことをこいつで置き換えた結果、Jobの管理がしやすくなり、正確さも増し、機能も強化できた

Groovy Postbuild Plugin

Jenkinsの中で一番気に入っているプラグインJenkinsを使っている人は、このプラグインのためだけだとしてもGroovy使えるようになるべき今までPost build taskというプラグインと外部プログラムを使ってやっていたことをこいつで置き換えた

結果、Jobの管理がしやすくなり、正確さも増し、機能も強化できた

Groovy Postbuild Plugin

Jenkinsの中で一番気に入っているプラグインJenkinsを使っている人は、このプラグインのためだけだとしてもGroovy使えるようになるべき今までPost build taskというプラグインと外部プログラムを使ってやっていたことをこいつで置き換えた結果、Jobの管理がしやすくなり、正確さも増し、機能も強化できた

何ができるん?

成功したビルドを失敗させたり外部のプロセス起動したりとにかくなんでもできますmanager.hudson(!)/manager.build

何ができるん?

成功したビルドを失敗させたり

外部のプロセス起動したりとにかくなんでもできますmanager.hudson(!)/manager.build

何ができるん?

成功したビルドを失敗させたり外部のプロセス起動したり

とにかくなんでもできますmanager.hudson(!)/manager.build

何ができるん?

成功したビルドを失敗させたり外部のプロセス起動したりとにかくなんでもできます

manager.hudson(!)/manager.build

何ができるん?

成功したビルドを失敗させたり外部のプロセス起動したりとにかくなんでもできますmanager.hudson(!)/manager.build

Groovy?

JVM上で動作する動的型付けのスクリプト言語JVM上で動作するアプリケーションと連携させるといい感じかも?今のところ Jenkins以外で使おうとは思わないそれ Scalaで

Groovy?

JVM上で動作する

動的型付けのスクリプト言語JVM上で動作するアプリケーションと連携させるといい感じかも?今のところ Jenkins以外で使おうとは思わないそれ Scalaで

Groovy?

JVM上で動作する動的型付けのスクリプト言語

JVM上で動作するアプリケーションと連携させるといい感じかも?今のところ Jenkins以外で使おうとは思わないそれ Scalaで

Groovy?

JVM上で動作する動的型付けのスクリプト言語JVM上で動作するアプリケーションと連携させるといい感じかも?

今のところ Jenkins以外で使おうとは思わないそれ Scalaで

Groovy?

JVM上で動作する動的型付けのスクリプト言語JVM上で動作するアプリケーションと連携させるといい感じかも?今のところ Jenkins以外で使おうとは思わない

それ Scalaで

Groovy?

JVM上で動作する動的型付けのスクリプト言語JVM上で動作するアプリケーションと連携させるといい感じかも?今のところ Jenkins以外で使おうとは思わないそれ Scalaで

push or reset

ビルドが成功したら push、失敗したら resetする必要がある。

push or reset

push or reset

push or reset

ビルドが成功したら push、失敗したら resetする必要がある。正確には、

ビルドが失敗したら resetして、ビルドは失敗ビルドが成功したら push

pushに成功したらビルドは成功pushに失敗したらビルドは失敗

最新版を取得しなおして、マージしてから再pushする必要がある

push or reset

ビルドが成功したら push、失敗したら resetする必要がある。正確には、

ビルドが失敗したら resetして、ビルドは失敗

ビルドが成功したら push

pushに成功したらビルドは成功pushに失敗したらビルドは失敗

最新版を取得しなおして、マージしてから再pushする必要がある

push or reset

ビルドが成功したら push、失敗したら resetする必要がある。正確には、

ビルドが失敗したら resetして、ビルドは失敗ビルドが成功したら push

pushに成功したらビルドは成功pushに失敗したらビルドは失敗

最新版を取得しなおして、マージしてから再pushする必要がある

push or reset

ビルドが成功したら push、失敗したら resetする必要がある。正確には、

ビルドが失敗したら resetして、ビルドは失敗ビルドが成功したら push

pushに成功したらビルドは成功

pushに失敗したらビルドは失敗

最新版を取得しなおして、マージしてから再pushする必要がある

push or reset

ビルドが成功したら push、失敗したら resetする必要がある。正確には、

ビルドが失敗したら resetして、ビルドは失敗ビルドが成功したら push

pushに成功したらビルドは成功pushに失敗したらビルドは失敗

最新版を取得しなおして、マージしてから再pushする必要がある

push or reset

ビルドが成功したら push、失敗したら resetする必要がある。正確には、

ビルドが失敗したら resetして、ビルドは失敗ビルドが成功したら push

pushに成功したらビルドは成功pushに失敗したらビルドは失敗最新版を取得しなおして、マージしてから再pushする必要がある

push or reset

.

こんな感じ

.

.

.

if (manager.build.result == hudson.model.Result.SUCCESS) {

def res = "git push origin master".execute().waitFor()

if (res == 0)

return

manager.buildFailure()

}

def commits = manager.build.changeSet.items

if (commits.length == 0)

return

def scm = manager.build.project.scm

def repo = scm.repositories[0].getURIs()[0].toString()

def parent = commits[0].parentCommit

def reset = "git --git-dir=$repo/.git reset --soft $parent"

reset.execute().waitFor()

Rubyへの通知

Rubyへの通知

Rubyへの通知

.

こんな感じ

.

.

.

s = new java.net.Socket("localhost", 10000)

s << (manager.build.project.name + "\n"

+ manager.build.number + "\n")

s.close()

CygwinでWindowsのサービス

Windowsのサービスを F#とかC#とかで作るのだるいですcygrunsrv使うと非常に簡単にCygwinのプログラムをサービス化できます

CygwinでWindowsのサービス

Windowsのサービスを F#とかC#とかで作るのだるいです

cygrunsrv使うと非常に簡単にCygwinのプログラムをサービス化できます

CygwinでWindowsのサービス

Windowsのサービスを F#とかC#とかで作るのだるいですcygrunsrv使うと非常に簡単にCygwinのプログラムをサービス化できます

Cygwinのプログラムをサービス化

.

こんな感じ

.

.

.

cygrunsrv -I JobNotifier -p /usr/bin/ruby.exe \

-a /home/bleis/notifier.rb

これだけで・・・

Cygwinのプログラムをサービス化

.

こんな感じ

.

.

.

cygrunsrv -I JobNotifier -p /usr/bin/ruby.exe \

-a /home/bleis/notifier.rb

これだけで・・・

こうなる

こうなる

ゴーストを考慮したセリフ

人格を無視したセリフを無理やりしゃべらせるほど SではないですSakura Scriptで対応するという手もありますが、不確実ですお気に入りのゴーストがある人向けに、簡単にそのゴースト専用のセリフをしゃべらせることができるようにしてあります

ゴーストを考慮したセリフ

人格を無視したセリフを無理やりしゃべらせるほど Sではないです

Sakura Scriptで対応するという手もありますが、不確実ですお気に入りのゴーストがある人向けに、簡単にそのゴースト専用のセリフをしゃべらせることができるようにしてあります

ゴーストを考慮したセリフ

人格を無視したセリフを無理やりしゃべらせるほど SではないですSakura Scriptで対応するという手もありますが、不確実です

お気に入りのゴーストがある人向けに、簡単にそのゴースト専用のセリフをしゃべらせることができるようにしてあります

ゴーストを考慮したセリフ

人格を無視したセリフを無理やりしゃべらせるほど SではないですSakura Scriptで対応するという手もありますが、不確実ですお気に入りのゴーストがある人向けに、簡単にそのゴースト専用のセリフをしゃべらせることができるようにしてあります

EXECUTE/1.0

.

こんな感じ

.

.

.

EXECUTE SSTP/1.0

Sender: JobNotifier

Command: GetName

これで起動中のゴーストの名前が取れる!

EXECUTE/1.0

.

こんな感じ

.

.

.

EXECUTE SSTP/1.0

Sender: JobNotifier

Command: GetName

これで起動中のゴーストの名前が取れる!

EXECUTE/1.0

.

こんな感じ

.

.

.

EXECUTE SSTP/1.0

Sender: JobNotifier

Command: GetName

これで起動中のゴーストの名前が取れる!

Sakura Script格納階層

default/default.txt

ゴースト名/abort/failure/success/unstable/

こんな感じの階層にテキストファイルを入れると、それなりに動きます。

Sakura Script格納階層

default/default.txt

ゴースト名/abort/failure/success/unstable/

こんな感じの階層にテキストファイルを入れると、それなりに動きます。

伺かとか無理・・・な人向けに

この発表の主な目的は伺かにしゃべらせる、という所にありますなのでこういう要望が出ること自体誠に遺憾なのですが、大人な対応を試みます

伺かとか無理・・・な人向けに

この発表の主な目的は伺かにしゃべらせる、という所にあります

なのでこういう要望が出ること自体誠に遺憾なのですが、大人な対応を試みます

伺かとか無理・・・な人向けに

この発表の主な目的は伺かにしゃべらせる、という所にありますなのでこういう要望が出ること自体誠に遺憾なのですが、大人な対応を試みます

伺かとか無理・・・な人向けに

伺かとか無理・・・な人向けに

この発表の主な目的は伺かにしゃべらせる、という所にありますなのでこういう要望が出ること自体誠に遺憾なのですが、大人な対応を試みます

伺かへの通知部分をPlugin化しており、デフォルトでは SSTPのほかに、バルーンによる通知にも対応しています

伺かとか無理・・・な人向けに

この発表の主な目的は伺かにしゃべらせる、という所にありますなのでこういう要望が出ること自体誠に遺憾なのですが、大人な対応を試みます伺かへの通知部分をPlugin化しており、デフォルトでは SSTPのほかに、バルーンによる通知にも対応しています

こんな感じ

.

Notifier.fs

.

.

.

module Notifier

open JobNotifier.Gui

let notify (app: App) (job: Jenkins.Job.t) (build: Jenkins.Build.t) _ _ =

let icon =

match build.Result with

| "SUCCESS" -> App.Icon.Info

| "FAILURE" -> App.Icon.Error

| _ -> App.Icon.Warning

app.ShowBalloonTip(icon, job.Name + " : " + build.Result)

こんな感じ

.

Notifier.fs

.

.

.

module Notifier

open JobNotifier.Gui

let notify (app: App) (job: Jenkins.Job.t) (build: Jenkins.Build.t) _ _ =

let icon =

match build.Result with

| "SUCCESS" -> App.Icon.Info

| "FAILURE" -> App.Icon.Error

| _ -> App.Icon.Warning

app.ShowBalloonTip(icon, job.Name + " : " + build.Result)

デモ

これから

Pluginで通知方法自由自在なので、「おとなしいXFD」はありかもそれこそダンボーの目が光るとか

mzp の目が光るとか今回作った仕組みで夢が広がりんぐ!

これから

Pluginで通知方法自由自在なので、「おとなしいXFD」はありかも

それこそダンボーの目が光るとか

mzp の目が光るとか今回作った仕組みで夢が広がりんぐ!

これから

Pluginで通知方法自由自在なので、「おとなしいXFD」はありかもそれこそダンボーの目が光るとか

mzp の目が光るとか今回作った仕組みで夢が広がりんぐ!

これから

Pluginで通知方法自由自在なので、「おとなしいXFD」はありかもそれこそダンボーの目が光るとか

mzp の目が光るとか

今回作った仕組みで夢が広がりんぐ!

これから

Pluginで通知方法自由自在なので、「おとなしいXFD」はありかもそれこそダンボーの目が光るとか

mzp の目が光るとか今回作った仕組みで夢が広がりんぐ!

Recommended