Сбой MSBuild на TFS — пакет WebDeploy

В настоящее время я работаю над сборкой проекта, но столкнулся с трудностями со сборкой TFS.
Я просто хочу создать zip-пакет, используя сборку TFS, с параметрами из IIS Express.

Конфигурация CSPROJ: Web Упаковать/Опубликовать в Интернете

IIS Express присутствует на моей машине и на сервере сборки (я могу получить доступ к файлам *.svc в проекте).
И все находится на системе контроля версий.

Когда я использую «Пакет развертывания сборки» на своем компьютере, у меня есть zip-архив.
Когда я использую «Пакет развертывания сборки» на сервере сборки, у меня есть zip-архив.
Когда я использую командная строка MSBuild на обоих, у меня есть почтовый индекс.

Рассматриваемая командная строка:

"C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe" "C:\WORKSPACES\[...]\Project.csproj" /p:Platform=AnyCPU;Configuration=Release /p:DeployTarget=Package /p:DeployOnBuild=true;DefaultPackageFileName=ZipName.zip

Но когда я помещаю ту же командную строку в сборку, она терпит неудачу:

"C:\Builds\2\[...]\Project.csproj" (default target) (1) ->
(PackageUsingManifest target) -> 
  C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets(3009,5): error : Web deployment task failed.(Object of type 'manifest' and path 'C:\Builds\2\Project Release\Binaries\_PublishedWebsites\Project_Package\Project.SourceManifest.xml' cannot be created.) [C:\Builds\2\[...]\Project.csproj]
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets(3009,5): error :  [C:\Builds\2\[...]\Project.csproj]
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets(3009,5): error : Object of type 'manifest' and path 'C:\Builds\2\Project Release\Binaries\_PublishedWebsites\Project_Package\Project.SourceManifest.xml' cannot be created. [C:\Builds\2\[...]\Project.csproj]
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets(3009,5): error : One or more entries in the manifest 'sitemanifest' are not valid. [C:\Builds\2\[...]\Project.csproj]
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets(3009,5): error : Site '' does not exist. [C:\Builds\2\[...]\Project.csproj]

Дополнительная информация, строка 3009 относится к:

<VSMSDeploy Condition="!$(UseMsdeployExe)"
   MSDeployVersionsToTry="$(_MSDeployVersionsToTry)"
   Source="@(MsDeploySourceProviderSetting)"
   Destination="@(MsDeployDestinationProviderSetting)"
   DeploymentTraceLevel="$(PackageTraceLevel)"
   DisableLink="$(PackageDisableLinks)"
   EnableLink="$(PackageEnableLinks)"
   DeclareParameterItems="@(_Package_MsDeployDeclareParameters)"
   OptimisticParameterDefaultValue="$(EnableOptimisticParameterDefaultValue)"
   ImportDeclareParametersItems="$(_VsPackageParametersFile)"
   ReplaceRuleItems="@(MsDeployReplaceRules)"
   RetryAttempts="$(RetryAttemptsForDeployment)">

Я знаю, что что-то упускаю, но я не понимаю, что... так что, если у вас есть предложения... буду очень рад! :)

Сборка tfs не запускалась с той же учетной записью, что и я, когда я вошел на сервер сборки.
Хорошо ли IIS Express запускается со сборкой tfs?
Когда я смотрю в C:\Users\svcTfsBuild\Documents, каталог IISExpress отсутствует. , как и у моего пользователя (svcTfsBuild — это учетная запись службы для сборки TFS).

Основная цель:

  • Получите zip-пакет со сборкой tfs с этими параметрами (parameters.xml внутри zip-пакета).
  • ИЛИ
  • Имейте zip-пакет, в котором мы можем указать пул приложений и физический путь при импорте.

Нравится:

<parameters>
  <parameter name="IIS Web Application Name" defaultValue="Default Web Site/Project" tags="IisApp">
    <parameterEntry kind="ProviderPath" scope="AppHostConfig" match="^ProjectTest/Project$" />
    <parameterEntry kind="ProviderPath" scope="contentPath" match="^C:\\WORKSPACES\\[...]\\obj\\Release\\Package\\PackageTmp$" />
    <parameterEntry kind="ProviderPath" scope="setAcl" match="^C:\\WORKSPACES\\[...]\\obj\\Release\\Package\\PackageTmp$" />
  </parameter>
  <parameter name="IIS Web Application Pool Name" defaultValue="ASP.NET v4.0">
    <parameterEntry kind="DeploymentObjectAttribute" scope="application" match="application[@applicationPool='Clr4IntegratedAppPool']/@applicationPool" />
  </parameter>
  <parameter name="IisVirtualDirectoryPhysicalPath" defaultValue="D:\CompanyName\Project" tags="PhysicalPath">
    <parameterEntry kind="DestinationVirtualDirectory" scope=".*" match="^C:\\WORKSPACES\\[...]$" />
  </parameter>
