LoginSignup
13
12

More than 5 years have passed since last update.

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

Posted at

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

13
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
12