gradleでビルドしてdockerで配布する #jggug
TRANSCRIPT
Gradle SSH Pluginの作者ですhttps://gradle-ssh-plugin.github.io
提供しやすく利用しやすいアプリケーションの特徴
提供しやすいアプリケーションとは
● 誰でも同じ方法でビルドできる● 環境に依存しない
利用しやすいアプリケーションとは
● 簡単に入手できる● 導入の手間がかからない● 誰でも同じ方法で実行できる
提供しやすく利用しやすいアプリケーションの特長
提供しやすいことのメリット
● ニーズに合わせて早く提供できる● 計画や開発にリソースを集中できる
(リアルJenkinsおじさん不要)
利用しやすいことのメリット
● ユーザに好印象を与える● 多くのユーザを獲得できる● 導入が面倒なアプリは損をしている
JVMベースのアプリケーションの課題
提供側がつらいこと
● コマンドラインツールを配布できるエコシステムがない(RubyGemsとかnpmとか)
● シェルスクリプトやバッチの同梱が面倒
利用側がつらいこと
● JVMのインストールが面倒● JVMのデフォルト引数がいけてないので
ヒープメモリの指定がほぼ必須
アプリケーションの提供と利用の形態
Webサービス
➔ 提供側はアプリをインフラにデプロイ➔ 利用側はサービスにアクセス
コマンドラインツールやWebアプリ
➔ 提供側はアプリをWeb上に公開➔ 利用側はダウンロードして利用
アプリケーションの提供と利用にGradleやDockerを使う
Webサービス
➔ 提供側はアプリをGradleでビルド➔ 提供側はアプリをDockerでデプロイ➔ 利用側はサービスにアクセス
コマンドラインツールやWebアプリ
➔ 提供側はアプリをGradleでビルド➔ 提供側はアプリをDocker Hubに公開➔ 利用側はDocker Hubから取得
Gradleのメリット
誰でも同じ方法でアプリケーションをビルドできる
● インストール不要でJVMがあれば動く
(Gradle wrapper)● ./gradlew build を叩くだけでアプリを
ビルドできる
● 必要なライブラリは自動的に取得
Dockerのメリット
誰でも同じ方法でアプリケーション一式をビルド、配布、実行できる
● docker build を叩くだけでイメージをビルドできる
● docker run を叩くだけでコンテナを実行できる
● Docker HubやPrivate Registryでイメージを配布できる
Gradle + Docker のメリット
提供側のメリット
● 誰でも同じ方法でアプリケーション一式をビルドできる
● 統一的な基盤で、アプリケーション一式を配布できる
利用側のメリット
● 誰でも同じ方法でアプリケーションを実行できる
GradleでビルドしてDockerで配布
1. Gradleでアプリケーションをビルド2. Dockerイメージを配布3. ユーザはDockerコンテナを実行
Dockerイメージ
Dockerコンテナ
アプリ
OS/JVM
アプリ
OS/JVM依存JARs
ソースコード
設定ファイル
1. ビルド 2. 配布 3. 実行
Gradle Application Plugin
アプリケーションの実行に必要なファイル群を生成してくれるプラグイン
● プロダクト本体● 実行時の依存ライブラリ● JVMを起動するシェルスクリプト● JVMを起動するバッチファイル
※Gradleに標準で含まれるプラグイン
plugins { id 'groovy' id 'application'}mainClassName = 'org.example.Main'applicationDefaultJvmArgs = ['-Xmx512m']
アプリケーションを配置する
./gradlew installApp
アプリケーションをZIPアーカイブに固める
./gradlew distZip
Gradle Application Plugin の使い方
build.gradle
● 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 の使用例
シェルスクリプト
バッチファイル
プロダクト本体
依存ライブラリ
Dockerイメージのビルド時にGradleを実行する
Javaイメージの上でGradleを実行してビルド済みのアプリケーション一式を載せる
Dockerイメージの構成例
ubuntu
dockerfiles/java
myapp
Oracle JDK 7
ビルド済みのアプリケーション一式
OSの最小セット
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