【问题标题】:Deploying to a private IIS server from a build in Visual Studio Team Services从 Visual Studio Team Services 中的构建部署到专用 IIS 服务器
【发布时间】:2016-07-31 14:00:43
【问题描述】:

已完成此处建议的操作:Deploy from Visual Studio Online build to private IIS server ...当我构建整个分支**/*.sln 时,如何将自动部署设置为构建的一部分?

我尝试过的...

在 VS 中,我可以获得最新版本的代码,打开解决方案,然后... 右键单击 > 发布 > 选择发布配置文件 > 部署

我已将我的发布配置文件命名为“dev”、“qa”、“production”,这些是指将部署项目的环境,并且配置文件包含 VS 部署所需的所有配置信息(通过 webdeploy / msdeploy)使用“一键部署”该应用程序。

我希望构建服务器上的 Team Services 对在构建代码后定义了发布配置文件的项目执行完全相同的操作。

我的理解是我可以像这样添加 msbuild args ...

这会导致构建的部署部分在构建日志中抛出以下异常...

C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\Web\Microsoft.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.)

如果不是发布配置文件中定义的用户,这使用的是什么用户?

相关问题:

我向有问题的服务器添加了一个帐户(因为要部署到的构建和服务器是同一台服务器,这使事情变得更容易),我还向服务器添加了一个名为“MSDepSvcUsers”的组,并将新帐户添加到向它和盒子上的管理员组提问。

然后我告诉 Web 部署代理服务和团队服务代理服务在此帐户下运行(并重新启动它们)。

不幸的是结果是一样的......我现在真的很想知道如何确保用于 msdeploy 命令的帐户是我所期望的,而不依赖于大量脚本......或者这就是为什么微软尚未将此设置为 Team Services 中的默认部署步骤选项!

【问题讨论】:

    标签: iis deployment azure-devops azure-pipelines


    【解决方案1】:

    好的,所以我与微软的 VSTS 团队就这个问题进行了长时间的交谈,总而言之……

    微软:

    我们理解您对这个领域的不满,一个大项目是 即将启动以解决此问题

    ...

    我就是我,想出了一些“实现它的窍门”。

    由于某种奇怪的原因,我设法弄清楚构建框也不能是您正在部署的同一台服务器(不知道为什么),但发现我编写了一个简单的控制台应用程序,并获得了一些额外的反馈微软的表现相当不错。

    它甚至可以将进度报告回进程,并可以将部署中的异常记录为异常,以便通过调用“内部命令”来使构建失败(通过向团队致敬的方式,这是如何工作的)。

    这里有一些 hack,它并不完美,但希望它能对其他人有所帮助,我之所以这样称呼它是因为它是在我的 repo 中构建的代码的一部分,因此我可以在构建过程中添加一个步骤从构建输出中调用它,传递我要部署到的环境名称。

    这在 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;
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      不,您不需要大量的 PS 脚本来实现这一点。 MSDeploy.exe 是一个非常有用的工具,可能可以满足您的需求。将 /t:Package 构建参数添加到您的 VS 构建任务以创建包。然后使用命令行任务将 MSDeploy 包部署到您的 IIS 站点。以下是有关 WebDeploy/MSDeploy 工作的更多详细信息:

      http://www.dotnetcatch.com/2016/02/25/the-anatomy-of-a-webdeploy-package/

      【讨论】:

      • 我已经通过 VS 完成了这项工作 我已经 1 单击部署工作但我的项目只是构建和发布(使用 MSDeploy 发布配置文件),我将发布配置文件设置为直接部署到 MSDeploy服务(而不仅仅是创建一个包)......我能不能让 VSO 的构建使用这些发布配置文件而不是构建一个包,这意味着编写脚本并在各处使用变量来处理诸如身份验证和存储服务器 URL 之类的事情,所有这些都已经在我现有的发布配置文件中......如果是这样,如何?
      • 是的,您应该能够将“/p:DeployOnBuild=true /p:PublishProfile=”添加到您的 VSO 构建参数列表中以完成此操作。
      • 是的,我已经做到了......似乎不起作用,这就是我最终问这个问题的原因:(
      • 我把我的问题缩小到这个问题:stackoverflow.com/questions/38936190/…
      【解决方案3】:

      我一直这样做。我所做的是在“发布”选项卡中设置发布并注册以启用部署组。在您的帐户上启用部署组后(需要联系 MS 以启用此功能)。我可以下载我在要部署到的每台机器上运行的 PS 脚本。然后在“发布”屏幕中,我可以设置在部署组中运行的步骤,然后在本地服务器上运行各种发布任务,让它们工作。

      使用部署组是一个很好的解决方案,因为如果您对其进行负载平衡,它将一次仅部署到负载平衡服务器的一部分。让应用程序一直保持开启状态。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多