Автоматизация сборок приложений для Windows Phone

Идея этой статьи возникла после того, как на одной конференции по разработке для мобильных устройств услышал доклад об автоматизации сборки приложений для iOS. Тогда я задумался и об автоматизации сборок для Windows Phone. Нового в этом ничего нет, тем не менее надеюсь это покажется интересным.
Для начала, любому хотелось бы понять для каких сценариев это может быть полезно. Для начинающего разработчика, который разрабатывает в одиночку на одном собственном компьютере это навряд ли необходимо. Сценарий вполне будет работать для команды разработчиков начиная от 5 человек, когда уже применяется система контроля версий и т.д. Возникает необходимость периодической проверки собираемости проекта, необходимость  периодической сборки для передачи тестировщикам (причем информация о версии сборки также должна добавляться автоматически).
С чем же придётся столкнуться? Если собираемся собирать проекты на сервере, то нужно учесть что из серверных версий Windows возможность установить Windows Phone SDK  есть только для Windows Server 2008. Речь идёт только об установке в целях компиляции проекта в сборку. Официально Windows Phone SDK не поддерживает Windows Server, но мы определились с той задачей, которую решаем – и поскольку решение одно, то стоит воспринимать это как есть.
Пожалуйста, обратите внимание, что  официально установка Windows Phone SDK не поддерживается, так что если вы выполните следующие действия, вы делаете это на свой страх и риск.
1. Скачайте веб-установщик Windows Phone SDK и сохраните его на жестком диске.
2.  Извлеките содержимое пакета установки, запустив установщик с соответствующим командным ключом vm_web2.exe / х и выбрав путь для извлечения.
3. Перейдите в папку, в которую были извлечены файлы на в шаге 2, и откройте файл baseline.dat в блокноте.
4. Look for the section named [gencomp7788] Найдите раздел с именем [gencomp7788]
Примечание: именно этот раздел отвечает за контроль версий операционной системы, на которую устанавливается Windows Phone SDK.
5. Измените значение InstallOnLHS с 1 на 0.
6. Измените значение InstallOnWin7Server с 1 на 0.
7. Сохраните и закройте baseline.dat
8. Запустите установщик с соответствующим командным ключом setup.exe /web из папки в которую были извлечены файлы на в шаге 2.
Примечание: Обратите внимание, что на шаге 8 обязательно нужно использовать ключ /web , не указав который установщик не будет скачивать нужные для установки пакеты, что может привести к неправильной установке.

После того, как Windows Phone SDK установлен – уже можно говорить непосредственно об автоматизации. Для этого мы будем использовать Powershell, который и является средством автоматизации. Скрипты Powershell можно выполнять и в Windows 7, вопрос автоматизировать сборку не на сервере – это вопрос целесообразности. Тем не менее, это возможно, тем более если никогда не сталкивались с Powershell и хотите просто попробовать. На всякий случай вот ссылка на уроки по Powershell: http://blog.wadmin.ru/2011/08/powershell-lessons-first-script/ .
Сценарий действий для автоматизированной сборки вы можете придумать сами. Но вот те сценарии, которые могут быть полезны: изменение версии сборки в манифесте приложения, замена тайла или другого изображения на такое же с артефактами версии и времени сборки (когда приложение еще в разработке – ещё даже может и не быть таких разделов как «О приложении» и т.п.), что позволит тестировщикам легко отличать версии тестируемых сборок, а такая идентификация будет накладываться автоматически.
Вот простенький пример скрипта:

$version = "1.02.00.00"
$SolutionPath = "C:UsersUserDocumentsVisual Studio 2010ProjectsPhoneApp1"
$Solution = $SolutionPath + "PhoneApp1.sln"
$SolutionBin = $SolutionPath + "PhoneApp1Bin"
$LogFile = $SolutionBin + "Build.log"
$VStudio2010= "C:Program Files (x86)Microsoft Visual Studio 10.0Common7IDEdevenv.exe"
$releases = $SolutionPath + "Releases"
$build        = $SolutionBin + "ReleasePhoneApp1.xap"
$buildArchive = $releases +    "PhoneApp1-" + $version + ".xap"
function replace
{
    $o = $args[0]
    $a = $args[1]
    $b = $args[2]
    (Get-Content $o) |
    Foreach-Object {$_ -replace $a, $b} |
    Set-Content $o
}
$AssemblyInfo = $SolutionPath + "PhoneApp1PropertiesAssemblyInfo.cs"
$filter = 'AssemblyVersion("d+.d+.d+.d+")'
$newstring = 'AssemblyVersion("' + $version + '")'
replace $AssemblyInfo $filter $newstring
$filter = 'AssemblyFileVersion("d+.d+.d+.d+")'
$newstring = 'AssemblyFileVersion("' + $version + '")'
replace $AssemblyInfo $filter $newstring
$manifest = $SolutionPath + "PhoneApp1PropertiesWMAppManifest.xml"
$filter = 'Version="d+.d+.d+.d+"'
$newstring = 'Version="' + $version + '"'
replace $manifest $filter $newstring
& $VStudio2010 $Solution /clean | Out-Null
& $VStudio2010 $Solution /rebuild release /out $logfile | Out-Null
copy $build $buildarchive

Какие же действия выполняет скрипт? В переменной $version мы задаем новую версию сборки, которую мы зададим в файле манифеста. В $SolutionPath задаем путь к папке, в которой хранится проект. $SolutionBin – для адреса папки со сборками приложения. $LogFile –путь с именем файла для хранения лога выполнения процесса сборки. $releases – для пути к папке, в которой будет сохраняться конечная сборка с изменённым названием файла (надо заметить что в данном скрипте мы не проверяем наличие папок, так что в данном конкретном случае эту папку надо будет создать). $build – для пути к папки в которой компилятор будет сохранять готовую сборку. $buildArchive – путь с именем конечной сборки (в имя, для наглядности, мы включим номер сборки).
Скрипт заменяет (с помощью регулярных выражений) в файлах манифеста версию сборки и версию файла. После этого запускается Visual Studio для компиляции проекта, с соответствующим ключом для сохранения лога процесса сборки (при желании лог можно тоже обработать, если процесс сборки прошёл удачно, или наоборот — неудачно). Затем файл сборки копируется в конечную папку, имя файла изменяется (в него включается версия сборки).

Более сложные сценарии вы можете придумать и реализовать самостоятельно.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *