Java アプリケーションから Azure App Service のデプロイ ソースを構成するConfigure Azure App Service deployment sources from your Java applications

このサンプルでは、1 つの Azure App Service プランの 4 つのアプリケーションに、それぞれ異なるデプロイ ソースを使ってコードをデプロイします。This sample deploys code to four applications in a single Azure App Service plan, each using a different deployment source.

サンプルを実行するRun the sample

認証ファイルを作成し、そのファイルのコンピューター上における完全なパスを保持する環境変数 AZURE_AUTH_LOCATION を設定します。Create an authentication file and set an environment variable AZURE_AUTH_LOCATION with the full path to the file on your computer. 次に、以下を実行します。Then run:

git clone https://github.com/Azure-Samples/app-service-java-configure-deployment-sources-for-web-apps.git
cd app-service-java-configure-deployment-sources-for-web-apps
mvn clean compile exec:java

完全なサンプル コードについては GitHub を参照してください。View the complete sample code on GitHub.

Azure での認証Authenticate with Azure

認証ファイルを作成し、環境変数 AZURE_AUTH_LOCATION と認証ファイルの完全なパスをコマンド ラインでエクスポートします。Create an authentication file and export an environment variable AZURE_AUTH_LOCATION on the command line with the full path to the file.

export AZURE_AUTH_LOCATION=/Users/raisa/azure.auth

Azure リソースを定義、作成、構成するために管理ライブラリで使用されるエントリ ポイント Azure オブジェクトを構成するために、この認証ファイルが使用されます。The authentication file is used to configure the entry point Azure object used by the management libraries to define, create, and configure Azure resources.

// pull in the location of the security file from the environment 
final File credFile = new File(System.getenv("AZURE_AUTH_LOCATION"));

Azure azure = Azure
        .configure()
        .withLogLevel(LogLevel.NONE)
        .authenticate(credFile)
        .withDefaultSubscription();

Azure Management Libraries for Java を使用する際の認証オプションの詳細については、こちらを参照してください。Learn more about authentication options when using the Azure management libraries for Java.

Apache Tomcat を実行する App Service アプリの作成Create a App Service app running Apache Tomcat

// create a new Standard app service plan and create a single Java 8/Tomcat 8 app in it
WebApp app1 = azure.webApps().define(app1Name)
             .withNewResourceGroup(rgName)
             .withNewAppServicePlan(planName)
             .withRegion(Region.US_WEST)
             .withPricingTier(AppServicePricingTier.STANDARD_S1)
             .withJavaVersion(JavaVersion.JAVA_8_NEWEST)
             .withWebContainer(WebContainer.TOMCAT_8_0_NEWEST)
             .create();

withJavaVersion()withWebContainer() で、Tomcat 8 を使って HTTP 要求を処理するように App Service を構成しています。withJavaVersion() and withWebContainer() configure App Service to serve HTTP requests using Tomcat 8.

FTP による Java アプリケーションのデプロイDeploy a Java application using FTP

// pass the PublishingProfile that contains FTP information to a helper method 
uploadFileToFtp(app1.getPublishingProfile(), "helloworld.war", 
      ManageWebAppSourceControl.class.getResourceAsStream("/helloworld.war"));

// Use the FTP classes in the Apache Commons library to connect to Azure using 
// the information from the PublishingProfile
private static void uploadFileToFtp(PublishingProfile profile, String fileName, InputStream file) throws Exception {
        FTPClient ftpClient = new FTPClient();
        String[] ftpUrlSegments = profile.ftpUrl().split("/", 2);
        String server = ftpUrlSegments[0];
        // Tomcat will deploy WAR files uploaded to this directory.
        String path = "./site/wwwroot/webapps"; 

        // FTP the build WAR to Azure
        ftpClient.connect(server);
        ftpClient.login(profile.ftpUsername(), profile.ftpPassword());
        ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
        ftpClient.changeWorkingDirectory(path);
        ftpClient.storeFile(fileName, file);
        ftpClient.disconnect();
}

このコードは、/site/wwwroot/webapps ディレクトリに WAR ファイルをアップロードします。This code uploads a WAR file to the /site/wwwroot/webapps directory. App Service には、このディレクトリに格納された WAR ファイルが既定で Tomcat によってデプロイされます。Tomcat deploys WAR files placed in this directory by default in App Service.

