PVをツイートするサービスで Azure WebJobs を使ってます。ソリューションにはWebサイトとWebJobsのプロジェクトが混在しています。そして、デプロイはGitbucketのリポジトリから行っています。
そうすると、しばやん氏が以前書かれていた問題に突き当たりました。
GitHub などのソース管理システムから Web Apps にアプリケーションをデプロイする場合、自動的に Web Apps が認識してくれますが、同時に WebJobs をデプロイするといった機能はありません。
WebJobs を含むソリューションを Azure Web Apps へソース管理からデプロイする方法 - しばやん雑記
そう、Webサイトはいい感じにデプロイしてくれますが、WebJobsの方はデプロイしてくれません。不便だなぁと思いながらも、今まで Visual Studio から手動でデプロイしていました。
しかし、いい加減面倒くさくなったのでしばやん氏のブログを参考に設定してみることにしました。
本質的な内容はしばやん氏のブログに書かれていますのでそっちを見て下さい。以下は私がこうやったよって話です。
deploy.cmd の場所と内容
デプロイ時に実行されるスクリプト(deploy.cmd)ですが、D:\home\site\deployments\tools 配下にあります。
deploy.cmdの確認や編集はAzureポータルの該当Web アプリから[ツール]-[Kudu]で行います。https://[アプリケーション名].scm.azurewebsites.net/ で直接開いてもいいですけど。
Web Appsのデプロイスクリプトと、WebJobsのデプロイスクリプトを比較してみます。差があるのは下のブロック。
Web Apps
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: Deployment :: ---------- echo Handling .NET Web Application deployment. :: 1. Restore NuGet packages IF /I "WebApp.sln" NEQ "" ( call :ExecuteCmd nuget restore "%DEPLOYMENT_SOURCE%\WebApp.sln" IF !ERRORLEVEL! NEQ 0 goto error ) :: 2. Build to the temporary path IF /I "%IN_PLACE_DEPLOYMENT%" NEQ "1" ( call :ExecuteCmd "%MSBUILD_PATH%" "%DEPLOYMENT_SOURCE%\WebApp\WebApp.csproj" /nologo /verbosity:m /t:Build /t:pipelinePreDeployCopyAllFilesToOneFolder /p:_PackageTempDir="%DEPLOYMENT_TEMP%";AutoParameterizationWebConfigConnectionStrings=false;Configuration=Release;UseSharedCompilation=false /p:SolutionDir="%DEPLOYMENT_SOURCE%\.\\" %SCM_BUILD_ARGS% ) ELSE ( call :ExecuteCmd "%MSBUILD_PATH%" "%DEPLOYMENT_SOURCE%\WebApp\WebApp.csproj" /nologo /verbosity:m /t:Build /p:AutoParameterizationWebConfigConnectionStrings=false;Configuration=Release;UseSharedCompilation=false /p:SolutionDir="%DEPLOYMENT_SOURCE%\.\\" %SCM_BUILD_ARGS% ) IF !ERRORLEVEL! NEQ 0 goto error :: 3. KuduSync IF /I "%IN_PLACE_DEPLOYMENT%" NEQ "1" ( 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 )
WebJobs
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: Deployment :: ---------- echo Handling .NET Console Application deployment. :: 1. Restore NuGet packages IF /I "WebJobSample.sln" NEQ "" ( call :ExecuteCmd nuget restore "%DEPLOYMENT_SOURCE%\WebJobSample.sln" IF !ERRORLEVEL! NEQ 0 goto error ) :: 2. Build to the temporary path call :ExecuteCmd "%MSBUILD_PATH%" "%DEPLOYMENT_SOURCE%\WebJobSample\WebJobSample.csproj" /nologo /verbosity:m /t:Build /p:Configuration=Release;OutputPath="%DEPLOYMENT_TEMP%\app_data\jobs\continuous\deployedJob";UseSharedCompilation=false /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
ひと言でいうと、これをいい感じにマージしてやればいい訳ですね。
マージする
雑いですがマージした結果です。
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: Deployment :: ---------- echo Handling .NET Web & Console Application deployment. :: 1. Restore NuGet packages IF /I "WebApp.sln" NEQ "" ( call :ExecuteCmd nuget restore "%DEPLOYMENT_SOURCE%\WebApp.sln" IF !ERRORLEVEL! NEQ 0 goto error ) :: 2. Build to the temporary path ::: .NET Web Application IF /I "%IN_PLACE_DEPLOYMENT%" NEQ "1" ( call :ExecuteCmd "%MSBUILD_PATH%" "%DEPLOYMENT_SOURCE%\WebApp\WebApp.csproj" /nologo /verbosity:m /t:Build /t:pipelinePreDeployCopyAllFilesToOneFolder /p:_PackageTempDir="%DEPLOYMENT_TEMP%";AutoParameterizationWebConfigConnectionStrings=false;Configuration=Release;UseSharedCompilation=false /p:SolutionDir="%DEPLOYMENT_SOURCE%\.\\" %SCM_BUILD_ARGS% ) ELSE ( call :ExecuteCmd "%MSBUILD_PATH%" "%DEPLOYMENT_SOURCE%\WebApp\WebApp.csproj" /nologo /verbosity:m /t:Build /p:AutoParameterizationWebConfigConnectionStrings=false;Configuration=Release;UseSharedCompilation=false /p:SolutionDir="%DEPLOYMENT_SOURCE%\.\\" %SCM_BUILD_ARGS% ) IF !ERRORLEVEL! NEQ 0 goto error ::: .NET Console Application call :ExecuteCmd "%MSBUILD_PATH%" "%DEPLOYMENT_SOURCE%\WebJob1\WebJob1.csproj" /nologo /verbosity:m /t:Build /p:Configuration=Release;OutputPath="%DEPLOYMENT_TEMP%\app_data\jobs\triggered\TweetPvJob";UseSharedCompilation=false /p:SolutionDir="%DEPLOYMENT_SOURCE%\.\\" %SCM_BUILD_ARGS% IF !ERRORLEVEL! NEQ 0 goto error call :ExecuteCmd "%MSBUILD_PATH%" "%DEPLOYMENT_SOURCE%\WebJob2\WebJob2.csproj" /nologo /verbosity:m /t:Build /p:Configuration=Release;OutputPath="%DEPLOYMENT_TEMP%\app_data\jobs\triggered\TweetMonthlyJob";UseSharedCompilation=false /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 IF /I "%IN_PLACE_DEPLOYMENT%" NEQ "1" ( 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 )
ポイント
今回、私はWebApps用 の deploy.cmd に対して組み込んだ訳ですが、ポイントは以下のような点かなと。
1.プロジェクトのパス
ソリューションの構成に合わせて指定すれば問題ないと思います。
2.OutputPath
%DEPLOYMENT_TEMP% 配下がそのまま wwwroot にコピーされるみたいです。 一度 Visual Studio から手動でデプロイして、場所を確認してから設定した方がわかりやすいかもしれませんね。
3.WebJobの数
複数のWebJobがあればその分、ビルドの部分を増やせばいいです。
まとめ
これでリリース漏れが無くなるぜ(おい
おしまい。