読者です 読者をやめる 読者になる 読者になる

かまたま日記3

プログラミングメイン、たまに日常

gradle-embulk-pluginを作った #Embulk

Embulk Gradle

TL;DR

EmbulkのJavaプラグイン開発のときにいろいろ便利につかえるGradleのプラグインを作りました。

github.com

使い方

最低限以下の記述を build.gradle にすれば動きます。*1
最新バージョンは 0.1.4 です (2017/03/21現在)

buildscript {
    repositories {
        jcenter()
        maven { url 'http://kamatama41.github.com/maven-repository/repository' }
    }
    dependencies {
        classpath "com.github.kamatama41:gradle-embulk-plugin:0.1.4"
    }
}

apply plugin: "com.github.kamatama41.embulk"


embulk {
    version = "0.8.18"  // 使うEmbulkのバージョン
    category = "file-input"  // 作るプラグインのカテゴリ (embulk newの時に指定するカテゴリ)
    name = "xlsx"  // 作るプラグインの名前

    // 作者名、メールアドレス、ホームページ (gemspecタスク用)
    authors = ["A User"]  
    email = "a.user@example.com"
    homepage = "https://github.com/a.user/embulk-input-xlsx"
}

何ができるか?

プラグインテンプレート生成

newPlugin タスクを実行することで embulk new コマンドを実行したときと同じテンプレートを生成することができます。*2

% gradle newPlugin
Starting a Gradle Daemon (subsequent builds will be faster)
:embulkSetup
Setting Embulk version to 0.8.18
:embulk_new_java-file-input_xlsx
2017-03-21 04:12:05.020 +0900: Embulk v0.8.18
Creating embulk-input-xlsx/
  Creating embulk-input-xlsx/README.md
  Creating embulk-input-xlsx/LICENSE.txt
  Creating embulk-input-xlsx/.gitignore
  Creating embulk-input-xlsx/gradle/wrapper/gradle-wrapper.jar
  Creating embulk-input-xlsx/gradle/wrapper/gradle-wrapper.properties
  Creating embulk-input-xlsx/gradlew.bat
  Creating embulk-input-xlsx/gradlew
  Creating embulk-input-xlsx/config/checkstyle/checkstyle.xml
  Creating embulk-input-xlsx/config/checkstyle/default.xml
  Creating embulk-input-xlsx/build.gradle
  Creating embulk-input-xlsx/lib/embulk/input/xlsx.rb
  Creating embulk-input-xlsx/src/main/java/org/embulk/input/xlsx/XlsxFileInputPlugin.java
  Creating embulk-input-xlsx/src/test/java/org/embulk/input/xlsx/TestXlsxFileInputPlugin.java

Plugin template is successfully generated.
Next steps:

  $ cd embulk-input-xlsx
  $ ./gradlew package

:newPlugin

BUILD SUCCESSFUL

Total time: 13.166 secs

既存Gradleタスクを網羅

Embulkのプラグイン開発時、最初に embulk new java-input foo のようなコマンドで雛形を生成すると思うのですが、そのときに出来る build.gradle で定義されてるタスクや処理はすべて利用可能です。具体的にはこのテンプレートに記述されてる以下のタスクになります。

これらのタスクはプラグイン側で定義してるので、書く必要が無くなります。*3

“org.embulk:embulk-core” の依存関係を省略可能

プラグイン側で、指定した version に対応したライブラリを追加するので以下の compile provide の記述を書く必要がありません。

dependencies {
    compile  "org.embulk:embulk-core:<embulk-version>"
    provided "org.embulk:embulk-core:<embulk-version>"
}

任意のEmbulkコマンドをGradleタスクとして実行可能

embulk_* のタスクを実行することで任意のembulkコマンドを実行できます。コマンド引数は _ で区切ります。

たとえば、 embulk_--version タスクは embulk --version が実行されます。

% ./gradlew embulk_--version
:embulkSetup
:embulk_--version
embulk 0.8.18

BUILD SUCCESSFUL

Total time: 4.129 secs

embulk_gen_install_embulk-input-hoge タスクは embulk gem install embulk-input-hoge が実行されます。

% gradle embulk_gem_install_embulk-input-command
Starting a Gradle Daemon (subsequent builds will be faster)
:embulkSetup
:embulk_gem_install_embulk-input-command
2017-03-22 07:21:11.578 +0900: Embulk v0.8.18
Successfully installed embulk-input-command-0.1.4
1 gem installed

BUILD SUCCESSFUL

Total time: 13.134 secs

テスト実行が簡単にできる

また、開発中のJavaプラグインをテスト実行(run, preview, guessなど)する場合、以下のような手順を踏むことになると思います。

  1. gradle package でJarライブラリを作る
  2. embulk run-L オプションでクラスパスを追加する

embulk_run タスク*4はそれを全部1コマンドにまとめたタスクです。さらに

  • embulk_run の時のconfigファイルはデフォルトで config.yml
  • embulk_guess の時の出力ファイルは output.yml

指定されます。つまり

  • gradle embulk_run = gradle package && embulk run config.yml -L .
  • gradle embulk_guess = gradle package && embulk guess config.yml -o output.yml -L .

とほぼ同義です。設定ファイルの名前を変えたい場合は build.gradle 内の configYaml, outputYaml を編集して下さい。

embulk {
    ....
    configYaml = "myconfig.yml"
    outputYaml = "myoutput.yml"
}

さいごに

Embulkプラグイン開発者の方は、是非、使ってみて下さい!

*1:今のところMaven CentralとかBintrayには登録してないのでオレオレMavenレポジトリからダウンロードします

