Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

@int128 https://github.com/int128

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

つらい

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

提供しやすく利用しやすい アプリケーションの特長 提供しやすいことのメリット ● ニーズに合わせて早く提供できる ● 計画や開発にリソースを集中できる (リアルJenkinsおじさん不要) 利用しやすいことのメリット ● ユーザに好印象を与える ● 多くのユーザを獲得できる ● 導入が面倒なアプリは損をしている

Slide 10

Slide 10 text

JVMベースの アプリケーション (Groovy, Scala, Java等) 固有の課題

Slide 11

Slide 11 text

JVMベースのアプリケーションの課題 提供側がつらいこと ● コマンドラインツールを配布できるエコシステム がない(RubyGemsとかnpmとか) ● シェルスクリプトやバッチの同梱が面倒 利用側がつらいこと ● JVMのインストールが面倒 ● JVMのデフォルト引数がいけてないので ヒープメモリの指定がほぼ必須

Slide 12

Slide 12 text

アプリケーションの提供と利用の形態 Webサービス ➔ 提供側はアプリをインフラにデプロイ ➔ 利用側はサービスにアクセス コマンドラインツールやWebアプリ ➔ 提供側はアプリをWeb上に公開 ➔ 利用側はダウンロードして利用

Slide 13

Slide 13 text

アプリケーションの提供と利用に GradleやDockerを使う Webサービス ➔ 提供側はアプリをGradleでビルド ➔ 提供側はアプリをDockerでデプロイ ➔ 利用側はサービスにアクセス コマンドラインツールやWebアプリ ➔ 提供側はアプリをGradleでビルド ➔ 提供側はアプリをDocker Hubに公開 ➔ 利用側はDocker Hubから取得

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

Gradleのメリット 誰でも同じ方法でアプリケーションを ビルドできる ● インストール不要でJVMがあれば動く (Gradle wrapper) ● ./gradlew build を叩くだけでアプリを ビルドできる ● 必要なライブラリは自動的に取得

Slide 16

Slide 16 text

Dockerのメリット 誰でも同じ方法でアプリケーション一式を ビルド、配布、実行できる ● docker build を叩くだけで イメージをビルドできる ● docker run を叩くだけで コンテナを実行できる ● Docker HubやPrivate Registryで イメージを配布できる

Slide 17

Slide 17 text

Gradle + Docker のメリット 提供側のメリット ● 誰でも同じ方法で アプリケーション一式をビルドできる ● 統一的な基盤で、 アプリケーション一式を配布できる 利用側のメリット ● 誰でも同じ方法で アプリケーションを実行できる

Slide 18

Slide 18 text

GradleでビルドしてDockerで配布 1. Gradleでアプリケーションをビルド 2. Dockerイメージを配布 3. ユーザはDockerコンテナを実行 Docker イメージ Docker コンテナ アプリ OS/JVM アプリ OS/JVM 依存JARs ソースコード 設定ファイル 1. ビルド 2. 配布 3. 実行

Slide 19

Slide 19 text

Gradle Application Plugin アプリケーションの実行に必要なファイル群を生成 してくれるプラグイン ● プロダクト本体 ● 実行時の依存ライブラリ ● JVMを起動するシェルスクリプト ● JVMを起動するバッチファイル ※Gradleに標準で含まれるプラグイン

Slide 20

Slide 20 text

plugins { id 'groovy' id 'application' } mainClassName = 'org.example.Main' applicationDefaultJvmArgs = ['-Xmx512m'] アプリケーションを配置する ./gradlew installApp アプリケーションをZIPアーカイブに固める ./gradlew distZip Gradle Application Plugin の使い方 build.gradle

Slide 21

Slide 21 text

● 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 の使用例 シェルスクリプト バッチファイル プロダクト本体 依存ライブラリ

Slide 22

Slide 22 text

Dockerイメージのビルド時に Gradleを実行する Javaイメージの上でGradleを実行して ビルド済みのアプリケーション一式を載せる Dockerイメージの構成例 ubuntu dockerfiles/java myapp Oracle JDK 7 ビルド済みの アプリケーション一式 OSの最小セット

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

Dockerを使うと Gradle SSH Pluginが 不要になる... oh...

Slide 25

Slide 25 text

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