Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

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

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

Hidetake Iwata

December 19, 2014
Tweet

More Decks by Hidetake Iwata

Other Decks in Technology

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  7. つらい

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide