211
Hudson 以外の何か with 任意 bleis-tift May 28, 2011

Hudson以外の何か with 任意

Embed Size (px)

Citation preview

Page 1: Hudson以外の何か with 任意

Hudson以外の何か with 任意

bleis-tift

May 28, 2011

Page 2: Hudson以外の何か with 任意

自己紹介

id:bleis-tift / @bleis

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

Page 3: Hudson以外の何か with 任意

自己紹介

id:bleis-tift / @bleis

名古屋で働くプログラマ

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

Page 4: Hudson以外の何か with 任意

自己紹介

id:bleis-tift / @bleis

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

F#とか Scalaも大好き

Page 5: Hudson以外の何か with 任意

自己紹介

id:bleis-tift / @bleis

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

Page 6: Hudson以外の何か with 任意

自己紹介

Page 7: Hudson以外の何か with 任意

自己紹介

Page 8: Hudson以外の何か with 任意

今日話すこと

.

. .1 CIの完了通知

デモ

.

.

.

2 中身の話

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

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

Page 9: Hudson以外の何か with 任意

今日話すこと

.

. .1 CIの完了通知

デモ

.

.

.

2 中身の話

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

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

Page 10: Hudson以外の何か with 任意

今日話すこと

.

. .1 CIの完了通知

デモ

.

.

.

2 中身の話

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

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

Page 11: Hudson以外の何か with 任意
Page 12: Hudson以外の何か with 任意

きのこ本

きのこ 51

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

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

Page 13: Hudson以外の何か with 任意

きのこ本

きのこ 51

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

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

Page 14: Hudson以外の何か with 任意

XFD

Page 15: Hudson以外の何か with 任意

XFD

Page 16: Hudson以外の何か with 任意

XFD

Page 17: Hudson以外の何か with 任意

CI

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

Page 18: Hudson以外の何か with 任意

CI

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

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

Page 19: Hudson以外の何か with 任意

CI

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

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

Page 20: Hudson以外の何か with 任意

CI

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

Page 21: Hudson以外の何か with 任意

CIだけでは満足できない

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

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

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

Page 22: Hudson以外の何か with 任意

CIだけでは満足できない

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

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

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

Page 23: Hudson以外の何か with 任意

CIだけでは満足できない

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

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

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

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

Page 24: Hudson以外の何か with 任意

CIだけでは満足できない

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

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

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

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

Page 25: Hudson以外の何か with 任意

CIだけでは満足できない

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

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

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

Page 26: Hudson以外の何か with 任意

CIだけでは満足できない

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

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

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

Page 27: Hudson以外の何か with 任意

こんなのがいい

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

これができたら素敵!

Page 28: Hudson以外の何か with 任意

こんなのがいい

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

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

これができたら素敵!

Page 29: Hudson以外の何か with 任意

こんなのがいい

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

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

これができたら素敵!

Page 30: Hudson以外の何か with 任意

こんなのがいい

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

これができたら素敵!

Page 31: Hudson以外の何か with 任意

こんなのがいい

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

これができたら素敵!

Page 32: Hudson以外の何か with 任意

実現してみた

Page 33: Hudson以外の何か with 任意

きれいなリポジトリ

簡単に言うと、

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

Page 34: Hudson以外の何か with 任意

きれいなリポジトリ

簡単に言うと、

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

Page 35: Hudson以外の何か with 任意

問題点

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

Page 36: Hudson以外の何か with 任意

問題点

Page 37: Hudson以外の何か with 任意

問題点

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

ブラウザに張り付く→

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

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

Page 38: Hudson以外の何か with 任意

問題点

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

だるい

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

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

Page 39: Hudson以外の何か with 任意

問題点

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

メール、IM→

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

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

Page 40: Hudson以外の何か with 任意

問題点

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

見ない

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

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

Page 41: Hudson以外の何か with 任意

問題点

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

RSS→

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

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

Page 42: Hudson以外の何か with 任意

問題点

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

リアルタイム性に欠ける

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

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

Page 43: Hudson以外の何か with 任意

問題点

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

XFD→

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

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

Page 44: Hudson以外の何か with 任意

問題点

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

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

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

Page 45: Hudson以外の何か with 任意