</parameters>

Примечание. Мы можем указать конфигурацию в файле parameters.xml непосредственно в csproj, потому что рабочее пространство на наших машинах не совпадает с сервером сборки tfs...

надеюсь это понятно

EDIT: предложение от drk

Как вы сказали, я запускаю командную строку из учетной записи службы и, в частности, получил следующее:

GenerateMsdeployManifestFiles:
  Generate source manifest file for Web Deploy package/publish ...
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets(2850,5): error MSB4018: The "IsCleanMSDeployPackageNeeded" task failed unexpectedly. [C:\WORKSPACES\[...]\Project.csproj]
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets(2850,5): error MSB4018: System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> Microsoft.Web.Deployment.DeploymentException: Object of type 'package' and path 'C:\WORKSPACES\[...]\obj\Release\Package\Project.zip' cannot be created. ---> Microsoft.Web.Deployment.DeploymentException: The Zip package 'C:\WORKSPACES\[...]\obj\Release\Package\Project.zip' could not be loaded. ---> System.UnauthorizedAccessException: Access to the path 'C:\WORKSPACES\[...]\obj\Release\Package\Project.zip' is denied. [C:\WORKSPACES\[...]\Project.csproj]
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets(2850,5): error MSB4018:    at Microsoft.Web.Deployment.Win32Native.RaiseIOExceptionFromErrorCode(Win32ErrorCode errorCode, String maybeFullPath) [C:\WORKSPACES\[...]\Project.csproj]
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets(2850,5): error MSB4018:    at Microsoft.Web.Deployment.FileStreamEx.CreateInstance(String path, FileMode fileMode, FileAccess fileAccess, FileShare fileShare) [C:\WORKSPACES\[...]\Project.csproj]
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets(2850,5): error MSB4018:    at Microsoft.Web.Deployment.ZipFile.Load() [C:\WORKSPACES\[...]\Project.csproj]
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets(2850,5): error MSB4018:    at Microsoft.Web.Deployment.ZipPackageProvider..ctor(DeploymentProviderContext providerContext, DeploymentBaseContext baseContext, String path) [C:\WORKSPACES\[...]\Project.csproj]
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets(2850,5): error MSB4018:    --- End of inner exception stack trace --- [C:\WORKSPACES\[...]\Project.csproj]
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets(2850,5): error MSB4018:    at Microsoft.Web.Deployment.ZipPackageProvider.GetAttributes(DeploymentAddAttributeContext addContext) [C:\WORKSPACES\[...]\Project.csproj]
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets(2850,5): error MSB4018:    at Microsoft.Web.Deployment.DeploymentObject.EnsureValidAttributes() [C:\WORKSPACES\[...]\Project.csproj]
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets(2850,5): error MSB4018:    --- End of inner exception stack trace --- [C:\WORKSPACES\[...]\Project.csproj]
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets(2850,5): error MSB4018:    at Microsoft.Web.Deployment.DeploymentManager.CreateObjectPrivate(DeploymentProviderContext providerContext, DeploymentBaseOptions baseOptions, DeploymentObject sourceObject) [C:\WORKSPACES\[...]\Project.csproj]
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets(2850,5): error MSB4018:    at Microsoft.Web.Deployment.DeploymentManager.CreateObject(DeploymentProviderOptions providerOptions, DeploymentBaseOptions baseOptions) [C:\WORKSPACES\[...]\Project.csproj]
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets(2850,5): error MSB4018:    at Microsoft.Web.Deployment.DeploymentManager.CreateObject(String provider, String path, DeploymentBaseOptions baseOptions) [C:\WORKSPACES\[...]\Project.csproj]
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets(2850,5): error MSB4018:    at Microsoft.Web.Deployment.DeploymentManager.CreateObject(DeploymentWellKnownProvider provider, String path) [C:\WORKSPACES\[...]\Project.csproj]
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets(2850,5): error MSB4018:    --- End of inner exception stack trace --- [C:\WORKSPACES\[...]\Project.csproj]
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets(2850,5): error MSB4018:    at System.RuntimeMethodHandle._InvokeMethodFast(IRuntimeMethodInfo method, Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeType typeOwner) [C:\WORKSPACES\[...]\Project.csproj]
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets(2850,5): error MSB4018:    at System.RuntimeMethodHandle.InvokeMethodFast(IRuntimeMethodInfo method, Object target, Object[] arguments, Signature sig, MethodAttributes methodAttributes, RuntimeType typeOwner) [C:\WORKSPACES\[...]\Project.csproj]
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets(2850,5): error MSB4018:    at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks) [C:\WORKSPACES\[...]\Project.csproj]
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets(2850,5): error MSB4018:    at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) [C:\WORKSPACES\[...]\Project.csproj]
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets(2850,5): error MSB4018:    at System.RuntimeType.InvokeMember(String name, BindingFlags bindingFlags, Binder binder, Object target, Object[] providedArgs, ParameterModifier[] modifiers, CultureInfo culture, String[] namedParams) [C:\WORKSPACES\[...]\Project.csproj]
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets(2850,5): error MSB4018:    at Microsoft.Web.Publishing.Tasks.DynamicAssembly.CallStaticMethod(String typeName, String methodName, Object[] arguments) [C:\WORKSPACES\[...]\Project.csproj]
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets(2850,5): error MSB4018:    at Microsoft.Web.Publishing.Tasks.IsCleanMSDeployPackageNeeded.Execute() [C:\WORKSPACES\[...]\Project.csproj]
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets(2850,5): error MSB4018:    at Microsoft.Build.BackEnd.TaskExecutionHost.Microsoft.Build.BackEnd.ITaskExecutionHost.Execute() [C:\WORKSPACES\[...]\Project.csproj]
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets(2850,5): error MSB4018:    at Microsoft.Build.BackEnd.TaskBuilder.ExecuteInstantiatedTask(ITaskExecutionHost taskExecutionHost, TaskLoggingContext taskLoggingContext, TaskHost taskHost, ItemBucket bucket, TaskExecutionMode howToExecuteTask, Boolean& taskResult) [C:\WORKSPACES\[...]\Project.csproj]
Done Building Project "C:\WORKSPACES\[...]\Project.csproj" (default targets) -- FAILED.

