Развертывание на частном сервере 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.)


Какого пользователя он использует, если не пользователя, определенного в профиле публикации?



Смежные вопросы:




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



Затем я попросил службу агента веб-развертывания и Службу агента Team Services работать под этой учетной записью (и перезапустил их).

К сожалению, результат тот же самый ... Теперь я действительно хочу знать, как я могу гарантировать, что учетная запись, используемая для команды msdeploy, является тем, что я ожидаю, не полагаясь на куча сценариев ... или, может быть, именно поэтому Microsoft еще не настроила этот параметр в качестве шага развертывания по умолчанию в Team Services!
760   3  

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

    Ничего не найдено.