Как я могу заставить TFS2010 запускать MSDEPLOY для меня через MSBUILD?
Существует отличный PDC-разговор доступный здесь от Vishal Joshi, в котором описываются новые функции MSDEPLOY в Visual Studio 2010, а также как развернуть приложение в TFS. (Там также отличный разговор от Скотт Гензельман, но он не входит в TFS).
Вы можете использовать MSBUILD в TFS2010 для вызова MSDEPLOY для развертывания вашего пакета в IIS. Это делается с помощью параметров для MSBUILD.
В этом разделе объясняются некоторые параметры командной строки, такие как:
/p:DeployOnBuild
/p:DeployTarget=MsDeployPublish
/p:CreatePackageOnPublish=True
/p:MSDeployPublishMethod=InProc
/p:MSDeployServiceURL=localhost
/p:DeployIISAppPath="Default Web Site"
Но где документация для этого - я не могу найти?
Я проводил весь день, пытаясь заставить это работать, и не может понять это правильно и продолжать приводить к различным ошибкам. Если я запускаю пакетный файл cmd
, он отлично развертывается. Если я запускаю WebDeploy через Visual Studio, он отлично работает.
Но я хочу, чтобы все развертывание выполнялось через msbuild
, используя эти аргументы, а не отдельный вызов msdeploy
или запуск пакета .cmd
. Как я могу это сделать?
PS. Да, у меня работает Web Deployment Agent Service
. У меня также есть служба управления, работающая под IIS. Я пробовал использовать оба.
Арги, которые я использую:
/p:DeployOnBuild=True
/p:DeployTarget=MsDeployPublish
/p:Configuration=Release
/p:CreatePackageOnPublish=True
/p:DeployIisAppPath=staging.example.com
/p:MsDeployServiceUrl=https://staging.example.com:8172/msdeploy.axd
/p:AllowUntrustedCertificate=True
давая мне:
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets(2660): сбой VsMsdeploy. (Удаленный агент (URL https://staging.example.com:8172/msdeploy.axd?site=staging.example.com). Убедитесь, что служба удаленного агента установлена и запущена на целевом компьютере.) Подробности об ошибке: Удаленный агент (URL https://staging.example.com:8172/msdeploy.axd?site=staging.example.com) не удалось связаться. Убедитесь, что служба удаленного агента установлена и запущена на целевом компьютере. Был получен неподдерживаемый ответ. Заголовок ответа 'MSDeploy.Response' был '', но ожидалось 'v1'. Удаленный сервер возвратил ошибку: (401) Неавторизованный.
Ответы
Ответ 1
Ответ, связанный с IIS7 +....
Хорошо - вот что я в итоге сделал. Более или менее, следуя сообщению Саймон Уивер в этой теме/вопросе.
Но когда дело доходит до настроек MSBuild, большинство пользователей здесь используют следующую настройку: /p:MSDeployPublishMethod=RemoteAgent
, которая для IIS7 НЕ ПРАВИЛЬНО. Использование этого параметра означает, что TFS пытается подключиться к URL: https://your-server-name/MSDEPLOYAGENTSERVICE
Но для доступа к этому URL-адресу пользователь для аутентификации должен быть администратором. Который перевернулся. (И вам нужно, чтобы правило администратора было отменено). Этот URL-адрес для IIS6, я думаю.
Здесь стандартное сообщение об ошибке при попытке подключения с помощью RemoteAgent: -
Стандарт 401 Frak Off u suck RemoteAgent, ошибка
C:\Program Files (X86)\MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets(3588): задача развертывания сети не удалось. (Удаленный агент (URL-адрес) http://your-web-server/MSDEPLOYAGENTSERVICE) не удалось связаться. Убедитесь, что служба удаленного агента установлена и запущен на целевом компьютере.) Сделайте убедитесь, что имя сайта, имя пользователя и пароль правильный. Если проблема не разрешены, пожалуйста, свяжитесь с вашим локальный или серверный администратор. ошибка подробности: Удаленный агент (URL http://your-web-server/MSDEPLOYAGENTSERVICE) не удалось связаться. Убедитесь, что служба удаленного агента установлена и начался на целевом компьютере. был получен неподдерживаемый ответ. ответный заголовок 'MSDeploy.Response' был "V1", но ожидалось "v1". удаленный сервер возвратил ошибку: (401) Несанкционированное.
Итак, вам нужно изменить MSDeployPublishMethod
на это:
/p:MSDeployPublishMethod=WMSVC
WMSVC
означает службу диспетчера Windows. Это, в основном, новая оболочка над удаленным агентом, но теперь позволяет нам исправить предоставление имени пользователя и пароля.. где пользователь НЕ должен быть администратором! (радость!) Итак, теперь вы можете исправить набор, к которому пользователи хотят иметь доступ... на веб-сайт.
![enter image description here]()
Теперь он также пытается ударить по URL: https://your-web-server:8172/MsDeploy.axd
< - что ТОЧНО, что делает окно Visual Studio 2010 Publish
! (OMG → PENNY DROPS!! BOOM!)
![enter image description here]()
И здесь мои окончательные настройки MSBuild:
/p:DeployOnBuild=True
/p:DeployTarget=MSDeployPublish
/p:MSDeployPublishMethod=WMSVC
/p:MsDeployServiceUrl=your-server-name
/p:DeployIISAppPath=name-of-the-website-in-iis7
/p:username=AppianMedia\some-domain-user
/p:password=JonSkeet<3<3<3
/p:AllowUntrustedCertificate=True
Обратите внимание, что имя пользователя имеет в нем имя домена? Мне нужно это, там. Кроме того, на моем снимке я разрешил нашим пользователям DOMAIN доступ к сайту для управления. Таким образом, моя новая учетная запись пользователя, добавленная мной (TFSBuildService), имеет членство в группе Domain Users
... так, как все работает.
Теперь - если вы все это прочитали, у вас есть lolcat (потому что они SOOOOOOOO 2007)....
![enter image description here]()
Ответ 2
Вот шаги, которые, наконец, сработали для меня.
Я хотел получить работу с RemoteAgent, но не мог получить эту работу независимо от того, что я пробовал.
Вам не нужно делать именно так, но я так понял, что работал
- Настроить WMSVC
- Убедитесь, что служба запущена.
- Настройте пользователя IIS (нажмите "TOP MOST SERVERNAME" в IIS) и перейдите к "Диспетчеру IIS". Я предлагаю сделать это иначе, чем имя вашего окна.
- Убедитесь, что учетная запись пользователя WMSVC (LOCAL SERVICE для меня) имеет права на запись в каталог IIS, который вы используете.
- В моем случае я использую SSL-сертификат (даже если он попадает в localhost).
Помните, что все аргументы в MSBUILD добавлены в определение сборки TFS
/p:DeployOnBuild=True
/p:DeployTarget=MSDeployPublish
/p:MSDeployPublishMethod=WMSVC
/p:MsDeployServiceUrl=https://staging.example.com:8172/msdeploy.axd
/p:username=sweaveriis
/p:password=abcd1234
/p:DeployIisAppPath=staging.example.com/virtual_directory_name
/p:AllowUntrustedCertificate=True
Примечание. staging.example.com на самом деле является локальным полем с записью hosts file, указывающей на 127.0.0.1. Localhost, вероятно, тоже будет работать здесь.
Полезные статьи:
Устранение проблем MSDeploy
Другие способы устранения неполадок
Ответ 3
К сожалению, на данный момент информации об этом мало. Я дам вам несколько советов в конце этого сообщения.
О вашей проблеме, я видел это раньше, когда я пытался развернуть с использованием MSDeploy, и учетная запись, в которой я была запущена, не имела разрешений на выполнение развертывания на целевой машине. Поэтому вам нужно взглянуть на учетную запись, в которой работают ваши сборки, и посмотреть, имеет ли эта учетная запись права на развертывание на целевой машине. Если нет, то у вас есть несколько вариантов; предоставить пользователю сборщика права или передать имя пользователя/пароль.
Если вы хотите передать значения, тогда вам нужно будет определить элемент с именем MsDeployDestinationProviderSetting
, и его метаданные должны будут содержать необходимые значения.
Итак, в вашем файле проекта (или через переданные свойства) определите что-то вроде следующего.
<PropertyGroup>
<UserName>USERNAME-HERE</UserName>
<Password>PASSWORD-HERE
</PropertyGroup>
О том, где вы можете найти документацию, как я уже говорил, там еще немного. Но так как весь трафик веб-публикаций захвачен в целях и задачах MSBuild, вы можете узнать много, если вы знакомы с MSBuild. Если вы посмотрите файлы .csproj(или .vbproj) для веб-проектов, созданных с помощью Visual Studio 2010, вы увидите инструкцию вроде следующего:
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />
Импортирует файл, расположенный по адресу
%ProgramFiles(x86)%\MSBuild\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets
, и этот файл в свою очередь импортирует
%ProgramFiles(x86)%\MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets
Итак, чтобы подробно изучить эту тему сейчас, вам нужно проверить эти файлы и узнать сами.
Я собираюсь работать над чем-то, что будет подробно описывать эти технологии, но это не будет долгое время, и мне еще предстоит многое узнать о себе.
Можете ли вы опробовать соглашение о имени пользователя и пароле и сообщить мне, если он сработает для вас?
Ответ 4
У меня была аналогичная проблема, и решение должно было иметь следующий параметр:
/р: MSDeployPublishMethod = RemoteAgent
Вот все параметры, которые я использовал.
/p: DeployOnBuild = True/p: DeployTarget = MSDeployPublish/p: MSDeployPublishMethod = RemoteAgent/p: MsDeployServiceUrl = http://my-server-name/p: username = myusername/p: password = mypassword
ПРИМЕЧАНИЕ. Я не использую DeployIisAppPath, потому что я создаю решение и пытаюсь создать сразу три веб-приложения. Также я думаю, что ваш MsDeployServiceUrl должен быть просто http://staging.example.com
Похоже, что при использовании InProc (который может быть по умолчанию) для MSDeployPublishMethod MSBuild игнорирует MsDeployServiceUrl и всегда пытается развернуть его на локальный сервер. Я изменил его на RemoteAgent, и все три моих веб-приложения были успешно развернуты. Я заметил, что файл пакета является nolonger, содержащимся в папке MyWebApplication_Package, но для меня это не очень важно.
Ответ 5
Обратите внимание, что вы также можете установить DeployTarget = Package - это подготовит пакет, но не разворачивает его сразу. Для получения дополнительной информации см. этот пост в блоге.
Ответ 6
Для меня проблема заключалась в том, что Web Deployment Agent Service
не запускался.
Простой net start msdepsvc
исправил его. Вы также можете настроить режим запуска на "Автоматически" для этой службы.
Аргументы, которые я использую:
/p:DeployOnBuild=True
/p:DeployTarget=MsDeployPublish
/p:MSDeployPublishMethod=RemoteAgent
/p:MSDeployServiceUrl=stagingserver
/p:DeployIisAppPath=test.local
/p:UserName=
Вам нужно указать имя сервера, а не полный путь (не нужно http).
Обратите внимание, что UserName остается пустым, чтобы обойти ошибку с проверкой подлинности NTLM (таким образом он использует учетные данные агента сборки TFS для развертывания). см. принятый ответ здесь
Ответ 7
Вот как я заработал. Это было с Webdeploy 2.0. Я развертываю в том же домене с нашей машины для сборки на сервере Windows Server 2008 r2 сервера веб-сервера dev. Учетная запись, которую я использую для развертывания, - это учетная запись службы в домене с правами администратора на обеих машинах. Мое решение включает в себя пару проектов unit test, проект mvc3 и несколько библиотек в рамках решения. Если вы не установите MVC3 на сервере, который вы развертываете, чтобы посмотреть http://www.iwantmymvc.com/2011-03-23-bin-deploy-aspnet-mvc-3-visual-studio для руководства.
/p: DeployOnBuild = True/p: DeployTarget = MSDeployPublish/p: DeployIisAppPath = "Веб-сайт по умолчанию /YourpplicationNameHere " /p:MsDeployServiceUrl=https://devserver02:8172/msdeploy.axd/p: AllowUntrustedCertificate = True/p: UserName = yourDomain\buildaccount/p: Пароль = пароль
-
Элемент, с которым я столкнулся сначала, - это цитаты вокруг "Default Web Site/YourpplicationNameHere". Это дает частичную ошибку:
MSBUILD: ошибка MSB1008: Можно указать только один проект.
Это происходит, когда нет кавычек вокруг веб-сайта по умолчанию /YourApplicationNameHere
-
Следующая ошибка, которую я получил, связана с неправильным именем пользователя и паролем в моих учетных данных для развертывания. Он дал эту ошибку:
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets(3588): Не удалось выполнить задачу развертывания сети (удаленный агент (URL https://devserver02:8172/msdeploy.axd?site=Default Веб-сайт не удалось связаться. Убедитесь, что служба удаленного агента установлена и запущена на целевом компьютере.) Убедитесь, что имя сайта, имя пользователя, и пароль правильный. Если проблема не устранена, обратитесь к местному администратору или администратору сервера. Сведения об ошибке: Удаленный агент (URL https://devserver02:8172/msdeploy.axd?site=Default Веб-сайт) не удалось связаться. Убедитесь, что служба удаленного агента установлена и запущена на целевом компьютере. Был получен неподдерживаемый ответ. Заголовок ответа 'MSDeploy.Response' был '', но ожидалось 'v1'. Удаленный сервер возвратил ошибку: (401) Неавторизованный.
Это произошло потому, что имя пользователя и пароль, которые у меня были в /p: UserName =/p: Password =, не включали домен для пользователя. Несмотря на то, что сборка была запущена под этим пользователем, она не будет развертываться. Таким образом, я ударил по URL прямо https://devserver02:8172/msdeploy.axd в браузере, чтобы убедиться, что он работает, и убедитесь, что имя пользователя и пароль сработали. Здесь я заметил, что мне нужно было ввести домен/пользователя, чтобы он работал.
Я надеюсь, что это нормально, чтобы ответить. Я подумал, что другая бедная душа найдет эти ошибки, и это может помочь...
Ответ 8
Если вы можете развернуть свои приложения с помощью fileCopy, для этого легко настроить рабочий процесс TFS.
Я использовал операцию CopyDirectory с помощью этих статей:
http://www.ewaldhofman.nl/post/2010/11/09/Part-14-Execute-a-PowerShell-script.aspx
и
http://geekswithblogs.net/jakob/archive/2010/09/01/tfs-team-build-2010-how-to-place-the-build-output.aspx
Очень простой и понятный.
-
Я настроил службу построения с учетной записью пользователя, которая имеет права на запись на нужном общем ресурсе.
-
Затем я создал рабочий процесс CopyDirectory, настроив исходный код как BuildDetail.DropLocation + "_PublishedWebsites", и для адресата я создал аргумент, который я назвал "DeployPath", который может быть заполнен в конфигурации сборки.
-
Теперь мне еще нужно выполнить тест, чтобы проверить, была ли сборка успешной, перед вызовом операции CopyDirectory. В статьях, которые я упоминал, показано, как это сделать. Они также учат, как вызывать powershell script вместо CopyDirectory.