blog4j 2.0 このページをアンテナに追加 RSSフィード

2013-12-22

Gradle Jenkins Plugin

| 23:56 | Gradle Jenkins Pluginを含むブックマーク

f:id:kiy0taka:20131222234811p:image:w640

今回紹介するのは、Gradle Jenkins Pluginです。JenkinsのGradle Plugin でも、Gradle JPI Plugin でもありませんので注意。

G*(Groovy, Grails ..) Advent Calendar 2013 の22日目です。今年もGGXに行って来たので、GGXで見つけたネタです。GGXの詳細な報告は年明けの G*ワークショップ でやる予定なのでお楽しみに。


何か?

GradleからJenkinsのジョブを管理(作成/削除/更新)するGradleプラグインです。ジョブの管理ができるというと、同じようなものにJenkinsのJob DSL Pluginがあります。このGradleのJenkinsプラグインDSLでジョブの定義が出来ますが、JenkinsのJob DSLプラグインのように素敵なDSLでは書けません。基本的にテンプレートとなるジョブのconfig.xmlを用意してジョブを作ったりします。


とりあえず試してみる

適当なディレクトリに次のconfig.xmlとbuild.gradleをコピーします。

<?xml version='1.0' encoding='UTF-8'?>
<project>
  <actions/>
  <description></description>
  <keepDependencies>false</keepDependencies>
  <properties/>
  <scm class="hudson.scm.NullSCM"/>
  <canRoam>true</canRoam>
  <disabled>false</disabled>
  <blockBuildWhenDownstreamBuilding>false</blockBuildWhenDownstreamBuilding>
  <blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding>
  <triggers/>
  <concurrentBuild>false</concurrentBuild>
  <builders>
    <hudson.tasks.Shell>
      <command>echo $JOB_NAME</command>
    </hudson.tasks.Shell>
  </builders>
  <publishers/>
  <buildWrappers/>
</project>
  • build.gradle
buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath('com.terrafolio:gradle-jenkins-plugin:0.3.4')
    }
}

apply plugin: 'jenkins'

jenkins {
    servers {
        local {
            url 'http://localhost:8080'
        }
    }

    defaultServer servers.local

    jobs {
        hello {
            definition {
                xml file('config.xml')
            }
        }
    }
}

JenkinsのWarを持って来て、起動します。

java -jar jenkins.war

updateJenkinsJobsタスクを実行します。ユーザ名とパスワードを聞いてきますが、セキュリティの設定をしていなければそのままEnterで。

$ gradle updateJenkinsJobs
> Building > :updateJenkinsJobs
Enter the username for server "local":

Enter the password for server "local":
:updateJenkinsJobs
Updating job hello on http://localhost:8080

BUILD SUCCESSFUL

Total time: 4.998 secs

すると、helloという名前のジョブが作成されます。ジョブを消したり、config.xmlの一部を変更したりなど、その他の詳しい使い方は、Wiki にまとめられてるのでそちらを参照ください。


何が嬉しいのか?

DSLの書き方はJob DSLプラグインの圧勝ですが、このGradle Jenkinsプラグインは、複数のJenkinsサーバーのジョブをまとめて管理する事ができますし、サーバーの設定を変更することで、とりあえず確認用のJenkinsインスタンスでテストしてみて、問題なければ本番用のJenkinsに対してスクリプトを実行するという方法も取れます。

大規模な開発でJenkinsを使用していて、たくさんのジョブと開発者がいて、Jenkinsの権限まわりをどうしようとなったときに発揮できるかと思います。ジョブの管理をするGradleプロジェクトをリポジトリに突っ込んでおいて、Jenkinsの設定は開発者だけがGradleから実行出来るようにしておき、他の開発者はジョブの実行だけ出来るようにします。開発者がジョブの設定を変えたかったり新しいジョブを追加したかったりする場合は、Gradleのプロジェクトをリポジトリから引っ張って来て、自分の変更を追加して、ローカルのJenkinsとかで確認してからpushするなり、Pull Requestするなりすればいいかと思います。この方式を取れば、本番のJenkinsがお亡くなりになったときに、リポジトリさえ残っていれば、ジョブの再構築はできるという利点もあります。