Build FAILED.

Я проверил учетную запись службы (в моем случае SvcTfsBuild). Он имеет полный контроль над рабочей областью (поэтому исходный код). И моя учетная запись, и учетная запись SvcTfsBuild находятся в одной группе (локальный администратор).

Но журнал TFS BUILD (подробный режим) не показал никаких проблем с разрешениями...

ИЗМЕНИТЬ 25 марта 2013 г.

Я снял флажок "Использовать IIS Express" на вкладке "Веб".
Сборка создает хороший zip-архив.
Итак, я предполагаю, что проблема только с IIS Express.< /эм>

В сборке у меня был «InvokeProcess» в последовательности «Run On Agent» сразу после «CreateLabel».
Он запускает ISS Express с такими аргументами:

/site:Project-Site

В файле журнала у меня есть результат 0 (поэтому я предполагаю, что ISS Express успешно запущен, если нет, он должен генерировать исключение). Но, если командная строка неправильно сформирована или неверна (т.е. с /site и /path, которые не могут быть объединены), результат также равен 0.
И если я запускаю ISS Express таким образом, сборка останавливается ( iisexpress дождитесь ручного действия, чтобы остановить или просто прослушать).

ИЗМЕНИТЬ 2 25 марта 2013 г.

Чтобы запустить IIS Express одновременно со сборкой, я сделал следующее: TFBUILD

На Parallel у меня есть переменная с именем «BuildFinished», для которой установлено значение «Истина» в «Окончательно» процесса сборки (слева).

Но у меня опять та же ошибка (Сайт '' не существует).

Я также обнаружил разницу между двумя файлами Project.SourceManifest.xml при сборке через «Пакет развертывания сборки» (в VS2010) и через TFBUILD.

Сборка пакета развертывания:

<?xml version="1.0" encoding="utf-8"?>
<sitemanifest>
  <appHostConfig path="Project-Site/Project" />
  <contentPath path="C:\WORKSPACES\Project\obj\Release\Package\PackageTmp" />
  <setAcl path="C:\WORKSPACES\Project\obj\Release\Package\PackageTmp" setAclResourceType="Directory" />
  <setAcl path="C:\WORKSPACES\Project\obj\Release\Package\PackageTmp" setAclUser="anonymousAuthenticationUser" setAclResourceType="Directory" />
