ついにねんがんのJenkins実践入門を献本してもらったぞ

f:id:ikikko:20111109224306p:image

@さんをはじめとした著者の方々、@さん含め技術評論社の方々、お疲れさまでした&ありがとうございます。「献本ほしいなう」としつこくつぶやいて、スミマセンでした><

献本していただけると聞いたときから、はじめての「献本」で慌てないために覚えておくといいかもしれないこと : ゼロスタートの広報ブログを見ながら、今か今かとお待ちしてましたよw


ざっと目を通して思った感想です。週末にでもまたちゃんと読み込んでみます。

Jenkinsをこれから導入する人に

説明用のスクリーンショットが多く、分かりやすいです。とりあえず8章あたりまで本書通りに進めれば、基本的な使い方はマスターしているでしょう。

Jenkinsのはじめの一歩的なものとして、同じく技評さんのサイトで掲載されている特集:Hudsonを使ったアジャイルな開発入門|gihyo.jp … 技術評論社があります。大枠は変わってないとは言え、3年前に書かれたものでちょっと古いので、時間を節約したい方はこの本を買って読み進めることをオヌヌメします*1

Jenkinsをすでに導入していて、よりよい使い方を模索している人に

9章以降はちょっと高度な説明がされています。ここ読んでおけば、Jenkinsレベルが何段階か上がるかと思います。忘れがちだけど実際には避けることができない運用周りの話も、ちゃんと説明されているのがいいですね。

そういや、Reverse Proxy Auth Pluginはこんな感じで使えるんですね。以前ユーザ認証周りを検討していたときに、ちょうど出てきたばかりということもあってこれはスルーしてて、代わりにScript Security Realmを使って独自の認証処理を組み込んだんですよね。これはこれで、柔軟性が高くて便利なのが分かったのがよかったですが。


あと、これは本には直接は関係しないのですが、ここ最近でJenkins関連でイイねと思った発言を取り上げてみました。実際にJenkinsを使ってる方の感想なので、重みがありますね。





最後に超蛇足。

バグ管理システムとの連携もこの本の中で触れられていますが、とりあげられているのがTrac/Redmine/JIRAの3つで、僕がメンテしているBacklog Pluginが入っていないです。悲しいです>< ちゃんと要望も聞いてアクティブにメンテしてるので、Backlog+Jenkins環境の方はぜひ検討してみて何かあればコンタクトください。

以上、宣伝でした。

*1:3年前の結婚記念日で宿泊したホテルで、このサイトを見ながらHudsonを学んだのはいい思い出ですw

ビルドツールのEclipseプラグインを試してみたよ

Wiiを買ったはいいものの、付属のソフト以外何も買ってなくてあっさり飽きたので新しいソフトを探していたら、「JUST DANCE Wii」というなかなか面白そうなものが見つかったのでさっそくAmazonで予約しつつも、手元に届くまでYouTubeを見ながらヘビーローテーションの振り付けを覚えようとしているikikkoです、こんにちは。


概要

今回は、ビルドツールのEclipseプラグインをそれぞれ試してみました。機能紹介と簡単な感想付きで買いてみます。取り上げたのは、以下の4つ。

  • M2E (Maven)
  • IvyDE (Ivy)
  • Gradle Plugin (Gradle)
  • Gradle STS Support (Gradle)
感想

先に全体の感想を書いておくと、

  • ビルドツールのライブラリ依存性管理機能と、Eclipseのビルドパス設定がスムーズに連携できるか
  • Eclipse内からスムーズに(ターゲット/ゴール/タスク)が実行できるか

Eclipseプラグインの肝になると感じました。

前者がスムーズにできないと、ライブラリの依存を更新して改めてEclipse側のビルドパスを設定する必要があります。扱うライブラリが多く、かつ頻繁に変更がある状態だと、片方だけやって片方は対応し忘れるといった設定漏れが発生します。