そんなわけで、Jenkins G*アドベントカレンダーの22日目でした。

トラックバック - http://d.hatena.ne.jp/kiy0taka/20131222

2013-09-26

IDEを使ってJenkinsのGroovyスクリプトを書く

| 12:11 | IDEを使ってJenkinsのGroovyスクリプトを書くを含むブックマーク

MLであったJenkinsのGroovyスクリプトを書くにはどうしたらいいかという話。

JenkinsAPIプラグインを書いたりしてるとなんとなく分かった気がしてきますが、慣れていないとJenkinsを管理したり、Groovy Postbuildプラグインを使うときに困ります。

で、どうするのがいいかというと、やっぱり慣れるしかないかと思います。やりたいことは毎回違うし、よくやるような事はプラグインにしてしまえば良かったり、すでにプラグインになってたりします。MLであった環境変数を設定したいというのは色んな場面で使えそうなので、Groovy Postbuildプラグインで、

manager.addEnv('HOGE', 'ほげ')

とか出来るようになればいいのかなと思ってます。そんな感じでプラグインが使いやすくなっていくと、Groovyスクリプトを書く機会が減って慣れてない人には敷居が高くなっていくわけです。

JenkinsAPIに慣れるためにはスクリプトコンソールやCLIを使ってトライ&エラーを繰り返していくしかないですが、Jenkins上で動かすスクリプトIDEで書ければ補完が効いて少しは敷居も下がるのではと思い、Gradleのスクリプトを書きました。

https://github.com/kiy0taka/gradle-setup-jenkins-script


インストール

Windowsじゃなければ、

$ curl -Ls http://git.io/BoXCXQ | bash

で、Windowsな場合は、手動で$HOME/.gradle/init.dディレクトリsetup-jenkins-script.gradleをコピーしてください。


プロジェクト作成

適当にディレクトリを作ってスクリプトを実行します。

$ mkdir jenkins-scripts
$ cd jenkins-scripts
$ gradle setup-jenkins-script
> Jenkins URL: 

JenkinsサーバURLを聞いてくるので入力してください。JenkinsサーバからJenkinsのバージョンやインストールしてるプラグインの情報をとってきてGradleのプロジェクトが作成されます。あとはIntelliJインポートしてください。


スクリプトを書く

src/scriptディレクトリ以下に、JenkinsスクリプトコンソールやGroovyプラグインの「Execute system Groovy script」で使いたいスクリプトを書いてください。

Jenkinsサーバと同じバージョンのライブラリが追加されているので補完が効きます。

f:id:kiy0taka:20130926114205p:image

Jenkinsサーバインストールされているプラグインライブラリも追加されているのでプラグインAPIを使っても補完されます。

f:id:kiy0taka:20130926114206p:image

書いたスクリプトJenkinsスクリプトコンソールに貼付けて実行してもいいですが、GradleからJenkinsに投げて実行する事もできます。

$ gradle run

src/script以下にあるGroovyスクリプトから実行したいものを選んで実行できます。ファイルを指定して実行したい場合は、「sample.groovy」なら、

$ gradle run-sample

として実行できます。


Groovy Postbuildプラグインスクリプト作成

JenkinsサーバGroovy Postbuildプラグインインストールされていたらsrc/postbuildディレクトリが作られています。src/scriptディレクトリと何が違うかというと、postbuild以下に書くGroovyスクリプトでは、Groovy Postbuildプラグインがバインドする変数managerの補完が効きます。

f:id:kiy0taka:20130926114207p:image

この補完を効かせるためにGDSLを書いているので、IntelliJ専用になってます。EclipseのDSLDを書けばEclipseでも補完が効くと思うので、誰かお願いします。

Groovy Postbuildプラグイン用のスクリプトはGradleから実行できないので、適当なジョブに貼付けて実行してください。

2013-05-14

Java Day Tokyo 2013 #jdt2013

| 23:51 | Java Day Tokyo 2013 #jdt2013を含むブックマーク