</sitemanifest>

TFBUILD:

<?xml version="1.0" encoding="utf-8"?>
<sitemanifest>
  <appHostConfig path="/Project" />
  <contentPath path="C:\Builds\1\Project\obj\Release\Package\PackageTmp" />
  <setAcl path="C:\Builds\1\Project\obj\Release\Package\PackageTmp" setAclResourceType="Directory" />
  <setAcl path="C:\Builds\1\Project\obj\Release\Package\PackageTmp" setAclUser="anonymousAuthenticationUser" setAclResourceType="Directory" />
</sitemanifest>

Значение пути не то же самое.


person kerrubin    schedule 22.03.2013    source источник
comment
Я бы предложил запустить команду под учетной записью службы сборки, чтобы увидеть полный вывод, звучит как проблема с разрешениями. Под какой учетной записью работает сборка tfs?   -  person drk    schedule 22.03.2013
comment
Вы правы в вопросе разрешения с учетной записью службы. Я отредактировал вопрос с соответствующим выводом.   -  person kerrubin    schedule 22.03.2013
comment
Попробуйте создать этот файл вручную под учетной записью svc, проверьте разрешения или права собственности, если он существует и в папке, также может быть связан с UAC.   -  person drk    schedule 22.03.2013
comment
Что ж, я сделал то, что вы предлагаете. Это лучше. Теперь у меня те же ошибки, что и в сборке ^^ (Сайт '' не существует.)   -  person kerrubin    schedule 22.03.2013
comment
Я вручную запускаю IIS Express, а затем строю из командной строки. Оно работает. Но даже если IIS Express запускается для учетной записи службы, сборка завершается с тем же сообщением. Итак, на сегодня я закончил, следующий выпуск в понедельник.   -  person kerrubin    schedule 22.03.2013


Ответы (1)


После пары попыток я думаю, что проблема связана с IIS Express и MSDeploy, которые не могут работать вместе (это тот, который говорит «Site '' does not exist.»).

Итак, вместо того, чтобы пытаться заставить его работать, мы передумали использовать конфигурацию, которая работает: изменение csproj во время процессов сборки, чтобы использовать IIS.

Шаг 1: IIS на сервере сборки

  1. Создайте пул приложений: важны две вещи: имя и версия Framework. Больше ничего.
  2. Создайте приложение: важны имя и пул приложений. Вы можете использовать C:\temp в качестве физического пути.

Шаг 2. Определение сборки
У вас есть два варианта: создать собственное действие сборки (лучше) или сделать это внутри xaml (некрасиво).
Цель состоит в том, чтобы выполнить следующие шаги:

  1. В последовательности «Выполнить на агенте», сразу после «Если создать метку»
  2. Удалите атрибут только для чтения в целевом csproj (тот, который находится в рабочей области, созданной TFS).
  3. Прочтите содержимое csproj
  4. Замените следующие теги XML

<UseIISExpress>True</UseIISExpress> от <UseIISExpress>False</UseIISExpress>
<UseIIS>False</UseIIS> от <UseIIS>True</UseIIS>
<IncludeIisSettings>False</IncludeIisSettings> от <IncludeIisSettings>true</IncludeIisSettings>
<IISUrl>{IIS Express URL}</IISUrl> от <IISUrl>{IIS URL}</IISUrl>
/!\ Осторожно: логические значения могут быть True или True!
/!\ Beware2: при использовании Cassini Тег IISUrl может иметь перенос слов, например:

`<IISUrl>  
</IISUrl>`  

Это произошло только с одной из 4 машин разработчика.

{IIS Express URL}: похоже на http://localhost:8080/ или http://localhost:8080/Application для IIS Express или пусто для Cassini.
{IIS URL}: похоже на http://localhost/Application.


И, наконец, перезапишите csproj (помните, тот, что находится в рабочей области TFS, а не в системе управления версиями) с измененным содержимым.

{IIS Express URL} и {IIS URL} могут быть аргументами сборки, но только в том случае, если сборка принимает csproj один за другим (1 сборка = 1 zip-пакет, поэтому необходимо изменить 1 csproj).



С этим решением (думаю, есть лучшее, которого я не знаю) мы используем конфигурацию, которая, как мы знаем, работает.

Когда zip-пакет будет импортирован в IIS, пул приложений и физический путь могут быть изменены.
И это наша цель.

Надеюсь это поможет.

person kerrubin    schedule 04.04.2013