問題点

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

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

Page 46: Hudson以外の何か with 任意

問題点

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

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

Page 47: Hudson以外の何か with 任意

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

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

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

Page 48: Hudson以外の何か with 任意

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

リアルタイム性があって

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

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

Page 49: Hudson以外の何か with 任意

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

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

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

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

Page 50: Hudson以外の何か with 任意

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

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

しゃべるもの・・・

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

Page 51: Hudson以外の何か with 任意

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

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

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

Page 52: Hudson以外の何か with 任意

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

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

伺かしか!

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

Page 53: Hudson以外の何か with 任意

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

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

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

Page 54: Hudson以外の何か with 任意

伺か?

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

Page 55: Hudson以外の何か with 任意

伺か?

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

Page 56: Hudson以外の何か with 任意

伺か?

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

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

Page 57: Hudson以外の何か with 任意

伺か?

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

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

Page 58: Hudson以外の何か with 任意

伺か?

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

Page 59: Hudson以外の何か with 任意

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

SSTP Sakura Script Tranfer Protocol

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

Page 60: Hudson以外の何か with 任意

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

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

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

Page 61: Hudson以外の何か with 任意

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

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

Page 62: Hudson以外の何か with 任意

SSTP

Page 63: Hudson以外の何か with 任意

SSTP

Page 64: Hudson以外の何か with 任意

SSTP

Page 65: Hudson以外の何か with 任意

SSTP

Page 66: Hudson以外の何か with 任意

全体概要

Page 67: Hudson以外の何か with 任意

全体概要

Page 68: Hudson以外の何か with 任意

1. push

Page 69: Hudson以外の何か with 任意

1. push

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

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

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

Page 70: Hudson以外の何か with 任意

1. push

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

シェルスクリプトとPerl

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

Page 71: Hudson以外の何か with 任意

1. push

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

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

Page 72: Hudson以外の何か with 任意

1. push

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

Page 73: Hudson以外の何か with 任意

2. CI

Page 74: Hudson以外の何か with 任意

3. 通知

Page 75: Hudson以外の何か with 任意

3. 通知

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

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

Page 76: Hudson以外の何か with 任意

3. 通知

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

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

Page 77: Hudson以外の何か with 任意

3. 通知

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

Page 78: Hudson以外の何か with 任意

4. 通知

Page 79: Hudson以外の何か with 任意

4. 通知

JenkinsはWindows上で動いている

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

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

Page 80: Hudson以外の何か with 任意

4. 通知

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

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

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

Page 81: Hudson以外の何か with 任意

4. 通知

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

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

Page 82: Hudson以外の何か with 任意

4. 通知

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

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

Page 83: Hudson以外の何か with 任意

4. 通知

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

Page 84: Hudson以外の何か with 任意

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

Page 85: Hudson以外の何か with 任意

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

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

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

Page 86: Hudson以外の何か with 任意

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

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

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

Page 87: Hudson以外の何か with 任意

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

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

Page 88: Hudson以外の何か with 任意

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

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

Page 89: Hudson以外の何か with 任意

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

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

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

Page 90: Hudson以外の何か with 任意

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

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

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

Page 91: Hudson以外の何か with 任意

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

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

Page 92: Hudson以外の何か with 任意

デモ

Page 93: Hudson以外の何か with 任意

・・・ふぅ

Page 94: Hudson以外の何か with 任意

以降ほとんど蛇足です。

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

Page 95: Hudson以外の何か with 任意

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

Page 96: Hudson以外の何か with 任意

F#部分の設定

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

Page 97: Hudson以外の何か with 任意

F#部分の設定

設定画面作るの面倒

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

Page 98: Hudson以外の何か with 任意

F#部分の設定

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

ですよねー

Page 99: Hudson以外の何か with 任意

F#部分の設定

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

Page 100: Hudson以外の何か with 任意

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)

Page 101: Hudson以外の何か with 任意

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)

Page 102: Hudson以外の何か with 任意

デモ

Page 103: Hudson以外の何か with 任意

うーん・・・

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

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

そ れ だ !

Page 104: Hudson以外の何か with 任意

うーん・・・

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

そ れ だ !

Page 105: Hudson以外の何か with 任意

うーん・・・

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

