Развертывание определенной сборки

Джейсон Ли

В этом разделе описывается развертывание веб-пакетов и скриптов базы данных из определенной предыдущей сборки в новое место назначения, например промежуточной или рабочей среды.

Этот раздел является частью серии учебников, основанных на требованиях к развертыванию предприятия вымышленной компании Fabrikam, Inc. В этой серии учебников используется пример решения — решение Contact Manager— для представления веб-приложения с реалистичным уровнем сложности, включая приложение MVC 3 ASP.NET MVC 3, службу Windows Communication Foundation (WCF) и проект базы данных.

Метод развертывания в центре этих учебников основан на подходе к разделенному файлу проекта, описанному в разделе "Общие сведения о файле проекта", в котором процесс сборки и развертывания управляется двумя файлами проекта — одним из которых содержатся инструкции по сборке, которые применяются к каждой конечной среде, а также один из них содержит параметры сборки и развертывания для конкретной среды. Во время сборки файл проекта для конкретной среды объединяется в файл проекта, не зависящем от среды, чтобы сформировать полный набор инструкций по сборке.

Обзор задачи

До сих пор в этом наборе учебников основное внимание уделяется созданию, пакету и развертыванию веб-приложений и баз данных в рамках одношагового или автоматизированного процесса. Однако в некоторых распространенных сценариях вам необходимо выбрать ресурсы для развертывания из заданного списка сборок в папке сброса. Другими словами, последняя сборка может не быть сборкой, которую вы хотите развернуть.

Рассмотрим сценарий непрерывной интеграции (CI), описанный в предыдущем разделе, создание определения сборки, поддерживающее развертывание. Вы создали определение сборки в Team Foundation Server (TFS) 2010. Каждый раз, когда разработчик проверяет код в TFS, Team Build создает код, создает веб-пакеты и скрипты базы данных в рамках процесса сборки, выполняет все модульные тесты и развертывает ресурсы в тестовой среде. В зависимости от политики хранения, настроенной при создании определения сборки, TFS будет хранить определенное количество предыдущих сборок.

В зависимости от политики хранения, настроенной при создании определения сборки, T F S будет хранить определенное количество предыдущих сборок. =======

Теперь предположим, что вы выполнили тестирование на проверку и валидацию одной из этих сборок в тестовой среде и готовы развернуть приложение в среде стадии подготовки. В то же время разработчики, возможно, проверили новый код. Вы не хотите снова скомпилировать проектное решение и развернуть его в тестовой среде, и не хотите развертывать последнюю сборку в этой же среде. Вместо этого необходимо развернуть конкретную сборку, проверенную и прошедшую валидацию на тестовых серверах.

Для этого необходимо сообщить подсистеме сборки Майкрософт (MSBuild), где найти веб-пакеты и скрипты баз данных, созданные определенной сборкой.

Переопределение свойства OutputRoot

В примере решения файл Publish.proj объявляет свойство OutputRoot. Как предполагает имя, это корневая папка, содержащая все, что создает процесс сборки. В файле Publish.proj можно увидеть, что свойство OutputRoot ссылается на корневое расположение для всех ресурсов развертывания.

Замечание

OutputRoot — это часто используемое имя свойства. Файлы проекта Visual C# и Visual Basic также объявляют это свойство для хранения корневого расположения для всех результатов сборки.

<PropertyGroup>
  <!--This is where the .deploymanifest file will be written to during a build-->    
  <_DbDeployManifestPath>
    $(OutputRoot)ContactManager.Database.deploymanifest
  </_DbDeployManifestPath>    
  
  <!-- The folder where the .zip and .cmd file will be located for 
                ContactManager.Mvc Web project -->
  <_ContactManagerDest>
    $(OutputRoot)_PublishedWebsites\ContactManager.Mvc_Package\
  </_ContactManagerDest>
  
  <!-- The folder where the .zip and .cmd file will be located for 
                ContactManager.Service Web project -->
   <_ContactManagerSvcDest>
    $(OutputRoot)_PublishedWebsites\ContactManager.Service_Package\
  </_ContactManagerSvcDest>
  
  <!-- ... -->
</PropertyGroup>

Если вы хотите, чтобы файл проекта развертывал веб-пакеты и скрипты базы данных из другого расположения, например выходные данные предыдущей сборки TFS, необходимо просто переопределить свойство OutputRoot . Необходимо задать значение свойства для соответствующей папки сборки на сервере Team Build. Если вы работали с MSBuild из командной строки, можно указать значение outputRoot в качестве аргумента командной строки:

msbuild.exe Publish.proj /p:TargetEnvPropsFile=EnvConfig\Env-Dev.proj 
  /p:OutputRoot=\\TFSBUILD\Drops\DeployToTest\DeployToTest_20120228.3\

Однако на практике вы также захотите пропустить цель сборки — нет смысла компилировать решение, если вы не собираетесь использовать результаты сборки. Это можно сделать, указав целевые объекты, которые нужно выполнить из командной строки:

msbuild.exe Publish.proj /p:TargetEnvPropsFile=EnvConfig\Env-Dev.proj 
  /p:OutputRoot=\\TFSBUILD\Drops\DeployToTest\DeployToTest_20120228.3\
  /target:GatherPackagesForPublishing;PublishDBPackages;PublishWebPackages

