Чтобы начать новый год, я хотел бы продолжить пару постов, которые я написал в прошлом месяце: Мысли о тестировании приложений OSS в Windows Azure и Запуск PHPUnit в Windows Azure . В этой статье я покажу вам, как развернуть тесты PHPUnit вместе с приложением, запустить тесты как задачу запуска и записать результаты в вашу учетную запись хранения для анализа. К этому сообщению прилагается ZIP- файл, содержащий скелетный проект, который можно использовать для автоматического запуска тестов PHPUnit при развертывании приложения PHP в Azure. Я покажу вам, как использовать скелетный проект, а затем немного подробнее расскажу о том, как все это работает (чтобы вы могли вносить изменения в случае необходимости).
Однако, во-первых, пара «уроков» высокого уровня, когда я работал над этим:
- Все дело в относительных каталогах. При развертывании приложения в Windows Azure нет никаких гарантий относительно местоположения вашего корневого каталога. Вы знаете, что это будет называться Approot , но вы не знаете, будет ли это на диске C: \, D: \, E: \ и т. Д. (Хотя, по моему опыту, это всегда был E: \ аппот ). Чтобы убедиться, что ваше приложение и сценарии запуска будут работать правильно, вам следует избегать использования абсолютных путей (что, как представляется, часто встречается в файле php.ini ).
- Знать, как создавать сценарии, как пакетные сценарии, так и сценарии Powershell. Я все еще относительно новичок в написании сценариев, но они необходимы для создания задач запуска в Azure. Благодаря Powershell многие полезные сведения о Azure доступны через различные командлеты.
В любом случае, чтобы использовать прикрепленный скелетный проект, вот что вам нужно сделать:
1. Загрузите и распакуйте вложенный файл AzurePHPWebRole.zip. Вы найдете следующую структуру каталогов:
-AzurePHPWebRole
-AzurePHPWebRole
-bin
-configurephp.ps1
-install-phpmanager.cmd
-runtests.ps1
-setup.cmd
-PHP
-ресурсов
-WebPICmdLine
— (Web PI .dll файлы) —
тесты
— (файлы приложения)
— (любые внешние библиотеки )
-diagnostics.wadcfg
-web.config
-ServiceDefinition.csdef
2. Скопируйте файлы приложения в каталог AzurePHPWebRole \ AzurePHPWebRole . Это корневой каталог приложения. Ваши юнит-тесты должны быть помещены в каталог тестов .
3. Скопируйте локальную установку PHP в каталог AzurePHPWebRole \ AzurePHPWebRole \ bin \ PHP . Я предполагаю, что у вас установлен PHPUnit как пакет PEAR. Если вы следовали установке PEAR и PHPUnit по умолчанию, они будут включены как часть вашей пользовательской установки PHP. После копирования вашей установки PHP вам нужно будет сделать две незначительные модификации:
а. Убедитесь, что любые пути в вашем файле php.ini являются относительными (например, extension_dir = ”. \ Ext” ).
б. Отредактируйте файл phpunit.bat, чтобы исключить использование абсолютных путей. Для этого я изменил строки 1 и 7, чтобы использовать % ~ dp0 вместо текущего каталога в приведенном ниже коде:
1: if "%PHPBIN%" == "" set PHPBIN=%~dp0php.exe
2: if not exist "%PHPBIN%" if "%PHP_PEAR_PHP_BIN%" neq "" goto USE_PEAR_PATH
3: GOTO RUN
4: :USE_PEAR_PATH
5: set PHPBIN=%PHP_PEAR_PHP_BIN%
6: :RUN
7: "%PHPBIN%" "%~dp0phpunit" %*
4. Создайте каркасный файл ServiceConfiguration.cscfg с помощью следующей команды (запускается из каталога AzurePHPWebRole ):
cspack ServiceDefinition.csdef /generateConfigurationFile:ServiceConfiguration.cscfg /copyOnly
5. Отредактируйте сгенерированный файл ServiceConfiguration.cscfg. Вам нужно будет указать osfamily = ”2” и osversion = ”*” , а также указать информацию о соединении вашей учетной записи хранения:
<?xml version="1.0"?> <ServiceConfiguration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" serviceName="AzurePHPWebRole" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration" osFamily="2" osVersion="*"> <Role name="AzurePHPWebRole"> <ConfigurationSettings> <Setting name="Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString" value="YourStorageAccountConnectionStringHere" /> </ConfigurationSettings> <Instances count="1" /> </Role> </ServiceConfiguration>
6. Упакуйте свое приложение для развертывания. Чтобы создать файл .cspkg , необходимый для развертывания приложения, выполните следующую команду из каталога AzurePHPWebRole :
cspack ServiceDefinition.csdef
7. Разверните ваше приложение. Наконец, вы можете развернуть свое приложение. Этот учебник проведет вас через шаги: http://azurephp.interoperabilitybridges.com/articles/deploying-your-first-php-application-to-windows-azure#new_deploy .
После успешного развертывания вашего приложения (и я предполагаю, что вы внедряете его в промежуточную среду), результаты ваших тестов будут записаны в вашу учетную запись хранения в контейнере больших двоичных объектов, который называется wad-custom . Предполагая, что ваши тесты пройдены, вы готовы перейти к развертыванию в производственной среде.
Как все это работает?
Вот как это работает. Диагностика Windows Azure может подобрать любой файл, который вам нужен, и отправить его в учетную запись хранения. Если вы посмотрите на файл ServiceDefinition.csdef в прикрепленном скелетном проекте, вы увидите это:
<LocalResources> <LocalStorage name="MyCustomLogs" sizeInMB="10" cleanOnRoleRecycle="false" /> </LocalResources>
Эта запись создает локальный каталог MyCustomLogs при развертывании проекта. Если вы также посмотрите на файл Diagnics.wadcfg в скелетном проекте, вы увидите это:
<DataSources> <DirectoryConfiguration container="wad-custom" directoryQuotaInMB="128"> <LocalResource name="MyCustomLogs" relativePath="customlogs" /> </DirectoryConfiguration> </DataSources>
Это говорит модулю «Диагностика» искать в каталоге customlogs локального ресурса MyCustomLogs и отправлять результаты в вашу учетную запись хранения в контейнере больших двоичных объектов, который называется wad -custom . Задачи запуска будут записывать результаты теста PHPUnit в каталог customlogs , который модуль Diagnostics затем передает в вашу учетную запись хранения. (Дополнительные сведения о диагностике Windows Azure см. В разделе Как получить диагностическую информацию для приложений Azure / PHP, часть 1 и часть 2. )
Конечно, сложная часть заключается в написании сценариев для запуска PHPUnit и записи результатов в пользовательские журналы . Возвращаясь к файлу ServiceDefinition.csdef, вы видите, что он содержит следующие строки:
<Startup> <Task commandLine="install-phpmanager.cmd" executionContext="elevated" taskType="simple" /> <Task commandLine="setup.cmd" executionContext="elevated" taskType="simple" /> </Startup>
Эти строки сообщают Windows Azure, что нужно запускать сценарии install-phpmanager.cmd и setup.cmd по порядку ( tasktype = ”simple” гарантирует, что они запускаются последовательно). Давайте посмотрим на эти сценарии.
Сценарий install-phpmanager.cmd устанавливает менеджер PHP для IIS :
@echo offcd "%~dp0"
ECHO Starting PHP Manager installation... >;> ..\startup-tasks-log.txt
md "%~dp0appdata"
cd "%~dp0appdata"
cd "%~dp0"
reg add "hku\.default\software\microsoft\windows\currentversion\explorer\user shell folders" /v "Local AppData" /t REG_EXPAND_SZ /d "%~dp0appdata" /f"..\resources\WebPICmdLine\webpicmdline" /Products:PHPManager /AcceptEula >;> ..\startup-tasks-log.txt 2>>..\startup-tasks-error-log.txtreg add "hku\.default\software\microsoft\windows\currentversion\explorer\user shell folders" /v "Local AppData" /t REG_EXPAND_SZ /d %%USERPROFILE%%\AppData\Local /fECHO Completed PHP Manager installation. >> ..\startup-tasks-log.txt
Командлеты Powershell для PHP Manager используются для изменения вашей установки PHP; в частности, параметр include_path . (Помните, у нас нет гарантии того, где будет находиться корень нашего приложения.) Вы можете увидеть, как используются командлеты в скрипте configurephp.ps1 (который вызывается из скрипта setup.cmd ):
Add-PsSnapin PHPManagerSnapinnew-phpversion -scriptprocessor .\php$include_path_setting = get-phpsetting -Name include_path$include_path = $include_path_setting.Value$current_dir = get-location$new_path = '"' + $include_path.Trim('"') + ";" + $current_dir.Path + "\php\PEAR" + '"'set-phpsetting -Name include_path -Value $new_path$extension_dir = '"' + $current_dir.Path + "\php\ext" + '"'
set-phpsetting -Name extension_dir -Value $extension_dir
Setup.cmd просто вызывает configurephp.ps1 и runtests.ps1 сценарий с политикой исполнения «неограниченном»:
powershell -command "Set-ExecutionPolicy Unrestricted"
powershell .\configurephp.ps1powershell .\runtests.ps1
Сценарий runtests.ps1 помещает PHP в переменную среды Path, получает местоположение нашего ресурса MyCustomLogs и запускает PHPUnit (с выводом, записанным в каталог customlogs ):
Add-PSSnapIn Microsoft.WindowsAzure.ServiceRuntime[System.Environment]::SetEnvironmentVariable("PATH", $Env:Path + ";" + $pwd + "\PHP;")cd ..$rootpathelement = get-localresource MyCustomLogs$customlog = join-path $rootpathelement.RootPath "customlogs\test.log"
phpunit tests >$customlog
Это в основном это. Если вы попробуете, пожалуйста, дайте мне знать, как это происходит. Готов поспорить, есть области, в которых весь этот процесс может быть улучшен.
Спасибо.
-Брайан