11
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Google App EngineのJava 11アプリをGradleでビルドする(Spring Boot + Kotlin + Gradle Kotlin DSL)

Last updated at Posted at 2019-09-22

姉妹記事: Ktor版

この記事では、Google App EngineのJava 11ランタイムを使うアプリケーションをGradleでビルド・デプロイする方法を解説します。

この構成は意外と正確な情報がありません。App Engine Java 11ランタイムのサンプルコードはMavenが使われています。Gradleを使うドキュメントもあるものの、プラグインのバージョンが古かったり、不要なはずのwarの設定があったりします。

さらにGradle Kotlin DSLを使う場合の詰まりどころもあるので、Spring Boot + Kotlin + Gradle Kotlin DSLのGradleプロジェクトをデプロイするまでをまとめておきます。

前提

環境

  • macOS: 10.14.6
  • Spring Boot: 2.1.8
  • Gradle: 5.6.2
  • Kotlin: 1.2.71

古い情報で混乱しないために知っておくと良いこと

  • Google App EngineのJava 11はStandard環境第2世代のランタイム。
    • 設定には appengine-web.xml ではなく app.yaml を使う。
    • Webアプリケーションコンテナではなく、jarとしてビルドしたものを実行するので、war関連の設定は不要。
  • Gradle 4.0以降では、Google App Engine Gradle plugin 2.xを使う。

手順

1. Spring Initializrでプロジェクトをダウンロード

Spring Initializrを開き、次の設定でzipファイルをダウンロードします。

  • Project: Gradle Project
  • Language: Kotlin
  • Spring Boot: 2.1.8
  • Project Metadata -> Options:
    • Packaging: Jar(デフォルト)
    • Java: 11
  • Dependencies: 「Spring Web1を検索して追加

なおLanguageでKotlinを選ぶと、Gradleの設定ファイルはKotlin DSL(build.gradle.kts)になります。

2. Controllerを作成して動作確認

ダウンロードしたdemo.zipを展開して、 src/main/kotlin/com/example/demo/HelloController.kt を次の内容で作成します。

HelloController.kt
package com.example.demo

import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController

@RestController
class HelloController {

    @RequestMapping("/")
    fun hello(): String {
        return "Hello, world!"
    }
}

次のコマンドで起動します。

./gradlew bootRun

http://localhost:8080 にアクセスして、 Hello, world! と返ってくることを確認します。

3. Google App Engine Gradle pluginを追加

Google App Engine Gradle pluginを使うために、build.gradle.kts に次の設定を追加します。

build.gradle.kts
plugins {
    id("org.springframework.boot") version "2.1.8.RELEASE"
    id("io.spring.dependency-management") version "1.0.8.RELEASE"
    kotlin("jvm") version "1.2.71"
    kotlin("plugin.spring") version "1.2.71"
    id("com.google.cloud.tools.appengine") version "2.1.0" // 追加

}

これだけだとプラグインをロードできないので、 settings.gradle.kts に次の設定を追加します。この設定については、 https://stackoverflow.com/a/48510049 を参照してください2

settings.gradle.kts
pluginManagement {
    repositories {
        gradlePluginPortal()
        google()
    }
    resolutionStrategy {
        eachPlugin {
            if (requested.id.id == "com.google.cloud.tools.appengine") {
                useModule("com.google.cloud.tools:appengine-gradle-plugin:${requested.version}")
            }
        }
    }
}

4. app.yamlを追加

src/main/appengine/app.yaml を次の内容で作成します。この設定はサンプルコードのapp.yamlと同じにしてます。

app.yaml
runtime: java11
instance_class: F2
env_variables:
  JAVA_TOOL_OPTIONS: "-XX:MaxRAM=256m -XX:ActiveProcessorCount=2 -Xmx32m"

次のコマンドで、デプロイ用の成果物を作成できることを確認します。

./gradlew appengineStage

次のように build/staged-appapp.yaml と jarファイルができていればOKです。

$ ls build/staged-app/
app.yaml		demo-0.0.1-SNAPSHOT.jar

5. Google App Engineにデプロイ

build.gradle.kts に次の設定を追加します。これらの設定は、プロジェクトIDをgcloudコマンドで設定済みのものにし、バージョンを自動生成するという意味なので、明示的に他の値にしても構いません。

設定についてはGoogle App Engine Gradle pluginのUser Guideを参照してください。

build.gradle.kts
appengine {
    deploy {
        projectId = "GCLOUD_CONFIG"
        version = "GCLOUD_CONFIG"
    }
}

次のコマンドでデプロイします。

./gradlew appengineDeploy

https://<プロジェクトID>.appspot.com にアクセスして、 Hello, world! と表示されたら成功です。

なお gcloud コマンドでデプロイしたい場合は、 ./gradlew appengineStage && cd build/staged-app/ && gcloud app deploy とすればOKです。

まとめ

以上でデプロイまで完了です。この記事の実行結果のコードは次のリポジトリにあります。
https://github.com/orangain/appengine-java11-gradle-spring-boot

参考文献

  1. 以前はSpring Web Starterという名前だったと記憶していますが、最近変わったようです。

  2. https://github.com/GoogleCloudPlatform/app-gradle-plugin#how-to-usehttps://stackoverflow.com/a/55075378 のようにbuildscriptapplyを使う方法もありますが、Kotlin DSLではappengine {...}と書けなくなってしまい、代わりに configure<AppEngineAppYamlExtension> {...} と書く必要があります。

  3. https://cloud.google.com/appengine/docs/standard/java11/gradle-reference にもリファレンスがありますが、projectId が古い project のままになっていたして、やや古いようです。

11
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?