2016-07-31 177 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屏幕中,我可以設置要在部署組中運行的步驟,然後在本地服務器上運行各種發佈任務以允許它們工作。

使用部署組是一個很好的解決方案,因爲如果你有它負載均衡,將部署到只有在時間的負載平衡服務器的一部分。允許應用程序保持整個時間。

相關問題