Azure WebApp Plugin for Gradleを使って、GradleコマンドでApp Serviceへデプロイする
いわさです。
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を使います。(選択可能)
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: [email protected] 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プランのスケールアップ/ダウン
先程は、princingTier
にP1v2
を指定したため、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にかなり力を入れてきている気がします。気のせいだろうか。