Azure WebSitesで作るPHPプロジェクトのCI自動化環境
Azure WebSitesはGitでのデプロイメントもサポートしているのですが、その機能の一つにデプロイメントフックという機能があります。
CI環境を作る際、デプロイメントの自動化を記述できるので何かと便利です。
また、GitであればOKですので、特にプラットフォームは選びません、Windowsでも、Macでも、LinuxからでもOKです。
今回はPHPのプロジェクトのcomposerの更新を自動化してみます。
サイトの作成
Azureポータルにログインして、左下の+ボタンからWEBサイトを一つ作成します。
数秒もすればサイトができるでしょう。
Gitデプロイの有効化
出来上がったサイトにアクセスを行い、サイトの概要 (右の一覧)のソース管理からデプロイの設定をクリックしてください。
今回はローカルGitリポジトリにしましたが、Gitを扱えるなら、Github/BitbucketでもOKです。
リポジトリのClone
デプロイをクリックして、GitのURLからCloneします。
手順に書かれている通り、ローカルにGitリポジトリを作成し、Push先のremoteを追加しても問題ありません。
いずれの方法でも、AzureのリポジトリにPushできれば問題ありません。
リポジトリの準備
ローカルのリポジトリにファイルを追加します。
Windows環境で作ったので、コマンドプロンプト(バッチファイル)ですが、Mac OS XやLinuxであれば、deploy.shとしてシェルで書いてもOKです。
また、composerの動作がわかりやすいよう、PHPのマイクロフレームワークのsilex http://silex.sensiolabs.org/ をcomposerで導入する事にしました。
.deployment
.deploymentファイルによって、リポジトリPushの際にこのファイルが読み込まれcommandに記述しているbin\deploy.cmdが自動実行されます。
[config]
command = bin\deploy.cmd
composer.json
composer.jsonは、取得するフレームワークやライブラリに関しての記述をします。
ここではsilexを導入するように記述しています。
{
"require": {
"silex/silex": "~1.2"
}
}
index.php
index.phpは、そのままSilexのTOPページにあるチュートリアルを参考にしています。
このスクリプトは、index.php/hello/任意の文字列 でリクエストを送ると、Hello 任意の文字列が画面に表示されます。
<?php
require_once __DIR__.'./vendor/autoload.php';
$app = new Silex\Application();
$app->get('/hello/{name}', function($name) use($app) {
return 'Hello '.$app->escape($name);
});
$app->run();
bin フォルダ以下
binフォルダ以下のファイルへのHTTPリクエストは拒否されます、そこでbinフォルダ配下にデプロイメントのスクリプトを構成します。
bin\composer.phar
composer https://getcomposer.org/download/ からcomposer.pharをManual Donwloadして、binフォルダに配置してください。
bin\deploy.cmd
このファイルはAzure xplat cli toolsで自動生成したテンプレートスクリプトの最後の行に、composerの更新などを追加したものです。
;; Composer以後が追加された行です。
@if "%SCM_TRACE_LEVEL%" NEQ "4" @echo off
:: ----------------------
:: KUDU Deployment Script
:: Version: 0.1.11
:: ----------------------
:: Prerequisites
:: -------------
:: Verify node.js installed
where node 2>nul >nul
IF %ERRORLEVEL% NEQ 0 (
echo Missing node.js executable, please install node.js, if already installed make sure it can be reached from current environment.
goto error
)
:: Setup
:: -----
setlocal enabledelayedexpansion
SET ARTIFACTS=%~dp0%..\artifacts
IF NOT DEFINED DEPLOYMENT_SOURCE (
SET DEPLOYMENT_SOURCE=%~dp0%.
)
IF NOT DEFINED DEPLOYMENT_TARGET (
SET DEPLOYMENT_TARGET=%ARTIFACTS%\wwwroot
)
IF NOT DEFINED NEXT_MANIFEST_PATH (
SET NEXT_MANIFEST_PATH=%ARTIFACTS%\manifest
IF NOT DEFINED PREVIOUS_MANIFEST_PATH (
SET PREVIOUS_MANIFEST_PATH=%ARTIFACTS%\manifest
)
)
IF NOT DEFINED KUDU_SYNC_CMD (
:: Install kudu sync
echo Installing Kudu Sync
call npm install kudusync -g --silent
IF !ERRORLEVEL! NEQ 0 goto error
:: Locally just running "kuduSync" would also work
SET KUDU_SYNC_CMD=%appdata%\npm\kuduSync.cmd
)
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Deployment
:: ----------
echo Handling Basic Web Site deployment.
:: 1. KuduSync
IF /I "%IN_PLACE_DEPLOYMENT%" NEQ "1" (
call :ExecuteCmd "%KUDU_SYNC_CMD%" -v 50 -f "%DEPLOYMENT_SOURCE%" -t "%DEPLOYMENT_TARGET%" -n "%NEXT_MANIFEST_PATH%" -p "%PREVIOUS_MANIFEST_PATH%" -i ".git;.hg;.deployment;deploy.cmd"
IF !ERRORLEVEL! NEQ 0 goto error
)
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Post deployment stub
IF DEFINED POST_DEPLOYMENT_ACTION call "%POST_DEPLOYMENT_ACTION%"
IF !ERRORLEVEL! NEQ 0 goto error
goto end
:: Execute command routine that will echo out when error
:ExecuteCmd
setlocal
set _CMD_=%*
call %_CMD_%
if "%ERRORLEVEL%" NEQ "0" echo Failed exitCode=%ERRORLEVEL%, command=%_CMD_%
exit /b %ERRORLEVEL%
:error
endlocal
echo An error has occurred during web site deployment.
call :exitSetErrorLevel
call :exitFromFunction 2>nul
:exitSetErrorLevel
exit /b 1
:exitFromFunction
()
:end
endlocal
;; Composer
echo Composer self update.
cd $DEPLOYMENT_TARGET
"D:\Program Files (x86)\PHP\v5.5\php.exe" "$DEPLOYMENT_TARGET\bin\composer.phar" self-update
echo Running Composer.
cd $DEPLOYMENT_TARGET
"D:\Program Files (x86)\PHP\v5.5\php.exe" "$DEPLOYMENT_TARGET\bin\composer.phar" update
echo "Finished successfully."
デプロイメント
GitでPushしましょう、その際にスクリプトが自動フックされ、composerによりsilexが準備されます。
リポジトリへのPush完了後に、Kuduにログインをするとwwwroot配下には、自動でvendorディレクトリと、composer.lockが作られている事がわかります。
Azure WebSitesのデプロイメントエンジンである、Kuduの使い方はそのうち気が向いたら説明します。
Silexの動作確認
動作確認も兼ねて、ブラウザでアクセスをしてみました。
silextestという名称のAzureWebサイトにGit pushした後に、リクエストしたブラウザの結果です。
もう少し、改良すれば、もっと便利になりそうですね。
http://silextest.azurewebsites.net/index.php/hello/Silex_On_Azure_Websites