分散Groovy環境

Hudsonの分散ビルドの実装の肝になっているのは、クロージャをリモートJVMで実行するという仕組み。クラスファイルとかリソースとかも必要に応じてリモートJVMにコピーするので、リモート側にあらかじめプログラムを配備しておく必要がないのがよい点です。


さて、常々Javaクロージャ(もどき)の文法は冗長だと思っていたので、これにGroovyを組み合わせたらいいんじゃない?、という事で、実験して見たところ意外にうまくいきました。

def pid() {
  // PIDを取得する。要はどのJVMで動いているかをわかりやすくするだけ
  return new File("/proc/self").canonicalPath
}

i=0
(0..<4).each {
  i++;
  remote {
    println "1st from ${pid()} (${i})"
    remote {
      println "2nd from ${pid()} (${i})"
    }
  }
  println "3rd from ${pid()} (${i})"
}

remote {...}がクロージャを別なJVMに飛ばしているところです。このクロージャは別JVMで実行されますが、その時にちゃんと自分の環境を持っていくので、実行結果は次のようになります。

1st from /proc/15502 (1)
2nd from /proc/15487 (1)
3rd from /proc/15487 (1)
1st from /proc/15502 (2)
2nd from /proc/15487 (2)
3rd from /proc/15487 (2)
...

pid=15487とpid=15502の2つのJVMの間を行ったり来たりしている様子が確認できます。


これを使って複数のマシンに跨がってテストだの管理だのをする分散スクリプト言語を作って見ようかと思ってます。DSLっぽくしてCapistranoみたいにしたりとか。