gradleでビルドしてdockerで配布する #jggug

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

Upload: hidetake-iwata

Post on 22-Jul-2015

853 views

Category:

Technology


2 download

TRANSCRIPT

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

JGGUG LT 2014.12.19@int128

@int128 https://github.com/int128

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

アプリケーションの提供と利用

について考える

リリース手順.xlsこの端末のEclipseで

ビルドしたJARを設定ファイルと一緒に

ZIPで固めてポータルサイトにアップしておいてね

使い方.txtポータルサイトから

ZIPをダウンロードして適当な場所に解凍して

java -jar hoge.jarを実行してください

つらい

提供しやすく利用しやすいアプリケーションの特徴

提供しやすいアプリケーションとは

● 誰でも同じ方法でビルドできる● 環境に依存しない

利用しやすいアプリケーションとは

● 簡単に入手できる● 導入の手間がかからない● 誰でも同じ方法で実行できる

提供しやすく利用しやすいアプリケーションの特長

提供しやすいことのメリット

● ニーズに合わせて早く提供できる● 計画や開発にリソースを集中できる

(リアルJenkinsおじさん不要)

利用しやすいことのメリット

● ユーザに好印象を与える● 多くのユーザを獲得できる● 導入が面倒なアプリは損をしている

JVMベースのアプリケーション

(Groovy, Scala, Java等)固有の課題

JVMベースのアプリケーションの課題

提供側がつらいこと

● コマンドラインツールを配布できるエコシステムがない(RubyGemsとかnpmとか)

● シェルスクリプトやバッチの同梱が面倒

利用側がつらいこと

● JVMのインストールが面倒● JVMのデフォルト引数がいけてないので

ヒープメモリの指定がほぼ必須

アプリケーションの提供と利用の形態

Webサービス

➔ 提供側はアプリをインフラにデプロイ➔ 利用側はサービスにアクセス

コマンドラインツールやWebアプリ

➔ 提供側はアプリをWeb上に公開➔ 利用側はダウンロードして利用

アプリケーションの提供と利用にGradleやDockerを使う

Webサービス

➔ 提供側はアプリをGradleでビルド➔ 提供側はアプリをDockerでデプロイ➔ 利用側はサービスにアクセス

コマンドラインツールやWebアプリ

➔ 提供側はアプリをGradleでビルド➔ 提供側はアプリをDocker Hubに公開➔ 利用側はDocker Hubから取得

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

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

Dockerを使うとGradle SSH Pluginが

不要になる...oh...

まとめ

JVMベースのアプリケーションをGradleでビルドしてDockerで配布する

これにより、

● 提供側は誰でも同じ方法でアプリケーションをビルドできる

● Docker Hubで簡単に配布できる● 利用側は誰でも同じ方法で

アプリケーションを実行できる