GradleでビルドしてDockerで配布する

 GradleでビルドしてDockerで配布する

JGGUG大忘年会LT大会と、LondonのG*なカンファレンス行ってきた報告!+合宿の報告もあるよ!
https://jggug.doorkeeper.jp/events/17692

9054e8c93ca920a18b9822237c09f0a4?s=128

Hidetake Iwata

December 19, 2014
Tweet

Transcript

  1. Gradleでビルドして Dockerで配布する JGGUG LT 2014.12.19 @int128

  2. @int128 https://github.com/int128

  3. Gradle SSH Pluginの作者です https://gradle-ssh-plugin.github.io

  4. アプリケーションの 提供と利用 について考える

  5. リリース手順.xls この端末のEclipseで ビルドしたJARを 設定ファイルと一緒に ZIPで固めて ポータルサイトに アップしておいてね

  6. 使い方.txt ポータルサイトから ZIPをダウンロードして 適当な場所に解凍して java -jar hoge.jar を実行してください

  7. つらい

  8. 提供しやすく利用しやすい アプリケーションの特徴 提供しやすいアプリケーションとは • 誰でも同じ方法でビルドできる • 環境に依存しない 利用しやすいアプリケーションとは • 簡単に入手できる

    • 導入の手間がかからない • 誰でも同じ方法で実行できる
  9. 提供しやすく利用しやすい アプリケーションの特長 提供しやすいことのメリット • ニーズに合わせて早く提供できる • 計画や開発にリソースを集中できる (リアルJenkinsおじさん不要) 利用しやすいことのメリット •

    ユーザに好印象を与える • 多くのユーザを獲得できる • 導入が面倒なアプリは損をしている
  10. JVMベースの アプリケーション (Groovy, Scala, Java等) 固有の課題

  11. JVMベースのアプリケーションの課題 提供側がつらいこと • コマンドラインツールを配布できるエコシステム がない(RubyGemsとかnpmとか) • シェルスクリプトやバッチの同梱が面倒 利用側がつらいこと • JVMのインストールが面倒

    • JVMのデフォルト引数がいけてないので ヒープメモリの指定がほぼ必須
  12. アプリケーションの提供と利用の形態 Webサービス ➔ 提供側はアプリをインフラにデプロイ ➔ 利用側はサービスにアクセス コマンドラインツールやWebアプリ ➔ 提供側はアプリをWeb上に公開 ➔

    利用側はダウンロードして利用
  13. アプリケーションの提供と利用に GradleやDockerを使う Webサービス ➔ 提供側はアプリをGradleでビルド ➔ 提供側はアプリをDockerでデプロイ ➔ 利用側はサービスにアクセス コマンドラインツールやWebアプリ

    ➔ 提供側はアプリをGradleでビルド ➔ 提供側はアプリをDocker Hubに公開 ➔ 利用側はDocker Hubから取得
  14. Gradleでビルドして Dockerで配布する

  15. Gradleのメリット 誰でも同じ方法でアプリケーションを ビルドできる • インストール不要でJVMがあれば動く (Gradle wrapper) • ./gradlew build

    を叩くだけでアプリを ビルドできる • 必要なライブラリは自動的に取得
  16. Dockerのメリット 誰でも同じ方法でアプリケーション一式を ビルド、配布、実行できる • docker build を叩くだけで イメージをビルドできる • docker

    run を叩くだけで コンテナを実行できる • Docker HubやPrivate Registryで イメージを配布できる
  17. Gradle + Docker のメリット 提供側のメリット • 誰でも同じ方法で アプリケーション一式をビルドできる • 統一的な基盤で、

    アプリケーション一式を配布できる 利用側のメリット • 誰でも同じ方法で アプリケーションを実行できる
  18. GradleでビルドしてDockerで配布 1. Gradleでアプリケーションをビルド 2. Dockerイメージを配布 3. ユーザはDockerコンテナを実行 Docker イメージ Docker

    コンテナ アプリ OS/JVM アプリ OS/JVM 依存JARs ソースコード 設定ファイル 1. ビルド 2. 配布 3. 実行
  19. Gradle Application Plugin アプリケーションの実行に必要なファイル群を生成 してくれるプラグイン • プロダクト本体 • 実行時の依存ライブラリ •

    JVMを起動するシェルスクリプト • JVMを起動するバッチファイル ※Gradleに標準で含まれるプラグイン
  20. plugins { id 'groovy' id 'application' } mainClassName = 'org.example.Main'

    applicationDefaultJvmArgs = ['-Xmx512m'] アプリケーションを配置する ./gradlew installApp アプリケーションをZIPアーカイブに固める ./gradlew distZip Gradle Application Plugin の使い方 build.gradle
  21. • build/install/groovy-ssh/bin ◦ groovy-ssh ◦ groovy-ssh.bat • build/install/groovy-ssh/lib ◦ groovy-all-2.3.6.jar

    ◦ groovy-ssh-SNAPSHOT.jar ◦ jna-3.4.0.jar ◦ jsch-0.1.51.jar ◦ ... ◦ platform-3.4.0.jar ◦ slf4j-api-1.7.7.jar Gradle Application Plugin の使用例 シェルスクリプト バッチファイル プロダクト本体 依存ライブラリ
  22. Dockerイメージのビルド時に Gradleを実行する Javaイメージの上でGradleを実行して ビルド済みのアプリケーション一式を載せる Dockerイメージの構成例 ubuntu dockerfiles/java myapp Oracle JDK

    7 ビルド済みの アプリケーション一式 OSの最小セット
  23. Dockerイメージのビルド時に Gradleを実行する例 from dockerfile/java:oracle-java7 volume /usr/src/groovy-ssh copy . /usr/src/groovy-ssh run

    cd /usr/src/groovy-ssh && \ ./gradlew -g .gradle installApp && \ cp -a build/install/groovy-ssh / workdir /groovy-ssh/bin entrypoint ["./groovy-ssh"] Dockerfile
  24. Dockerを使うと Gradle SSH Pluginが 不要になる... oh...

  25. まとめ JVMベースのアプリケーションを GradleでビルドしてDockerで配布する これにより、 • 提供側は誰でも同じ方法で アプリケーションをビルドできる • Docker Hubで簡単に配布できる

    • 利用側は誰でも同じ方法で アプリケーションを実行できる