ローカル Git リポジトリからの Java アプリケーションのデプロイDeploy a Java application from a local Git repo

// get the publishing profile from the App Service webapp
PublishingProfile profile = app2.getPublishingProfile();

// create a new Git repo in the sample directory under src/main/resources 
Git git = Git
    .init()
    .setDirectory(new File(ManageWebAppSourceControl.class.getResource("/azure-samples-appservice-helloworld/").getPath()))
    .call();
git.add().addFilepattern(".").call();
// add the files in the sample app to an initial commit
git.commit().setMessage("Initial commit").call(); 

// push the commit using the Azure Git remote URL and credentials in the publishing profile
PushCommand command = git.push();
command.setRemote(profile.gitUrl()); 
command.setCredentialsProvider(new UsernamePasswordCredentialsProvider(profile.gitUsername(), profile.gitPassword()));
command.setRefSpecs(new RefSpec("master:master")); 
command.setForce(true);
command.call();

このコードは、JGit ライブラリを使って、新しい Git リポジトリを src/main/resources/azure-samples-appservice-helloworld フォルダーに作成します。This code uses the JGit libraries to create a new Git repo in the src/main/resources/azure-samples-appservice-helloworld folder. その後、このフォルダーにあるすべてのファイルを初期コミットに追加し、Web アプリの PublishingProfile から得た Git のデプロイ情報を使って、そのコミットを Azure にプッシュします。The sample then adds all files in the folder to an initial commit and pushes the commit to Azure using Git deployment information from the webapp's PublishingProfile.

注意

リポジトリ内のファイルのレイアウトは、Azure App Service の /site/wwwroot/ ディレクトリに対して実際にファイルをデプロイするときとまったく同じレイアウトにする必要があります。The layout of the files in the repo must match exactly how you want the files deployed under the /site/wwwroot/ directory in Azure App Service.

パブリック Git リポジトリからのアプリケーションのデプロイDeploy an application from a public Git repo

// deploy a .NET sample app from a public GitHub repo into a new webapp
WebApp app3 = azure.webApps().define(app3Name)
                .withNewResourceGroup(rgName)
                .withExistingAppServicePlan(plan)
                .defineSourceControl()
                .withPublicGitRepository(
                   "https://github.com/Azure-Samples/app-service-web-dotnet-get-started")
                .withBranch("master")
                .attach()
                .create();

.NET プロジェクトのビルドとデプロイは、App Service ランタイムが、リポジトリの master ブランチにある最新のコードを使って自動的に行います。The App Service runtime automatically builds and deploys the .NET project using the latest code on the master branch of the repo.

GitHub リポジトリからの継続的デプロイContinuous deployment from a GitHub repo

// deploy the application whenever you push a new commit or merge a pull request into your master branch
WebApp app4 = azure.webApps()
                    .define(app4Name)
                    .withExistingResourceGroup(rgName)
                    .withExistingAppServicePlan(plan)
                    // Uncomment the following lines to turn on continuous deployment scenario
                    //.defineSourceControl()
                    //    .withContinuouslyIntegratedGitHubRepository("username", "reponame")
                    //    .withBranch("master")
                    //    .withGitHubAccessToken("YOUR GITHUB PERSONAL TOKEN")
                    //    .attach()
                    .create();

usernamereponame には、GitHub で使われている値を指定します。The username and reponame values are the ones used in GitHub. リポジトリの読み取りアクセス許可で GitHub 個人用アクセス トークンを作成し、そのトークンを withGitHubAccessToken に渡してください。Create a GitHub personal access token with repo read permissions and pass it to withGitHubAccessToken.

サンプルの説明Sample explanation

このサンプルでは、新しく作成した Standard App Service プランで稼働する Java 8 と Tomcat 8 を使用して、1 つ目のアプリケーションを作成します。The sample creates the first application using Java 8 and Tomcat 8 running in a newly created Standard App Service plan. その後、PublishingProfile オブジェクトに保持されている情報を使って WAR ファイルを FTP で送信すると、Tomcat によってその WAR ファイルがデプロイされます。The code then FTPs a WAR file using the information in the PublishingProfile object and Tomcat deploys it.

