しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

WebJobs を含むソリューションを Azure Web Apps へソース管理からデプロイする方法

GitHub などのソース管理システムから Web Apps にアプリケーションをデプロイする場合、自動的に Web Apps が認識してくれますが、同時に WebJobs をデプロイするといった機能はありません。

実際にドキュメントには Web アプリケーションのことしか書いてないです。

Deploy from local Git repo - Azure App Service | Microsoft Learn

しかし WebJobs のみをデプロイする場合には、Web Apps がコンソールアプリケーションを自動的に認識して WebJobs としてデプロイしてくれます。

このあたりは中の人がブログで紹介してくれていますので、そっちを参照してください。

Git deploying a .NET console app to Azure using WebJobs

現実的に Web アプリケーションと WebJobs は同じリポジトリに入れて、同時に Web Apps へデプロイしたいと思います。実際にそう思ったのでカスタムデプロイスクリプトで解決します。

まずは Kudu が生成した、典型的な WebJobs をデプロイするスクリプトを拾ってきました。

echo Handling .NET Console Application deployment.

:: 1. Restore NuGet packages
IF /I "WebJobDeploy.sln" NEQ "" (
  call :ExecuteCmd nuget restore "%DEPLOYMENT_SOURCE%\WebJobDeploy.sln"
  IF !ERRORLEVEL! NEQ 0 goto error
)

:: 2. Build to the temporary path
call :ExecuteCmd "%MSBUILD_PATH%" "%DEPLOYMENT_SOURCE%\WebJobDeploy\WebJobDeploy.csproj" /nologo /verbosity:m /t:Build /p:Configuration=Release;OutputPath="%DEPLOYMENT_TEMP%\app_data\jobs\continuous\deployedJob" /p:SolutionDir="%DEPLOYMENT_SOURCE%\.\\" %SCM_BUILD_ARGS%
IF !ERRORLEVEL! NEQ 0 goto error

:: 3. Run web job deploy script
IF DEFINED WEBJOBS_DEPLOY_CMD (
  call :ExecuteCmd "%WEBJOBS_DEPLOY_CMD%"
)

:: 4. KuduSync
call :ExecuteCmd "%KUDU_SYNC_CMD%" -v 50 -f "%DEPLOYMENT_TEMP%" -t "%DEPLOYMENT_TARGET%" -n "%NEXT_MANIFEST_PATH%" -p "%PREVIOUS_MANIFEST_PATH%" -i ".git;.hg;.deployment;deploy.cmd"
IF !ERRORLEVEL! NEQ 0 goto error

やっていることはシンプルで、NuGet パッケージの復元後にプロジェクトをビルドし、KuduSync を使って wwwroot 以下にコピーという流れになります。WEBJOBS_DEPLOY_CMD の実行は hostingstart.html を書き換えるだけなので、大した意味はありません。

重要なのは MSBuild でテンポラリにビルド結果を出力している部分です。App_Data 以下に出力するので、そのまま Web アプリケーションのデプロイスクリプトに組み込むだけで動いてくれそうです。

:: 2. Build to the temporary path
call :ExecuteCmd "%MSBUILD_PATH%" "%DEPLOYMENT_SOURCE%\WebJobDeploy\WebJobDeploy.csproj" /nologo /verbosity:m /t:Build /p:Configuration=Release;OutputPath="%DEPLOYMENT_TEMP%\app_data\jobs\continuous\deployedJob" /p:SolutionDir="%DEPLOYMENT_SOURCE%\.\\" %SCM_BUILD_ARGS%
IF !ERRORLEVEL! NEQ 0 goto error

注意点としてはソリューション、プロジェクトのパスと OutputPath に指定している名前です。デフォルトでは deployedJob という名前で固定されてしまうので、正しい名前に修正しておく必要があります。

Web アプリケーションのデプロイスクリプトに組み込んだサンプルを GitHub に公開しておきました。

https://github.com/shibayan/azure-webjobs-deploy

deploy.cmd が作成したカスタムデプロイスクリプトになります。このリポジトリを使って Web Apps にデプロイ後、ポータルからデプロイスクリプトの実行ログが見れます。

AzureWebJobsDeploy.Web と AzureWebJobsDeploy.Console の 2 つがビルドされていることが分かります。

ポータルから WebJobs の一覧を確認すると、先ほどデプロイした WebJobs が確認できます。

Kudu によって自動生成されたスクリプトでは continuous で固定でしたが、出力先ディレクトリを変更することで triggered にも変更可能です。

複数の WebJobs をデプロイする場合には、MSBuild 部分を増やすだけで対応できると思います。理想的には KuduScript 側で Web アプリケーションと WebJobs の同時デプロイを認識して、デプロイスクリプトを作ってもらいたいですね。