gradle で Berkshelf こないだの続き

こないだの続きで最終的に Docker のイメージを作るんですけど、途中 Dockerfile じゃなくて Chef で作ってます。同じ構成コードで Docker のイメージ以外も作りたくて。というわけで Berkshelf です。

repositories {
  mavenCentral()
}

buildscript {
  repositories {
    jcenter()
  }

  dependencies {
    classpath 'org.gradle.api.plugins:gradle-docker-plugin:0.2'
  }
}

apply plugin: 'docker'
apply from: '../berks.gradle'

import org.gradle.api.plugins.docker.tasks.*
import org.gradle.api.plugins.docker.tasks.container.*
import org.gradle.api.plugins.docker.tasks.image.*

docker {
  serverUrl = 'http://127.0.0.1:5555'
}

こないだのに apply from: '../berks.gradle' ってのを追加しました。他のビルドプロジェクトでも使いたい。検索したらあんま見当たらなかったので作ってますけどみんな一緒のことをしてるからうまいことプラグインして切り出したいです。まだ方法がわからない。

task berks_install(type: Exec, group: 'berks') {
  inputs.file  'Berksfile'
  outputs.file 'Berksfile.lock'
  commandLine  'berks', 'install'
}

task berks_update(type: Exec, group: 'berks') {
  commandLine 'berks', 'update'
}

task berks_vendor(type: Exec, group: 'berks', dependsOn: berks_install) {
  inputs.file berks_install.outputs.file
  outputs.dir 'berks-cookbooks'
  commandLine 'berks', 'vendor'
  doFirst {
    new File('berks-cookbooks').deleteDir()
  }
}
$ gradle berks_vendor
:berks_install UP-TO-DATE
:berks_vendor UP-TO-DATE

BUILD SUCCESSFUL

Total time: 2.606 secs

これで良い感じと思われます。 UP-TO-DATE って言われると気分が良いです。 berks_update はその必要があるときに直接実行…でいいのかな…。ただこれまでこれ毎回やってたので(毎回やらない運用だと、 cookbook の変更を取り込み忘れてその後のビルドにかかる20分くらいを無駄にする上にはまる)、一回一回のビルドずいぶん早くなりました。