そ れ だ !

Page 106: Hudson以外の何か with 任意

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

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

Page 107: Hudson以外の何か with 任意

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

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

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

Page 108: Hudson以外の何か with 任意

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

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

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

Page 109: Hudson以外の何か with 任意

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

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

みんなハッピー!!!

Page 110: Hudson以外の何か with 任意

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

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

Page 111: Hudson以外の何か with 任意

fsiのオプション

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

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

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

Page 112: Hudson以外の何か with 任意

fsiのオプション

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

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

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

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

Page 113: Hudson以外の何か with 任意

fsiのオプション

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

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

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

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

Page 114: Hudson以外の何か with 任意

fsiのオプション

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

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

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

Page 115: Hudson以外の何か with 任意

fsiのオプション

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

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

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

Page 116: Hudson以外の何か with 任意

fsiのオプション

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

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

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

Page 117: Hudson以外の何か with 任意

fsiのオプション

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

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

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

Page 118: Hudson以外の何か with 任意

fsiのオプション

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

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

Page 119: Hudson以外の何か with 任意

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

Page 120: Hudson以外の何か with 任意

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

Page 121: Hudson以外の何か with 任意

設定の取得

Page 122: Hudson以外の何か with 任意

設定の取得

Page 123: Hudson以外の何か with 任意

設定の取得

Page 124: Hudson以外の何か with 任意

設定の取得

Page 125: Hudson以外の何か with 任意

設定の取得

Page 126: Hudson以外の何か with 任意

設定の取得

Page 127: Hudson以外の何か with 任意

設定の反映

Page 128: Hudson以外の何か with 任意

設定の反映

Page 129: Hudson以外の何か with 任意

設定の反映

Page 130: Hudson以外の何か with 任意

設定の反映

Page 131: Hudson以外の何か with 任意

設定の反映

Page 132: Hudson以外の何か with 任意

デモ

Page 133: Hudson以外の何か with 任意

結論

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

Page 134: Hudson以外の何か with 任意

結論

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

Page 135: Hudson以外の何か with 任意

Gitのフックスクリプト

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

Page 136: Hudson以外の何か with 任意

Gitのフックスクリプト

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

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

Page 137: Hudson以外の何か with 任意

Gitのフックスクリプト

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

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

Page 138: Hudson以外の何か with 任意

Gitのフックスクリプト

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

Page 139: Hudson以外の何か with 任意

こんな感じ

Page 140: Hudson以外の何か with 任意

こんな感じ

Page 141: Hudson以外の何か with 任意

こんな感じ

Page 142: Hudson以外の何か with 任意

発展させてみた

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

わりと便利。

Page 143: Hudson以外の何か with 任意

発展させてみた

全てのフックに対応

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

わりと便利。

Page 144: Hudson以外の何か with 任意

発展させてみた

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

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

わりと便利。

Page 145: Hudson以外の何か with 任意

発展させてみた

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

わりと便利。

Page 146: Hudson以外の何か with 任意

発展させてみた

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

わりと便利。

Page 147: Hudson以外の何か with 任意

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

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

Page 148: Hudson以外の何か with 任意

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

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

Page 149: Hudson以外の何か with 任意

コード

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

Page 150: Hudson以外の何か with 任意

コード

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

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

Page 151: Hudson以外の何か with 任意

コード

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

Page 152: Hudson以外の何か with 任意

Groovy Postbuild Plugin

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

Page 153: Hudson以外の何か with 任意

Groovy Postbuild Plugin

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

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

Page 154: Hudson以外の何か with 任意

Groovy Postbuild Plugin

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

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

Page 155: Hudson以外の何か with 任意

Groovy Postbuild Plugin

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

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

Page 156: Hudson以外の何か with 任意

Groovy Postbuild Plugin

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

Page 157: Hudson以外の何か with 任意

何ができるん?

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

Page 158: Hudson以外の何か with 任意

何ができるん?

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

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

Page 159: Hudson以外の何か with 任意

何ができるん?

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

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

Page 160: Hudson以外の何か with 任意

何ができるん?

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

manager.hudson(!)/manager.build

Page 161: Hudson以外の何か with 任意

何ができるん?

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

Page 162: Hudson以外の何か with 任意

