Azure WebApp Plugin for Gradleを使って、GradleコマンドでApp Serviceへデプロイする

2021.09.28

いわさです。

JavaアプリをApp Serviceへデプロイしたいとき、MicrosoftのドキュメントやSpring公式ではMavenのプラグインを使った手順が案内されています。

実はGradleについてもプラグインが用意されています。

本日は、Gradleプラグインを試してみました。

確認用のアプリを用意

まずは、Gradleプロジェクトの作成とローカル実行をしてみます。
今回は、Visual Studio CodeのSpring Boot拡張機能を使いました。

Spring Initializr: Create a Gradle Project... -> Spring Webを選択します。

JDKはせっかくなので、Amazon Correttoを使ってみました。

また、確認用にSpring Bootのガイドに従ってサンプルコントローラーを実装しました。

package hoge.hoge.demo;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

    @GetMapping("/")
    public String index() {
        return "Greetings from Spring Boot!";
    }

}

ローカル実行して、ブラウザで確認してみます。

iwasa.takahito@hoge demo % export JAVA_HOME=/Library/Java/JavaVirtualMachines/amazon-corretto-11.jdk/Contents/Home
iwasa.takahito@hoge demo % gradle build                                                                           

Welcome to Gradle 7.2!

Here are the highlights of this release:
 - Toolchain support for Scala
 - More cache hits when Java source files have platform-specific line endings
 - More resilient remote HTTP build cache behavior

For more details see https://docs.gradle.org/7.2/release-notes.html

Starting a Gradle Daemon, 1 incompatible Daemon could not be reused, use --status for details

BUILD SUCCESSFUL in 16s
7 actionable tasks: 7 executed

iwasa.takahito@hoge demo % gradle bootRun

> Task :bootRun

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v2.5.5)

2021-09-28 15:54:35.772  INFO 9116 --- [           main] hoge.hoge.demo.DemoApplication           : Starting DemoApplication using Java 11.0.12 on hoge.local with PID 9116 (/Users/iwasa.takahito/work/demo/build/classes/java/main started by iwasa.takahito in /Users/iwasa.takahito/work/demo)
2021-09-28 15:54:35.773  INFO 9116 --- [           main] hoge.hoge.demo.DemoApplication           : No active profile set, falling back to default profiles: default
2021-09-28 15:54:36.438  INFO 9116 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2021-09-28 15:54:36.447  INFO 9116 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2021-09-28 15:54:36.447  INFO 9116 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.53]
2021-09-28 15:54:36.508  INFO 9116 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2021-09-28 15:54:36.508  INFO 9116 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 709 ms
2021-09-28 15:54:36.782  INFO 9116 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2021-09-28 15:54:36.790  INFO 9116 --- [           main] hoge.hoge.demo.DemoApplication           : Started DemoApplication in 1.318 seconds (JVM running for 1.621)
<==========---> 80% EXECUTING [22s]
> :bootRun

実行出来ました。
では、Azureへデプロイしていきたいと思います。

Azureへデプロイ

プラグインの設定

Azure上は空のリソースグループだけ作成してあります。

まずは、プラグインの設定を行います。
build.gradleへプラグインの追加と構成情報を追記するだけです。

認証はAzure CLIを使います。(選択可能)

build.gradle

plugins {
	id 'org.springframework.boot' version '2.5.5'
	id 'io.spring.dependency-management' version '1.0.11.RELEASE'
	id 'java'
	id "com.microsoft.azure.azurewebapp" version "1.1.0"
}

group = 'hoge.hoge'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-web'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

test {
	useJUnitPlatform()
}

azurewebapp {
    subscription = '11111111-2222-3333-4444-555555555555'
    resourceGroup = '20210928'
    appName = 'iwasa20210928gradle'
    pricingTier = 'P1v2' 
    region = 'westus' 
    runtime {
        os = 'Linux' 
        webContainer = 'Java SE'
        javaVersion = 'Java 11'
    }
}

構成設定は、gradle.propertiesも使えます。

新規デプロイ

gradle azureWebAppDeployコマンドでデプロイが開始されます。

iwasa.takahito@hoge demo % gradle azureWebAppDeploy

> Task :azureWebAppDeploy
Unknown keyword then - you should define your own Meta Schema. If the keyword is irrelevant for validation, just use a NonValidationKeyword
Auth type: AZURE_CLI
Default subscription: テスト(11111111-2222-3333-4444-555555555555)
Username: iwasa@hogehoge.jp
Subscription: テスト(11111111-2222-3333-4444-555555555555)
Creating web app iwasa20210928gradle...
Creating app service plan asp-iwasa20210928gradle...
Successfully created app service plan asp-iwasa20210928gradle.
Successfully created Web App iwasa20210928gradle.
Trying to deploy artifact to iwasa20210928gradle...
Successfully deployed the artifact to https://iwasa20210928gradle.azurewebsites.net

BUILD SUCCESSFUL in 2m 10s
5 actionable tasks: 4 executed, 1 up-to-date

App ServiceとApp Serviceプランが新規作成されました。

また、デプロイされたWebサイトへアクセスすることが出来ました。

App Serviceプランのスケールアップ/ダウン

先程は、princingTierP1v2を指定したため、Premium P1でApp Serviceプランが作成されていました。
過剰なスペックのため、Basicにスケールダウンしたいと思います。

指定可能な情報はAzureSDK for JavaのPricingTierクラスで定義されています。

azurewebapp {
    subscription = '11111111-2222-3333-4444-555555555555'
    resourceGroup = '20210928'
    appName = 'iwasa20210928gradle'
    pricingTier = 'B1' 
    region = 'westus' 
    runtime {
        os = 'Linux' 
        webContainer = 'Java SE'
        javaVersion = 'Java 11'
    }
}

App ServiceプランがB1にスケールダウンされていることを確認出来ました。

ランタイムバージョンの変更

App Serviceではランタイムバージョンを選択します。
先程はJava 11で構成していましたが、Java 8にバージョンダウンしてみます。

azurewebapp {
    subscription = '11111111-2222-3333-4444-555555555555'
    resourceGroup = '20210928'
    appName = 'iwasa20210928gradle'
    pricingTier = 'B1' 
    region = 'westus' 
    runtime {
        os = 'Linux' 
        webContainer = 'Java SE'
        javaVersion = 'Java 8'
    }
}

スタックの設定のメジャーバージョンが更新されています。
Java Webサーバーも更新が可能です。(Java SE -> Tomcat など)

リージョンの変更は出来ない

作成リソースのリージョンについては変更は出来ません。
更新時、設定値は無視されます。

if target Web App already exists, these setting will be ignored, for example: region

azurewebapp {
    subscription = '11111111-2222-3333-4444-555555555555'
    resourceGroup = '20210928'
    appName = 'iwasa20210928gradle'
    pricingTier = 'B1' 
    region = 'japaneast' 
    runtime {
        os = 'Linux' 
        webContainer = 'Java SE'
        javaVersion = 'Java 8'
    }
}

もちろん、AppNameを変更して新規作成とした場合は指定したリージョンで、新規App ServiceとApp Serviceプランが作成されます。

コードは更新デプロイ出来る

当然ながら、構成ファイルを変更せずとも、コード修正を反映したモジュールはデプロイ可能です。

さいごに

本日はGradleプラグインを紹介しました。
Gradle派閥の方もApp Serviceを是非つかってみてください。

最近のAzure全体のアップデートを見ると、Javaにかなり力を入れてきている気がします。気のせいだろうか。