この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
いわさです。
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プランのスケールアップ/ダウン
先程は、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にかなり力を入れてきている気がします。気のせいだろうか。