Groovy?

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

Page 163: Hudson以外の何か with 任意

Groovy?

JVM上で動作する

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

Page 164: Hudson以外の何か with 任意

Groovy?

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

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

Page 165: Hudson以外の何か with 任意

Groovy?

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

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

Page 166: Hudson以外の何か with 任意

Groovy?

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

それ Scalaで

Page 167: Hudson以外の何か with 任意

Groovy?

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

Page 168: Hudson以外の何か with 任意

push or reset

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

Page 169: Hudson以外の何か with 任意

push or reset

Page 170: Hudson以外の何か with 任意

push or reset

Page 171: Hudson以外の何か with 任意

push or reset

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

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

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

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

Page 172: Hudson以外の何か with 任意

push or reset

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

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

ビルドが成功したら push

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

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

Page 173: Hudson以外の何か with 任意

push or reset

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

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

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

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

Page 174: Hudson以外の何か with 任意

push or reset

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

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

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

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

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

Page 175: Hudson以外の何か with 任意

push or reset

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

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

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

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

Page 176: Hudson以外の何か with 任意

push or reset

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

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

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

Page 177: Hudson以外の何か with 任意

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()

Page 178: Hudson以外の何か with 任意

Rubyへの通知

Page 179: Hudson以外の何か with 任意

Rubyへの通知

Page 180: Hudson以外の何か with 任意

Rubyへの通知

.

こんな感じ

.

.

.

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

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

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

s.close()

Page 181: Hudson以外の何か with 任意

CygwinでWindowsのサービス

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

Page 182: Hudson以外の何か with 任意

CygwinでWindowsのサービス

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

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

Page 183: Hudson以外の何か with 任意

CygwinでWindowsのサービス

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

Page 184: Hudson以外の何か with 任意

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

.

こんな感じ

.

.

.

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

-a /home/bleis/notifier.rb

これだけで・・・

Page 185: Hudson以外の何か with 任意

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

.

こんな感じ

.

.

.

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

-a /home/bleis/notifier.rb

これだけで・・・

Page 186: Hudson以外の何か with 任意

こうなる

Page 187: Hudson以外の何か with 任意

こうなる

Page 188: Hudson以外の何か with 任意

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

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

Page 189: Hudson以外の何か with 任意

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

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

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

Page 190: Hudson以外の何か with 任意

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

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

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

Page 191: Hudson以外の何か with 任意

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

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

Page 192: Hudson以外の何か with 任意

EXECUTE/1.0

.

こんな感じ

.

.

.

EXECUTE SSTP/1.0

Sender: JobNotifier

Command: GetName

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

Page 193: Hudson以外の何か with 任意

EXECUTE/1.0

.

こんな感じ

.

.

.

EXECUTE SSTP/1.0

Sender: JobNotifier

Command: GetName

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

Page 194: Hudson以外の何か with 任意

EXECUTE/1.0

.

こんな感じ

.

.

.

EXECUTE SSTP/1.0

Sender: JobNotifier

Command: GetName

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

Page 195: Hudson以外の何か with 任意

Sakura Script格納階層

default/default.txt

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

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

Page 196: Hudson以外の何か with 任意

Sakura Script格納階層

default/default.txt

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

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

Page 197: Hudson以外の何か with 任意

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

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

Page 198: Hudson以外の何か with 任意

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

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

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

Page 199: Hudson以外の何か with 任意

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

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

Page 200: Hudson以外の何か with 任意

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

Page 201: Hudson以外の何か with 任意

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

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

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

Page 202: Hudson以外の何か with 任意

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

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

Page 203: Hudson以外の何か with 任意

こんな感じ

.

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)

Page 204: Hudson以外の何か with 任意

こんな感じ

.

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)

Page 205: Hudson以外の何か with 任意

デモ

Page 206: Hudson以外の何か with 任意

これから

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

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

Page 207: Hudson以外の何か with 任意

これから

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

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

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

Page 208: Hudson以外の何か with 任意

これから

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

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

Page 209: Hudson以外の何か with 任意

これから

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

mzp の目が光るとか

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

Page 210: Hudson以外の何か with 任意

これから

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

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

Page 211: Hudson以外の何か with 任意