Однако в большинстве случаев необходимо создать логику развертывания в определении сборки TFS. Это позволяет пользователям с разрешением на построение очередей запустить развертывание из любой инсталляции Visual Studio с подключением к серверу TFS.

Создание определения сборки для развертывания конкретных сборок

В следующей процедуре описывается создание определения сборки, позволяющего пользователям активировать развертывания в промежуточной среде с помощью одной команды.

В этом случае вы не хотите, чтобы конфигурация сборки строила что-либо — вы просто хотите, чтобы она выполняла логику развертывания в пользовательском файле проекта. Файл Publish.proj содержит условную логику, которая пропускает целевой объект сборки , если файл запущен в Team Build. Это делается путем вычисления встроенного свойства BuildingInTeamBuild , которое автоматически присваивается значение true при запуске файла проекта в Team Build. В результате можно пропустить процесс сборки и просто запустить файл проекта для развертывания существующей сборки.

Создание определения сборки для запуска развертывания вручную

  1. В Visual Studio 2010 в окне Team Explorer разверните узел команды, щелкните правой кнопкой мыши Сборки и выберите Создать новое определение сборки.

    В Visual Studio 2010 в окне Team Explorer разверните узел проекта команды, щелкните правой кнопкой мыши сборку и щелкните

  2. На вкладке "Общие " укажите определение сборки (например, DeployToStaging) и необязательное описание.

  3. На вкладке "Триггер" выберите "Вручную" — фиксации изменений не инициируют новую сборку.

  4. На вкладке "Сборка по умолчанию" в поле Скопировать результаты сборки в следующую папку сброса введите путь универсального соглашения о именовании (UNC) к вашей папке сброса (например, \TFSBUILD\Drops).

    На вкладке

  5. На вкладке "Процесс" в раскрывающемся списке файла процесса сборки оставьте выбранным DefaultTemplate.xaml. Это один из шаблонов процессов сборки по умолчанию, которые добавляются во все новые проекты команд.

  6. В таблице параметры процесса сборки щелкните строку "Элементы для сборки" и нажмите кнопку с тремя точками.

    В таблице параметров процесса сборки щелкните строку "Элементы для сборки" и затем нажмите кнопку с многоточием.

  7. В диалоговом окне "Элементы для сборки" нажмите кнопку "Добавить".

  8. В раскрывающемся списке "Элементы типа" выберите файлы проекта MSBuild.

  9. Перейдите к расположению пользовательского файла проекта, с помощью которого вы управляете процессом развертывания, выберите файл и нажмите кнопку "ОК".

    Перейдите к расположению пользовательского файла проекта, с помощью которого вы управляете процессом развертывания, выберите файл и нажмите кнопку

  10. В диалоговом окне "Элементы для сборки" нажмите кнопку "ОК".

  11. В таблице параметров процесса сборки разверните раздел "Дополнительно ".

  12. В строке аргументов MSBuild укажите расположение файла проекта для конкретной среды и добавьте заполнитель для расположения папки сборки:

    /p:TargetEnvPropsFile=EnvConfig\Env-Stage.proj;
    OutputRoot=PLACEHOLDER
    

    В строке аргументов MSBuild укажите расположение файла проекта для конкретной среды и добавьте заполнитель для расположения папки сборки.

    Замечание

    Необходимо переопределить значение OutputRoot при каждой очереди сборки. Это рассматривается в следующей процедуре.

  13. Нажмите кнопку Сохранить.

При активации сборки необходимо обновить свойство OutputRoot , чтобы указать на сборку, которую требуется развернуть.

Развертывание конкретной сборки из определения сборки

  1. В окне Team Explorer щелкните правой кнопкой мыши определение сборки, а затем выберите Поставить новую сборку в очередь.

    В окне Team Explorer щелкните правой кнопкой мыши определение сборки и нажмите кнопку

  2. В диалоговом окне Сборка очереди на вкладке Параметры разверните раздел Дополнительно.

  3. В строке аргументов MSBuild замените значение свойства OutputRoot расположением папки сборки. Рассмотрим пример.

    /p:TargetEnvPropsFile=EnvConfig\Env-Stage.proj;
       OutputRoot=\\TFSBUILD\Drops\DeployToTest\DeployToTest_20120228.3\
    

    В строке аргументов MSBuild замените значение свойства OutputRoot расположением папки сборки.

    Замечание

    Не забудьте включить косую черту в конце пути к папке сборки.

  4. Нажмите очередь.

Когда вы ставите сборку в очередь, файл проекта развернет скрипты базы данных и веб-пакеты из папки распределения сборки, указанной в свойстве OutputRoot.

Conclusion

В этом разделе описана публикация ресурсов развертывания, таких как веб-пакеты и скрипты базы данных, из конкретной предыдущей сборки с помощью модели развертывания файлов проекта. В нем объясняется, как переопределить свойство OutputRoot и как включить логику развертывания в определение сборки TFS.

Дальнейшее чтение

Дополнительные сведения о создании определений сборки см. в разделе "Создание базового определения сборки " и "Определение процесса сборки". Дополнительные сведения о постановке сборок в очередь см. в разделе "Постановка сборки в очередь".