Развертывание на частном сервере IIS из сборки в Visual Studio Team Services
Выполнив то, что предлагается здесь: развертывание из Visual Studio Online build на частный сервер IIS
... как настроить автоматическое развертывание как часть сборки, когда я создаю целую ветвь **/*.sln?
То, что я пробовал ...
В VS я могу получить последнюю версию кода, открыть решение и затем ...
щелкните правой кнопкой мыши > опубликовать > выбрать профиль публикации > развернуть
Я назвал свои профили публикации такими словами, как "dev", "qa", "production", они относятся к средам в котором будет развернут проект и профили содержат всю информацию о конфигурации, необходимую для развертывания VS (через webdeploy / msdeploy) с помощью "One click deploy" этого приложения.
Я хочу, чтобы службы Team Services на сервере сборки делали то же самое для проектов, которые имеют профили публикации, определенные после сборки кода.
Я понимал, что могу просто добавить Арги msbuild вот так ...
Это приводит к часть развертывания сборки, вызывающая следующее исключение в журнале сборки ...
C:Program Files (x86)MSBuildMicrosoftVisualStudiov14.0WebMicrosoft.Web.Publishing.targets(4288,5):
Error ERROR_USER_NOT_ADMIN: Web deployment task failed.
(Connected to 'server' using the Web Deployment Agent Service, but could not authorize. Make sure you are an administrator on 'server'.
Learn more at: http://go.microsoft.com/fwlink/?LinkId=221672#ERROR_USER_NOT_ADMIN.)
Какого пользователя он использует, если не пользователя, определенного в профиле публикации?
Смежные вопросы:
публикация через службу сборки TFS завершается с ошибкой "пользователь не администратор"
сборки TFS: запуск сборок от имени администратора
Я добавил учетную запись на рассматриваемый сервер (так как сборка и сервер, на котором будет развернут, являются одним и тем же сервером это облегчило задачу), я также добавил группу на сервер под названием "Msdepsvc-пользователи" и добавил новую учетную запись, о которой идет речь, и группу администраторов на коробке.
Затем я попросил службу агента веб-развертывания и Службу агента Team Services работать под этой учетной записью (и перезапустил их).
К сожалению, результат тот же самый ... Теперь я действительно хочу знать, как я могу гарантировать, что учетная запись, используемая для команды msdeploy, является тем, что я ожидаю, не полагаясь на куча сценариев ... или, может быть, именно поэтому Microsoft еще не настроила этот параметр в качестве шага развертывания по умолчанию в Team Services!
3 ответов:
Итак, у меня было несколько долгих разговоров с командой VSTS в Microsoft об этом и о том, что это долго и коротко ...
Microsoft:
Мы понимаем ваше разочарование в этой области, и большой проект-это о том, чтобы раскрутить, чтобы решить эту проблему
...
Я, будучи собой, придумал какой-то"трюк, чтобы это произошло".
Мне удалось выяснить, что поле сборки по какой-то странной причине не может быть тем же сервером, который вы тоже развертываете (нет идея почему) , но поняв это, я написал простое консольное приложение, которое с некоторой дополнительной обратной связью от Microsoft вышло довольно хорошим.
Он даже сообщает о ходе процесса и может регистрировать исключения в развертывании как исключения, чтобы не выполнить сборку, вызывая "внутренние команды" (аккуратно, как это работает, кстати, слава команде за это).
Здесь есть некоторые хаки, и это не идеально, но, надеюсь, это поможет кому-то еще, я называю это потому, что это часть кода, которая собирается в моем РЕПО, так что я могу добавить шаг в процесс сборки, чтобы вызвать это из выходных данных сборки, передавая имя среды, в которой я хочу развернуть.
Это в tern захватывает все пакеты (в соответствии с настройками выше) и использует их профили публикации, чтобы выяснить, где пакеты должны идти и отправляет их на правильные серверы для развертывания ...
using System; using System.Diagnostics; using System.IO; using System.Reflection; namespace Deploy { class Program { static string msDeployExe = @"C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe"; static void Main(string[] args) { var env = args[0]; var buildRoot = Path.Combine(Assembly.GetExecutingAssembly().Location.Replace("Deploy.exe", ""), env); //var commands = GetCommands(buildRoot); var packages = new DirectoryInfo(buildRoot).GetFiles("*.zip", SearchOption.AllDirectories); bool success = true; for (int i = 0; i < packages.Length; i++) { if (!Deploy(packages[i], env)) success = false; Console.WriteLine("##vso[task.setprogress]" + (int)(((decimal)i / (decimal)packages.Length) * 100m)); } Console.WriteLine("##vso[task.setprogress]100"); if(success) Console.WriteLine("##vso[task.complete result=Succeeded]"); else Console.WriteLine("##vso[task.complete result=SucceededWithIssues]"); } static bool Deploy(FileInfo package, string environment) { bool succeeded = true; Console.WriteLine("Deploying " + package.FullName); var procArgs = new ProcessStartInfo { FileName = msDeployExe, UseShellExecute = false, RedirectStandardOutput = true, RedirectStandardError = true, Arguments = "-source:package='" + package.FullName + "' " + "-dest:auto,ComputerName='" + environment + ".YourDomain.com',UserName='deployment user',Password='password',AuthType='ntlm',IncludeAcls='False' " + "-verb:sync " + "-disableLink:AppPoolExtension " + "-disableLink:ContentExtension " + "-disableLink:CertificateExtension " + "-setParamFile:\"" + package.FullName.Replace("zip", "SetParameters.xml") + "\"" }; try { Console.WriteLine(msDeployExe + " " + procArgs.Arguments); using (var process = Process.Start(procArgs)) { var result = process.StandardOutput.ReadToEnd().Split('\n'); var error = process.StandardError.ReadToEnd(); process.WaitForExit(); if (!string.IsNullOrEmpty(error)) { Console.WriteLine("##vso[task.logissue type=error]" + error); succeeded = false; } foreach (var l in result) if (l.ToLowerInvariant().StartsWith("error")) { Console.WriteLine("##vso[task.logissue type=error]" + l); succeeded = false; } else Console.WriteLine(l); } } catch (Exception ex) { succeeded = false; Console.WriteLine("##vso[task.logissue type=error]" + ex.Message); Console.WriteLine("##vso[task.logissue type=error]" + ex.StackTrace); } return succeeded; } } }
Нет, вам не нужна тонна сценариев PS, чтобы достичь этого. Средства msdeploy.exe-это невероятно полезный инструмент, который, вероятно, может удовлетворить ваши потребности. Добавить параметр /t:пакет построить аргумент против ваших задач построения для создания пакета. Затем используйте задачу командной строки для развертывания пакета MSDeploy на сайте IIS. Вот более подробная информация о работе out WebDeploy/MSDeploy:
Http://www.dotnetcatch.com/2016/02/25/the-anatomy-of-a-webdeploy-package/
Я делаю это все время. Я настроил релиз на вкладке релиз и зарегистрировался, чтобы включить группы развертывания. После того, как у вас есть группа развертывания включена на вашей учетной записи (необходимо связаться с MS, чтобы получить это включено). Я мог бы загрузить сценарий PS, который я запускаю на каждой из машин, на которых я хочу развернуть. Затем на экране выпуска я могу настроить шаги для запуска в группе развертывания, а затем различные задачи публикации запускаются на локальном сервере, позволяя им работать.
Использование группы развертывания-это отличное решение, поскольку при наличии сбалансированной нагрузки они будут развертываться одновременно только на части серверов с балансировкой нагрузки. Позволяя приложению оставаться на связи все время.

Comments