Azure DevOpsを使ってApp ServiceにLaravelをdeployしてみた

こんにちは、shirakawaです。
今回はAzure DevOpsを使ってApp ServiceにLaravelをdeployする方法を紹介します。

AzureにはApp Serviceというサービスがあります。
これはインフラストラクチャを管理することなく、任意のプログラミング言語で Web アプリケーションを作成することができるサービスです。(≒GCPのAppEngine)
App Service単体でも使うことができるのですが、Azure DevOpsというサービスを利用することで簡単にCI/CDと連携させることが可能になります。
今回はAzure DevOpsを使ってApp ServiceにLaravelをdeployしてみます。

Azure DevOpsについて

ちょっと分かりづらいのですが、Azure DevOpsは複数のサービスをまとめたプラットフォームのようなもので、以下のサービスが含まれています。

  • Azure Boards(タスク管理ツール)
  • Azure Pipelines(CI/CD基盤)
  • Azure Repos(gitリポジトリ)
  • Azure Test Plans(テスト管理ツール)
  • Azure Artifacts(パッケージ管理ツール)

利用するにはAzure DevOps Organization(組織)を作成し、その中にAzure DevOps Projectというプロジェクトを作成します。
プロジェクトごとに上記のサービスを作成することがでるので用途ごとにプロジェクトを作成するのが良いでしょう。
今回はLaravelプロジェクトをgit管理し、git pushすることでApp Serviceにdeployされるようにしたいので、Azure ReposとAzure Pipelinesを使います。
パイプラインの設定等を1から自分で作成すると手間がかかるので簡単に作成できるAzure DevOps Starterを使って作っていきましょう。

Azure DevOps公式ドキュメント

Azure DevOps Starterを使ってDevOpsを作成

Azure DevOps Starterを使ってAzure DevOpsを作成します。
Azure DevOps Starterでは、言語やフレームワークを指定することでそれに合う構成でDevOpsを作成してくれます。
さっそく作っていきましょう。

まずは、Azureポータルで「DevOps Starter」と検索してDevOps Starter画面に遷移し、「+追加」ボタンを押して新規作成を行います。
様々な言語が選択できますが、ここではphpを選択します。

Azure DevOps Starter 言語設定

次にフレームワークを選択します。phpではプレーンなphpかLaravelが選択可能です。
ここではLaravelを選択します。

Azure DevOps Starter フレームワーク設定

次にdeployするApp Serviceのホストタイプを選択します。
App ServiceにはWindows WebApp, Linux Web App, Web App for Containers等のホストタイプがあり、フレームワークごとに使用できるホストタイプが変わります。
LaravelにはWeb App for Containersのみ対応しているのでこれを選択します。

Azure DevOps Starter フレームワーク設定

次にプロジェクト名やOrganizationの設定を入力していきます。
最初はAzure DevOps Organizationが未作成のため選択できないので「Additional settings」を選択してサイドメニューを開き、「Create new Azure DevOps organization」をYesにしてOrganizationを作成します。
他の設定も入力して「DONE」を押すと必要なリソースが作成されます。

Azure DevOps Starter フレームワーク設定
Azure DevOps Starter フレームワーク設定

リソースが作成されるとDevOps StarterのページでCI/CDやApp Serviceの稼働状況を見ることができます。

Azure DevOps Starter フレームワーク設定

Azure DevOps Starter公式ドキュメント

App Service

DevOps StarterのApplication endpointに作成されたApp ServiceのURLが記載されています。
アクセスすると以下のような初期ページが表示されるので確認してみましょう。

Azure DevOps Starter フレームワーク設定
無事に表示されたらgit pushでdeployできるかやってみましょう。

Azure Repo

git pushでdeployするためにまずはAzure Repoにあるリポジトリをcloneしましょう。
DevOps StarterのRepositoriesタブからAzure Repoのページに遷移できます。

Azure DevOps Starter フレームワーク設定

Azure Repoのプロフィールから公開鍵を登録します。

Azure DevOps Starter フレームワーク設定

公開鍵が登録できたら右上にCloneボタンがあるのでそこからcloneパラメータを取得し、ターミナルからcloneします。

git clone git@ssh.dev.azure.com:v3/xxx/xxx/xxx
Azure DevOps Starter フレームワーク設定

Laravelプロジェクト構成

cloneしたリポジトリ内にはApplicationとArmTemplatesフォルダがあり、ApplicationフォルダはLaravelのプロジェクトが入っています。
ArmTemplatesフォルダにはApp Serviceにdeployする際に必要な情報が記載されています。(Azure Pipelinesでこのファイルパスが指定されています)

├── Application
│   ├── Dockerfile
│   ├── LICENSE
│   ├── app
│   ├── artisan
│   ├── bootstrap
│   ├── composer.json
│   ├── composer.lock
│   ├── config
│   ├── database
│   ├── package.json
│   ├── phpunit.xml
│   ├── public
│   ├── readme.md
│   ├── resources
│   ├── routes
│   ├── server.php
│   ├── storage
│   ├── tests
│   └── webpack.mix.js
└── ArmTemplates
    ├── container-webapp-template.json
    └── containerRegistry-template.json

2020年10月時点では、自動生成されたLaravelプロジェクトにはLaravel5.5.*系が使用されており、割と古いので適宜バージョンを上げた方が良さそうです。

deploy

DevOps Starterで作成した場合は、masterブランチへのpushをトリガーにAzure PipelinesによってコンテナイメージがビルドされApp Serviceにdeployされます。
Application/resources/views/welcome.blade.php を修正してmasterにpushしてdeployできるか確認してみましょう。

↓適当に編集します。

-                <div class="description line-1"> Azure DevOps Project has been successfully setup</div>
+                <div class="description line-1"> Deployテスト</div>

↓コミットしてmasterにpushします。

$ git commit -m "deploy確認"
$ git push origin master

pushしたらAzure Pipelinesを見てみましょう。pushに応じてパイプラインが起動しているのが分かります。 パイプライン処理ではコンテナイメージをビルドし、Azure Container Registryにpushします。

Azure DevOps Starter フレームワーク設定

ビルド処理が完了したらその後Azure PipelinesのReleases処理が起動され、App Serviceにdeployされます。

Azure DevOps Starter フレームワーク設定

deployが完了したらApp Serviceが更新されたか見てみましょう。 無事更新されていればOKです!

Azure DevOps Starter フレームワーク設定

おわり

今回はAzure DevOpsを使ってLaravelをApp Serviceにdeployしてみました。 DevOpsを使うことで簡単にdeployできることが分かったと思います。 Azure DevOpsは全体的に情報が少ないので手探りでの開発になることが多いですが、頑張って開発していきましょう!