Post on 28-May-2015
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 の目が光るとか今回作った仕組みで夢が広がりんぐ!