Azure WebSitesで作るPHPプロジェクトのCI自動化環境

# Azure WebSitesで作るPHPプロジェクトのCI自動化環境 #

Azure WebSitesはGitでのデプロイメントもサポートしているのですが、その機能の一つにデプロイメントフックという機能があります。
CI環境を作る際、デプロイメントの自動化を記述できるので何かと便利です。
また、GitであればOKですので、特にプラットフォームは選びません、Windowsでも、Macでも、LinuxからでもOKです。

今回はPHPのプロジェクトの**composerの更新を自動化**してみます。

## サイトの作成 ##

Azureポータルにログインして、左下の**＋**ボタンからWEBサイトを一つ作成します。
数秒もすればサイトができるでしょう。

![](http://quickpress.blob.core.windows.net/kzmx/2015/01/silex_on_azws0.png)

## Gitデプロイの有効化 ##

出来上がったサイトにアクセスを行い、サイトの概要 （右の一覧）の**ソース管理からデプロイの設定**をクリックしてください。
今回はローカルGitリポジトリにしましたが、Gitを扱えるなら、Github/BitbucketでもOKです。

![](http://quickpress.blob.core.windows.net/kzmx/2015/01/silex_on_azws1.png)
![](http://quickpress.blob.core.windows.net/kzmx/2015/01/silex_on_azws2.png)

## リポジトリのClone ##

デプロイをクリックして、GitのURLからCloneします。
手順に書かれている通り、ローカルにGitリポジトリを作成し、Push先のremoteを追加しても問題ありません。
いずれの方法でも、AzureのリポジトリにPushできれば問題ありません。

![](http://quickpress.blob.core.windows.net/kzmx/2015/01/silex_on_azws3.png)

## リポジトリの準備 ##

ローカルのリポジトリにファイルを追加します。
Windows環境で作ったので、コマンドプロンプト（バッチファイル）ですが、Mac OS XやLinuxであれば、deploy.shとしてシェルで書いてもOKです。
また、composerの動作がわかりやすいよう、PHPのマイクロフレームワークの[silex http://silex.sensiolabs.org/ ](http://silex.sensiolabs.org/)をcomposerで導入する事にしました。

![](http://quickpress.blob.core.windows.net/kzmx/2015/01/silex_repos1.png)

### .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フォルダ配下にデプロイメントのスクリプトを構成します。

![](http://quickpress.blob.core.windows.net/kzmx/2015/01/silex_repos2.png)

### bin\composer.phar ###

[composer https://getcomposer.org/download/ ](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が準備されます。

![](http://quickpress.blob.core.windows.net/kzmx/2015/01/silex_on_azws4.png)

リポジトリへのPush完了後に、Kuduにログインをするとwwwroot配下には、自動でvendorディレクトリと、composer.lockが作られている事がわかります。
Azure WebSitesのデプロイメントエンジンである、Kuduの使い方はそのうち気が向いたら説明します。

![](http://quickpress.blob.core.windows.net/kzmx/2015/01/silex_on_azws5.png)

## Silexの動作確認 ##

動作確認も兼ねて、ブラウザでアクセスをしてみました。
silextestという名称のAzureWebサイトにGit pushした後に、リクエストしたブラウザの結果です。
もう少し、改良すれば、もっと便利になりそうですね。

**http://silextest.azurewebsites.net/index.php/hello/Silex_On_Azure_Websites**

![](http://quickpress.blob.core.windows.net/kzmx/2015/01/silex_on_azws6.png)