*2:実際の処理でもembulk newを実行したあと必要なファイルをコピーしてきてます

*3:もちろん必要があれば上書きできます

*4:preview, guess, cleanupも同様

CicleCIでDockerイメージを再利用する

Docker

CircleCI v1の話です、v2.0になったらもうちょっと楽になってそう(未確認)

基本的には以下のページを参考にしてます。

Caching docker image on CircleCI

1. キャッシュ用のディレクトリを用意する

例えば ~/docker-images、これを circle.ymlcache_directories に追加しておく

dependencies:
  cache_directories:
    - "~/docker-images"

2. イメージのタグを生成する

Dockerfile と依存ファイル達の sha1sum を取る。

たとえばRailsアプリの場合、gemだけイメージに含めるなら GemfileGemfile.lock これらに変更が無ければ同じ値になるはず。(なのでキャッシュが使えるはず)

tag=$(sha1sum Dockerfile Gemfile Gemfile.lock | sha1sum | cut -d' ' -f1)

アプリ全体をイメージに入れるなら全ソースファイルを対象とする

3. ビルドしたイメージをdocker saveする

こんな感じ

docker save ${image_name}:${tag} > ~/docker-images/${image_name}-${tag}.tar

4. 再ビルドするときにキャッシュを使う

イメージのタグを算出してキャッシュディレクトリにあったら docker load する

  if [[ -e ~/docker-images/${image_name}-${tag}.tar ]]; then
    docker load -i ~/docker-images/${image_name}-${tag}.tar
  else
    # 略. buildしてsaveする
  fi

ローカルにGitサーバを立ち上げる with Docker

Docker Git

Gitサーバ(というかGitHub)のレポジトリに対してcommitとかpushするOSSのテスト用に作りましたが、必要無くなったのでw 別リポジトリにしておきました。

github.com

READMEにも書いてますが、cloneして create_git_server.sh を叩くと2222ポートが開いてるGitサーバが出来上がります。

  • レポジトリの実体は work/git-server/repos 配下に作られていて、それがマウントされている
  • SSHの公開鍵は ~/.ssh/*.pub を登録してるので、無いと動きません
$ git clone ssh://git@localhost:2222/git/repos/awesome-repo.git
Cloning into 'awesome-repo'...
Warning: Permanently added '[localhost]:2222' (ECDSA) to the list of known hosts.
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 6 (delta 1), reused 0 (delta 0)
Receiving objects: 100% (6/6), done.
Resolving deltas: 100% (1/1), done.
Checking connectivity... done.

$ cd awesome-repo

$ git log
commit f35d53a97488fac01267d094551df59a53e7ae07
Author: xxxx xxxx <xxxx@example.com>
Date:   Mon Mar 6 02:10:30 2017 +0900

    Add hello.txt

commit b15e864ddade594953ef671d1a2d3b4a0e3e9b0d
Author: xxxx xxxx <xxxx@example.com>
Date:   Mon Mar 6 02:10:30 2017 +0900

    my first commit

JJUG ナイトセミナーKotlin勉強会に参加してきた

Java kotlin

jjug.doorkeeper.jp


EmbulkのプラグインをKotlinで書き直したり最近自分の中で激アツ言語のKotlinの勉強会が開かれると言うので早速参加してきました。サイバーエージェントのサーバサイドの事例だったりSpringのKotlin対応だったりKotlinの波が来ているのを感じられて良かったです。実際(元)JavaエンジニアとしてKotlinは本当に痒いとことに手が届く感じがして書いてて楽しいです。自分のところのプロダクトにも是非導入してみたいです。

続きを読む

TOEIC 217回 結果

English

Listening:315 (335), Reading:370 (255), Total: 685 (590) *1

Listeningが落ちたけとReadingが上がったので全体的には結構up、はじめて600点超え。次は700点超え目指す。

過去ログ

*1:括弧の中は前回(213回)の得点

EmbulkのプラグインをKotlinで書く

Embulk kotlin Java

embulk-input-remoteをKotlinで書き直したv0.3.0をリリースしました。

Kotlinは4年ほど前に会社のレポートでちょっと調べたままで知識が止まってましたが、最近はAndroidやサーバサイドの事例も多く出てきたので勉強がてらやってみるかなと思い試してみました。

結果

Kotlin、イイね 👍

積極的に使って行きたくなりました。

良かったところ

Javaとの相互運用性高い

  • KotlinからJavaライブラリ、JavaからKotlinライブラリどちらも透過的に呼べるので、混在させやすい(移行がしやすい)

導入が簡単

Javaで不便なところが解消されてて簡潔に書ける

  • embulk-input-remoteでは行数が 33% 減りました*2
  • アクセサ, equals, hashCodeなどのboilerplateが省略可能
  • Function as first class object
    • Embulkプラグインは匿名クラスの利用が多いので助かった
  • コレクションの便利メソッド*3

不明点

パフォーマンス (vs Java)

実際測ってないので、断言はできませんが、 以下のリンク*4を見る感じそんなにオーバーヘッド的なのは無いのでは、という期待を持ってます…w ttps://www.reddit.com/r/Kotlin/comments/3ddj8w/what_is_the_performance_of_kotlin

*1:たまにエラーになることもあるけどちょっと修正すればたいてい大丈夫

*2:約430行から290行

*3:map, filterなど

*4:h抜きなのはなぜかフルのURLを貼ると投稿に失敗するので

embulk-filter-hash 0.2.0 リリース

Embulkを最新にしてユニットテスト環境もしっかり整えたので、マイナーバージョンアップしました。

利用&コントリビューションお待ちしてます!