後者ができないと、結局ターミナルなどを別途開いて、そちらでビルドツールを起動しないといけなくなります。2つの画面を行ったり来たりしてるとやっぱり集中が途切れますし、画面間で実行ログを参照するなどもちょっとやりにくい。

M2E

f:id:ikikko:20111011010953p:image

開発元
機能
  • pomエディタ
  • pom.xmlと同期した、Eclipseのビルドパスの自動設定
  • Runコマンドの拡張
感想

もともとSonatypeでM2Eclipseとして開発されていたのですが、Eclipse 3.7からM2EとしてEclipseにプロジェクトが移りました。が、移ったあとの方が前よりしょぼくなってる気が。リポジトリやプロファイルの設定など、Advanced Tabsでできてたことが軒並みできなくなってます。最悪、XMLを直接編集すればいいのですが、それだとプラグインを使う意味があまりないですしね。。。

Dependency Hierarchyで、落とされてきたJarがどのアーティファクトに紐付けられているかが分かるので、これは相変わらずいいですね。あとは、追加されたDependencyを自動検知して、Eclipseのビルドパスに反映してくれるやつ。

Maven側でもmaven-eclipse-pluginがあるのですが、こちらだとpom.xmlの更新を自動検知してくれる機能はありません。なので、dependencyなどを修正した場合は再度maven-eclipse-plugin(mvn eclipse:clean eclipse:eclipse)を叩く必要があります。

両方を使った感じ、maven-eclipse-pluginの方が安定してそう。その場合でもPOMエディタとして使えるので、M2Eを入れておいて損はないかと思います。

あと、Jenkinsの開発時(や、↓の例だとSpring Dataのチュートリアル時でも)にエラーが出ることがあります。あまり細かくは追っていませんが、M2Eでのmaven lifecycleの扱いが以前と変わっているみたいです。下記リンクを参考に。

IvyDE

http://ant.apache.org/ivy/ivyde/history/latest-milestone/images/completion4.jpg

開発元
機能
  • ivy.xmlの補完
  • ivy.xml修正のタイミングで、自動resolve & ビルドパス反映
  • retrieve対応(プロジェクト直下にJar配備)
  • Eclipseのプロジェクト参照(未検証)
  • Reverse Dependency Explorer(依存性のビュー表示)
感想

ivy.xmlに同期した自動resolve&ビルドパス反映はいい感じ。漏れがなくなるし、ivy.xmlの修正時の確認が楽。これだけのためにいれといてもいいかな。

Dependency Explorerは推移依存までは見れないみたい。推移依存まで見れたら、どのartifactがどのmoduleと紐付いているのかが分かりやすくなるのですが。この点はM2Eの方が優れてますね。

Gradle Plugin

f:id:ikikko:20111011013747p:image

機能
  • Runコマンドからタスク実行
感想

使い方を記したサイトなどは見つかりませんでした。多分、YouTubeにあがってるスクリーンキャストぐらい。

作者自身「まだexperimentalだよ」と言っているのもあって、色々機能不足だし不安定。この記事書いてるときも、さっきまでできてたことがNPEが発生してできなくなったりするし。ま、experimentalにあまり過度の期待を抱いても・・・ですね。開発も2010年3月から止まってるし。

Gradle STS Support

http://static.springsource.org/sts/docs/2.7.0.M1/reference/html/gradle/img/run-as-menu.png

開発元
機能
  • マルチプロジェクトのサポート
  • インポートウィザード
  • プロジェクトの依存性管理とEclipseビルドパスへの反映
  • Runコマンドからタスク実行
感想

上のGradle Pluginよりは将来性がありそう。SpringSourceが開発しているということもありますし。ただ、STSと切り離してインストールできるようになると嬉しいな。今はSTSの上でしか動きません、多分*1