エバンジェリストに無茶振りされて、Java Day Tokyo 2013で危うくJavaに関係ない話だけをするところでした。時間が8分間とだけ聞いていたので*1LTより長いし時間持て余すなーと思っていたら、あんなことになってしまいました。

本当なら3段階に分けたデモを見せたかったのですが、時間がなくて最終形をちらっと見せるだけに終わってしまいました。見せたかったのはデモ以下のような感じです。

  1. Twitter4JからMongoDBにデータをためておいて、Elasticsearchで検索できるようにする
  2. Elasticsearchをさらに使って、各ツイートがどのパーツに関係しているかのスコアを出す
  3. Mahoutを使ってパーツの関連を調べて、パーツの組み合わせを出す

コードはすべてGroovyで書いて、デモで見せる部分は当日にGrailsでWebアプリ化しました*2

データマイニングとかは全くの素人で、ちょっとやってみたらそれっぽいデータ*3が出たので個人的には満足です。

Elasticsearchのユーザ辞書を結構適当に作ったのでもう少し整えたり、Mahoutの使い方をもっとちゃんと勉強したり、ミニ四駆ツイートをもっとためたりしていけば、もう少し良くなるんじゃないかとちょっと本気で考えています。

話せなかった分*4については、どこかの勉強会のLTとかでお話ししたいと思います。

*1:何でもありって聞いた。発表順は当日に知った。

*2:これ重要。言い忘れてた。

*3:いろいろ間違ってそうですが

*4:今日の後半部分

2013-03-10

Groovy基礎勉強会でSpockについて話してきた #GroovyBase

| 01:17 | Groovy基礎勉強会でSpockについて話してきた #GroovyBaseを含むブックマーク

Groovy基礎勉強会でSpockの コードを読んだ感想 基礎について話してきました。

普段Spockを使ったり、Spockの拡張を書いてみたりしてたので、なんとなく話せるかなと思ってたのですが、基礎勉強会的にSpockの使い方とか拡張の実装方法とかを話したら負けかなと思って、コンパイル時(AST変換)と実行時(Specification)について話しました。「なるほど、わからん」と思っていただければ嬉しいです。

SpockのAST変換はいろいろやっていて発表ではひどいことを言いましたが、Spockの半分はやさしさで出来ています。やさしさの代名詞であるPowerAssertは、Spockの実装がGroovyに取り入れられたぐらいですし。発表の中でもちらっと話しましたが、Spockの書き方を間違えるとAST変換時にいろいろと、やさしく教えてくれます。

例えば、setup()メソッドをsetUp()と書くと、コンパイルエラーが発生します。

class HelloSpock extends Specification {
    void setUp() {
        println 'setUp'
    }
}
1 compilation error:

Misspelled 'setup()' method (wrong capitalization) 

他にもAST変換時に色々とチェックしてくれるようになっています。Spockは全然こわくないです。

Java基礎勉強会から久しぶりの基礎勉強会参加でしたが、あいかわらず勉強になったのかなってないのかわからん勉強会でした。

2013-02-22

GroovyのEnumが地味に便利

| 01:29 | GroovyのEnumが地味に便利を含むブックマーク

ドラクエ7はやってないけど、ドラクエVIIのバロックタワーのパズルを解く - 虎塚 が面白そうだったのと、メタルギアライジングダウンロードが全然おわらないのでGroovyで実装してみた。

実行方法

groovy baroque L D R U

結果

3U0
R L
2D1
----
*U0
D U
2L1
----
*U0
L R
2U1
----
3R0
U D
2U*
----
3D0
R L
2U*

GroovyのEnumはnext()/previous()メソッドがあるので、時計回りに90度動かすってのがEnumの定義だけでできる。

enum Direction { L,U,R,D }

と定義しておけば、

import static Direction.*

assert L.next() == U
assert U.next() == R
assert R.next() == D
assert D.next() == L

のように、L -> U -> R -> D -> L、と90度回転してるように出来る。

最初はDirectionにrotate()メソッドを実装したのに間違えてnext()って呼び出してて、なんだこれはって見つけた。next()/previous() はシンタックスシュガーでそれぞれ ++/-- で書けるのでなおさら便利。