2 つ目のアプリケーションは、1 つ目のアプリケーションと同じプランを使用するもので、こちらも Java 8/Tomcat 8 アプリケーションとして構成されます。The second application uses in the same plan as the first and is also configured as a Java 8/Tomcat 8 application. アンパックされた Java Web アプリケーションが格納されているフォルダーには、JGit ライブラリにより、App Service に対応するディレクトリ構造で新しい Git リポジトリが作成されます。The JGit libraries create a new Git repository in a folder that contains an unpacked Java web application in a directory structure that maps to App Service. 新たにコミットすると、このフォルダー内のファイルが、新しい Git リポジトリに追加され、そのコミットは、Web アプリの PublishingProfile に指定されたリモート URL とユーザー名/パスワードで Azure にプッシュされます。A new commit adds the files in the folder to the new Git repo, and Git pushes the commit to Azure with a remote URL and username/password provided by the webapp's PublishingProfile.

3 つ目のアプリケーションは、Java と Tomcat の構成ではなく、The third application is not configured for Java and Tomcat. パブリック GitHub リポジトリにある .NET サンプルを直接ソースからデプロイするものです。Instead, a .NET sample in a public GitHub repo is deployed directly from source.

4 つ目のアプリケーションでは、GitHub リポジトリのマスター ブランチに対して変更をプッシュするか pull request をマージすると、その都度、マスター ブランチにあるコードがデプロイされます。The fourth application deploys the code in your master branch every time you push changes or merge a pull request into the GitHub repo's master branch.

サンプルで使われているクラスClass used in sample メモNotes
WebAppWebApp azure.webApps().define()....create() という fluent チェーンから作成されます。Created from the azure.webApps().define()....create() fluent chain. App Service Web アプリのほか、そのアプリに必要なすべてのリソースが作成されます。Creates a App Service web app and any resources needed for the app. そのメソッドは、オブジェクトに構成の詳細を照会するものが大半ですが、動詞を含んだメソッド (restart() など) では、Web アプリの状態が変更されます。Most methods query the object for configuration details, but verb methods like restart() change the state of the webapp.
WebContainerWebContainer static public フィールドがあるクラスで、Java Web コンテナーを実行する WebApp を定義する際に withWebContainer() のパラメーターとして使用されます。Class with static public fields used as paramters to withWebContainer() when defining a WebApp running a Java webcontainer. Jetty と Tomcat のどちらもバージョンを選択できます。Has choices for both Jetty and Tomcat versions.
PublishingProfilePublishingProfile WebApp オブジェクトの getPublishingProfile() メソッドを使用して取得できます。Obtained through a WebApp object using the getPublishingProfile() method. FTP と Git のデプロイ情報を保持します。たとえば、デプロイのユーザー名とパスワード (Azure アカウントやサービス プリンシパルの資格情報とは区別されます) が含まれます。Contains FTP and Git deployment information, including deployment username and password (which is separate from Azure account or service principal credentials).
AppServicePlanAppServicePlan azure.appServices().appServicePlans().getByResourceGroup() から返されます。Returned by azure.appServices().appServicePlans().getByResourceGroup(). プランで実行されている Web アプリの数、レベル、キャパシティをチェックするためのメソッドが利用できます。Methods are availble to check the capacity, tier, and number of web apps running in the plan.
AppServicePricingTierAppServicePricingTier App Service のレベルを表す static public フィールドがあるクラス。Class with static public fields representing App Service tiers. プランのレベルをアプリの作成時に withPricingTier() を使ってインラインで定義するとき、または azure.appServices().appServicePlans().define() によってプランを定義する際にそのレベルを直接定義するときに使用します。Used to define a plan tier in-line during app creation with withPricingTier() or directly when defining a plan via azure.appServices().appServicePlans().define()
JavaVersionJavaVersion App Service によってサポートされる Java のバージョンを表す static public フィールドがあるクラス。Class with static public fields representing Java versions supported by App Service. 新しい Web アプリを作成するときに define()...create() チェーンの中で withJavaVersion() と組み合わせて使用します。Used with withJavaVersion() during the define()...create() chain when creating a new webapp.

次の手順Next steps

Azure での Java アプリの作成とデプロイの詳細については、Java デベロッパー センターを参照してください。For more information on creating and deploying Java apps on Azure, visit the Java developer center.