JGGUG大忘年会LT大会と、LondonのG*なカンファレンス行ってきた報告!+合宿の報告もあるよ! https://jggug.doorkeeper.jp/events/17692
GradleでビルドしてDockerで配布するJGGUG LT 2014.12.19@int128
View Slide
@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 distZipGradle 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.jarGradle Application Plugin の使用例シェルスクリプトバッチファイルプロダクト本体依存ライブラリ
Dockerイメージのビルド時にGradleを実行するJavaイメージの上でGradleを実行してビルド済みのアプリケーション一式を載せるDockerイメージの構成例ubuntudockerfiles/javamyappOracle JDK 7ビルド済みのアプリケーション一式OSの最小セット
Dockerイメージのビルド時にGradleを実行する例from dockerfile/java:oracle-java7volume /usr/src/groovy-sshcopy . /usr/src/groovy-sshrun cd /usr/src/groovy-ssh && \./gradlew -g .gradle installApp && \cp -a build/install/groovy-ssh /workdir /groovy-ssh/binentrypoint ["./groovy-ssh"]Dockerfile
Dockerを使うとGradle SSH Pluginが不要になる...oh...
まとめJVMベースのアプリケーションをGradleでビルドしてDockerで配布するこれにより、● 提供側は誰でも同じ方法でアプリケーションをビルドできる● Docker Hubで簡単に配布できる● 利用側は誰でも同じ方法でアプリケーションを実行できる