機能的には、マルチプロジェクトをちゃんと動的に読み込んでくれるなど、なかなかの高機能。そのかわり、build.gradleの補完などはないので、別途入れたgroovy eclipse pluginの方に任せる感じかな。build.gradleをGroovyファイルとして読み込めば、Gradle独特の機能は無理にしろ、Groovyとしての補完は有効になるので。

ちなみに、チュートリアルではSpring Integrationのプロジェクトを使っていますが、サイト内に記載されているリポジトリパスが違っていますので注意を。

git clone --recursive git://git.springsource.org/spring-integration/spring-integration.git

ではなくて、正しくは

git clone --recursive git://github.com/SpringSource/spring-integration.git

です。

*1:一応、素のEclipseの上にGradle Tooling APIだけインストールしてみたけど、案の定動きませんでした

CodeMirrorでショートカットキーを追加する、あるいはJenkins Coreへの初めてのコミット

ブログの出落ちが好評との噂ですが、そのプレッシャーゆえにネタ探しに疲れてきているikikkoです、こんばんは。

http://serif.hatelabo.jp/images/cache/7acc714e78ac1911acd9a7c74b7db66ca3eb26e1/1bd1cfc82cb42540b01e5da7c1e363394ca2fb06.gif


今回、CodeMirrorをちょっと触ったので、自分の理解がてら触った範囲をまとめてみます。

概要

CodeMirrorというJSのライブラリをご存知でしょうか。テキストエリアをシンタックスハイライト可能な要素に変えてくれるライブラリです。ハイライト可能な言語はC, JavaRuby/PythonからHTML/CSS/JavaScriptなど、幅広く対応しています。

原理的には、↓な感じ。用意されたテキストエリアをCodeMirrorが提供するシンタックスハイライト付きのIFrameに置き換えます。元のテキストエリアはdisplay:noneにして非表示に。ユーザはIFrameに対してテキストを編集していき、submit時に元のテキストエリアに戻すという仕組みになっています。

https://cacoo.com/diagrams/jOKLDCwnkbRzt7jo-56185.png

一番単純な使い方はこのような感じ。シンタックスハイライトさせたいテキストエリアの要素をわたしてやります。

