2016-07-31 141 views
2

部署到私有IIS服务器做完建议什么位置:Deploy from Visual Studio Online build to private IIS server ...我怎么设置自动展开时为我构建的一部分,当我建立一个整支**/*.sln从构建在Visual Studio团队服务

我已经试过......

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

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

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

我的理解是,我可以只添加的MSBuild ARGS这样的...

Build Step - With deploy

这导致构建抛出以下异常到构建日志的展开部...

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部署代理服务和Team Services Agent服务都要在此帐户下运行(并重新启动它们)。

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

回答

2

好了,所以我不得不与VSTS团队一些的长对话在微软这件事,长,短的是...

微软:

我们理解这个领域和大项目的挫折 约旋转起来,以解决此问题

...

我做我自己,想出了一些“诀窍来实现它”。

我设法弄清楚,出于某种奇怪原因的构建框不能与您部署的服务器相同(不知道为什么),但是已经想通了,我写了一个简单的控制台应用程序,并附带一些额外的反馈从微软出来相当不错。

它甚至会向进程报告进度,并且可以将异常作为异常记录在部署中,以便通过调用“内部命令”来破坏构建(整体而言,这是如何以团队的方式为团队工作的)。

在这里有一些黑客,它不是完美的,但希望它可以帮助别人,我称之为,因为它是在我的回购中构建的代码的一部分,所以我可以添加一步到构建进程在构建输出中调用它,传递我想要部署到的环境名称。

这在燕鸥抓住所有的包(按照上面的设置),并使用其发布配置文件来找出软件包需要去并将它们发送到将要部署正确的服务器...

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; 
     } 
    } 
} 
0

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

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

+0

我已经得到过VS这个工作已经我有1次点击部署工作,但我的项目只是构建和发布(使用MSDeploy发布配置),我已经发布配置文件设置为直接部署到MSDeploy服务(而不是只创建一个包)......我不能以某种方式让VSO的构建使用这些发布配置文件,而不是构建一个包,这意味着编写脚本并在各处都有变量来处理诸如身份验证和存储服务器URL之类的内容,所有这些都已经在我现有的发布配置文件中......如果是这样,如何? – War

+0

是的,你应该能够添加 “/ P:DeployOnBuild = TRUE/P:PublishProfile = <配置文件名>” 你VSO构建ARG列表做到这一点。 – chief7

+0

星爷我已经做了......似乎没有工作,这就是为什么我结束了问这个问题:( – War

0

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

使用部署组是一个很好的解决方案,因为如果你有它负载均衡,将部署到只有在时间的负载平衡服务器的一部分。允许应用程序保持整个时间。

相关问题