CodeMirror.fromTextArea(document.getElementById("textarea"),{
  mode:"text/x-java",
}

拡張:ショートカットキーの追加

他のライブラリ同様、CodeMirrorではいくつかの設定によって拡張することができます。対応言語なども増やすことができるのですが、ここでやったのはキーイベントを取得して特定の動作を行う、いわゆるキーボードショートカットを追加してみました。具体的には、Windows/LinuxではCtrl+Enter、MacではCommand+Enterでサブミットを行うというもの。

CodeMirrorでキーイベントを取得するには、onKeyEvent()をCodeMirror生成時のオプションで指定します。これでkeydown/keyup/keypressイベントを取得することができます。なお、戻り値にtrueを返すことによって、後続のイベントを全部キャンセルすることができます。サブミット後にはイベントは基本なくてもいいはずなので、trueを指定することになります。

CodeMirror.fromTextArea(document.getElementById("textarea"),{
  mode:"text/x-java",
  onKeyEvent: function(editor, event){
    console.log(event);
    ...
    return true;
  }
}

で、あとはCtrl or Command+Enterにフックしてsubmitすればいいだけです。が、macのCommandはCtrlキーと違って、メタキーとしてキーイベントの取得ができません。仕方ないので、keydown/keyupにひっかけて、Commandキーが押されているかどうかを判定しました。

完成コードのJS部分を抜粋したものがこちら。

(function() {
  var cmdKeyDown = false;
  
  CodeMirror.fromTextArea(document.getElementById("textarea"),{
    mode:"text/x-java",
    onKeyEvent: function(editor, event){
      function isGeckoCommandKey() {
        return Prototype.Browser.Gecko && event.keyCode == 224
      }
      function isOperaCommandKey() {
        return Prototype.Browser.Opera && event.keyCode == 17
      }
      function isWebKitCommandKey() {
        return Prototype.Browser.WebKit && (event.keyCode == 91 || event.keyCode == 93)
      }
      function isCommandKey() {
        return isGeckoCommandKey() || isOperaCommandKey() || isWebKitCommandKey();
      }
      function saveAndSubmit() {
        editor.save();
        document.form1.submit();
        event.stop();
      }
      
      // Mac (Command + Enter)
      if (navigator.userAgent.indexOf('Mac') > -1) {
        if (event.type == 'keydown' && isCommandKey()) {
          cmdKeyDown = true;
        }
        if (event.type == 'keyup' && isCommandKey()) {
          cmdKeyDown = false;
        }
        if (cmdKeyDown && event.keyCode == Event.KEY_RETURN) {
          saveAndSubmit();
          return true;
        }
        
      // Windows, Linux (Ctrl + Enter)
      } else {
        if (event.ctrlKey && event.keyCode == Event.KEY_RETURN) {
          saveAndSubmit();
          return true;
        }
      }
    }
  })
})();

どこで使ってる?

Jenkinsのスクリプトコンソールで使ってます。いつの頃からか、Jenkins上のスクリプトコンソールはCodeMirrorが採用されていますが、このおかげでちょっと困ったことになっていました。具体的には、サブミットにマウスを使用しないといけなくなったということです。

http://twitter.com/#!/ikikko/status/90756645495382016:twitter:detail:left

http://twitter.com/#!/kohsukekawa/status/90815059693019136:twitter:detail:right

http://twitter.com/#!/ikikko/status/90816199021170688:twitter:detail:left

CodeMirror採用前は、TabキーでSubmitボタンに遷移することができ、そこでSpaceキーを押せばキーボードだけで操作することができました。しかし、CodeMirror採用後はTabキーはそのままTabが入力されるようになったため、このテクニックが使えなくなったのです。スクリプトコンソールは結構頻繁に使っていたため、コンソール上ので操作が結構面倒になりました。

シンタックスハイライトが導入されて感じたことをふと思い出して、ショートカットキーを実装してプルリクエストした次第です。この対応は、Ver 1.432 (2011/09/25) 以降に入っています。スクリプトコンソールを使う方は、頭の片隅にでも留めておいてもらえると、ちょっと楽になるかもですね。


ちなみに。

CodeMirrorのユーザマニュアル見ていると、自動補完などもできるみたい。簡単にできそうなら、これも対応してみようかな。簡単にできそうなら。。。

JenkinsステンシルをCacoo Storeに公開しました

先日、Cacoo Storeが公開されました。Cacoo Storeでは、ユーザが作成したステンシルを全世界に公開することができます。

というわけで、Jekinsステンシルを作って、下記のリンク先で公開してみました。といっても、jenkins-ci.orgSVG形式でロゴが置いてあるので、まんまCacooにインポートしただけですが。

ロゴ自体はCreative Commonsでライセンスされているので、ライセンスを明記した上で利用(インポート)するのには問題ないと認識していますが、もし問題あったら連絡ください。誰となく。


Jenkinsステンシルを利用した図はこんな感じ。こちらも手抜きで、Cacooで用意されているネットワークのテンプレートを適用して、Jenkinsとねこび〜んのステンシルを追加しただけです。なんで、図の整合性は取れていませんのであしからず。ちなみに、ねこび〜んのステンシルはこちら。

https://cacoo.com/diagrams/hdtYpWr294KeQo9O-0E14C.png


資料をつくるときに製品のロゴを用いて説明することはよくやることですが、このロゴがなかなか扱いにくかったりするんですよね。大体各製品のWebサイトTopにある画像をそのままコピペするのですが、余計な背景まで入ったり透過画像になってなかったり、また大きくすると画像が粗くなったり。まじめにやるなら、コピーしてきた画像を綺麗に見える処理をしないといけないですよね。

ですが、CacooでJenkinsのロゴを使いたいときに限って言えば、こちらのステンシルをあらかじめ(無料で)購入しておけば、画像処理をせずにきれいなロゴがそのまま使えます。使いそうと思った方は、ぜひどうぞ!

1ユーザからしても、AWSステンシルのように各社・各製品ともステンシルを用意しておいてもらえると、非常に嬉しくなりますね。


そうそう、そのうち id:masanobuimai さんから、Emotional Jenkinsのステンシルが公開されるんじゃないかなー、チラッチラッ

ビルドツールエントリを見直してみて思ったことなどなど

ちょっと前に書いた

に関連して、はてブコメントへの反応とか、その他追加で考えたことについて。


IDE連携

どのIDEを用いるかの議論はあるにせよ、今どきJavaプロジェクトの開発で何もIDEを用いないのはさすがにしんどいかと思われます。ただ、IDEだけ用意すればいいわけでもありません。IDEとは独立してビルドツール・ビルドスクリプトも用意しておかないと、ビルドがIDE依存になってしまったりCIが回せなかったりと、色々不都合な面も出てきます。

ただ、IDEとビルドスクリプトを別途用意するのは意外と面倒なことも。単純に、IDEとビルドスクリプトを2セット揃えるのが手間ということもありますし、IDE(もしくはIDEプラグイン)でできることがビルドツールで同等の処理が実現できるかというとそうとも限りません。ビルドツールとIDEでコンパイラが違っているために、ビルド結果が異なることも。

そんなとき、Mavenではコンパイラを変更することができます。Eclipse用もありますし、これで初めて知ったJikesというやつもあります。果ては、Javaに限らずC#用のコンパイラも提供されているようです。

  • aspectj with artifactId plexus-compiler-aspectj.
  • csharp with artifactId plexus-compiler-csharp.
  • eclipse with artifactId plexus-compiler-eclipse.
  • jikes with artifactId plexus-compiler-jikes.
Using Non-Javac Compilers

上記で列挙されているもの以外でも、Groovy - Groovy-Eclipse compiler plugin for Mavenで提供されている「groovy-eclipse-compiler(Groovy-Eclipseプラグインで採用されているコンパイラ)」を用いたりすることもできます。


ビルドツールを支援するツール


これはSBTの話ですが、概ねGradleにも同じことが言えるのではないかと。

ビルドツールの自由度が高いということは、ユーザにとってはいいことでしょうが、ビルドツールをサポートするようなツールを実装するのは厄介だということです。この視点はありませんでした。GradleのEclipseプラグインがいまいちな出来なのも、この辺に理由があるのかも*1

Eclipseプラグインについては、Dosanko*SE:覚書を参考に。

*1:他のIDE × Gradleはちゃんと触ったことないので、今度見てみることにします

Groovy Eclipseを使う際にやっておいた方がいい設定

Eclipseがいないと何にも書けないわけじゃないと〜♪」今日もまっきーを聞きながらEclipseを開いているikikkoです、こんばんは。まっきーいいですよね、まっきー。「どうしようもない僕に天使が降りてきた」とかも好きです、あの歌詞が。


もう恋なんてしない

もう恋なんてしない


普段は大体Javaメインで大体Eclipse上でコード書いているのですが、ちょこちょこやっているGroovyもEclipse上で触っています。で、EclipseにはGroovyプラグインであるGroovy - Eclipse Pluginがあるのですが、いくつかやっておいた方がいい設定があるので、簡単にご紹介。Groovy Eclipseのバージョンは、2.5.1です。

なお、あまりIDEを使ったことがない&こだわりがない人は、Groovyを書くならばIntelliJ IDEAをオススメします。

Groovy 1.8を指定する

  • [Groovy > Compiler > Groovy Compiler settings]

最新入れたら、デフォルトでなってるかも。じゃなければ、SNAPSHOTのUpdate Siteから持ってくる必要があります。詳しくは、Compiler Switching within Groovy-Eclipse - Groovy - Codehausを参照してください。

ソースディレクトリ以外のGroovyファイルをコンパイルさせない

  • [Groovy > Compiler > Groovy Script Folders]

(ConfigSlurper用の設定ファイル"config.groovy"などの).groovyファイルをsrc/main/resources以下に配置する場合にはこれが必要。設定しておかないと、勝手にコンパイルされてconfig.classとして扱われてしまって、Class#getResource('/config.groovy')が見つからずに失敗します。

ConfigSlurperについては、GroovyのConfigSlurperがめっちゃ便利 - No Programming, No Lifeが参考になります。

JUnitの出力を等幅フォントにする

  • [Groovy > Use monospace font for JUnit]

(SpockやPower Assertなどの)等幅フォント前提のログ出力を見やすくするために。イメージはこんな感じです。

f:id:ikikko:20110904001706p:image

Jenkins Backlogプラグインをリリースしました(ユーザ認証対応)

結構長めの夏休みがあったにも関わらず、夏休み前に買ったiPhoneFFTでラムザを無駄に暗黒騎士にしてクリアしたり、子供が40℃弱の熱出してけどお盆真っ最中の日曜日で近くの病院どこもやってなくて救急病院に連れていったり、最近職場まで20Km近く自転車漕いでるけどブレーキの効きが悪くて結構心臓に悪かったりしてたので自転車の修理に行ってついでに自転車保険に入ってきたり、あーそろそろ次回のJenkins勉強会の告知とかせんといけんなーとか思いつつ、そんなこんなしてるうちに気がつけば夏休みが終わって家族とコンビニの店員と病院の先生と自転車屋さんとしか話してなかったりなikikkoです、こんにちは。

このままだと↓の @ カイジみたく人間のクズに成り下がりかねなかったので、夏休みの自由課題ということでJenkins Backlogプラグインを拡張してみました。今回の拡張で、Backlogのユーザ情報でJenkinsにログインできるように。

http://3.bp.blogspot.com/_uuNX3_7KkuU/Sl83j1pq57I/AAAAAAAAFlk/cdUJkL8nm2E/s320/20090716-%E3%82%AB%E3%82%A4%E3%82%B8-%E4%BA%BA%E9%96%93%E3%81%AE%E3%82%AF%E3%82%BA.jpg


Jenkinsのセキュリティ関連のプラグインの中に、Script Security Realmというものがあります。このプラグインはJenkinsの認証時に適当なスクリプトをフックできるというものですが、これの中見てるとBacklogプラグインにも認証周りの実装するのはそこまで難しくないかなと思ったのがそもそもの発端です。

まぁ、Backlogプラグインのユーザは数えるほどしかいないだろうしみんなあまり興味ないだろうから、中身のことはとりあえず置いといて。

Jenkinsのセキュリティの概念については、id:tyuki39 さんのHudsonの操作権限をユーザ/グループ/ロール別に制御する - ふぞろいのGENGOたちがよくまとまっています。ただ、自分の使い方としてはそこまでガッチガチに縛るやり方ではなく、メンバーには基本的に自由に触ってもらっています。ですが、何かあったときに誰が何をしたのかをトレースしたいなというのは前から思っていたところでした。

そんな私のお気に入りの設定は、「権限管理」で「ログイン済みユーザーに許可」です。ヘルプメッセージを見てもらえば分かるかと思いますが、ビルド結果の参照などにはログインする必要がなく、手動ビルドしたい場合や何か設定に変更を加えたい場合に初めてユーザ認証が必要になります。

f:id:ikikko:20110817233317p:image

これで、メンバーの手間をできるだけ減らしつつ、トレーサビリティも確保できるようになります。Jenkinsのジョブ設定の履歴を追えるJob Config Historyとの相性もいい感じです。


ところでうちの子ども、マルモリ体操を流すと熱があるにも関わらずはしゃぎだすのですが、自分の体調の悪さを分かっていないようですぐにフラフラになります。。。