2016-07-31 37 views
2

Nach getan, was hier vorgeschlagen wird: ... wie ich automatische Bereitstellungen als Teil meines Builds einrichten, wenn ich einen vollständigen Zweig erstellen **/*.sln?Bereitstellung auf einem privaten IIS-Server von einem Build in Visual Studio Team Services

Was ich versucht habe ...

In VS kann ich die neueste Version des Codes erhalten, öffnen Sie eine Lösung und dann ... Rechtsklick> Veröffentlichen> Pick-Profil veröffentlichen> bereitstellen

Ich habe meine Veröffentlichungsprofile wie "dev", "qa", "production" genannt. Diese beziehen sich auf die Umgebungen, in denen das Projekt bereitgestellt wird, und die Profile enthalten alle Konfigurationsinformationen, die VS für die Bereitstellung benötigt (über webdeploy/msdeploy) mit der Anwendung "one click deploy".

Ich möchte Team Services auf dem Build-Server genau das gleiche für Projekte haben, die Veröffentlichungsprofile definiert haben, nachdem es den Code erstellt hat.

Mein Verständnis war, dass ich konnte nur die msbuild args wie folgt hinzufügen ...

Build Step - With deploy

dies führt in der Bereitstellung Teil des Build-in auf dem Build-Protokoll die folgende Ausnahme zu werfen ...

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.) 

Welcher Benutzer verwendet dies, wenn nicht der Benutzer im Veröffentlichungsprofil definiert?

Verwandte Themen:

Ich habe ein Konto auf dem Server in Frage (da der Aufbau und Server bereitgestellt werden, um die gleichen Server es Dinge gemacht einfacher), ich habe auch eine Gruppe auf den Server namens "MSDepSvcUsers" hinzugefügt und hinzugefügt das neue Konto in Frage zu ihm und die Admins-Gruppe auf der Box.

Ich habe dann sowohl den Web Deployment Agent-Dienst als auch den Team Services Agent-Dienst angewiesen, unter diesem Konto zu laufen (und neu gestartet).

Leider ist das Ergebnis das gleiche ... Ich möchte jetzt wirklich wissen, wie ich das Konto, das für den Msdeploy-Befehl verwendet wird, sicherstellen möchte, ohne auf viele Skripts angewiesen zu sein ... oder vielleicht deshalb Microsoft hat diese Option noch nicht als Standardbereitstellungsschrittoption in Team Services eingerichtet!

Antwort

2

Ok, so habe ich einige lange Gespräche mit dem VSTS Team über bei Microsoft über dieses und die lange und kurze davon ist hatte ...

Microsoft:

Wir verstehen Ihre Frustration mit diesem Bereich und ein großes Projekt im Begriff ist, um dieses Problem zu spin up zu lösen

...

Me mir zu sein, kam mit einem "Trick, um es zu tun".

Ich habe herausgefunden, dass die Build-Box aus irgendeinem seltsamen Grund nicht derselbe Server sein kann, den Sie auch einsetzen (keine Ahnung warum), aber nachdem ich das herausgefunden habe, habe ich eine einfache Konsolen-App geschrieben, die etwas zusätzliches Feedback enthält von Microsoft kam ziemlich gut raus.

Es meldet sogar den Fortschritt zurück zu dem Prozess und kann Ausnahmen in der Bereitstellung als Ausnahmen protokollieren, um den Build durch den Aufruf "interner Befehle" (ordentlich, wie dies funktioniert übrigens für das Team).

Es gibt einige Hacks hier und es ist nicht perfekt, aber hoffentlich wird es jemand anderem helfen, ich nenne das, weil es Teil des Codes ist, der in meinem Repo gebaut wird, so dass ich einen Schritt in den Build hinzufügen kann Prozess, um dies innerhalb der Build-Ausgabe aufzurufen und den Umgebungsnamen zu übergeben, für den ich bereitstellen möchte.

Das in tern packt alle Pakete (gemäß den Einstellungen oben) und nutzt ihre Profile veröffentlichen, um herauszufinden, wo die Pakete gehen müssen und sendet sie an den richtigen Server eingesetzt werden ...

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

Nein, Sie brauchen nicht eine Tonne PS-Skripte, um dies zu erreichen. MSDeploy.exe ist ein unglaublich nützliches Tool, das wahrscheinlich Ihre Bedürfnisse abdecken kann. Fügen Sie das Build-Argument/t: Package zu Ihrer VS-Build-Task hinzu, um ein Paket zu erstellen. Verwenden Sie anschließend eine Befehlszeilenaufgabe, um das MSDeploy-Paket auf Ihrer IIS-Site bereitzustellen. Hier sind weitere Einzelheiten zu den aus WebDeploy/MSDeploy funktioniert:

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

+0

Ich habe das funktioniert durch VS bereits ich habe 1 Klick implementiert funktioniert, aber meine Projekte nur erstellen und veröffentlichen (mit einem MSDeploy veröffentlichen Profil), ich habe die Veröffentlichungsprofile für die Bereitstellung direkt auf den MSDeploy-Dienst (statt nur Erstellen eines Pakets) ... kann ich nicht irgendwie die Builds von VSO nutzen, anstatt ein Paket zu erstellen, das bedeutet, Skripte zu schreiben und überall Variablen zu haben, um Dinge wie auth zu behandeln und die Server-URL zu speichern, was schon alles ist in meinen bestehenden Veröffentlichungsprofilen ... wenn ja, wie? – War

+0

Ja, Sie sollten in der Lage sein, "/ p: DeployOnBuild = true/p: PublishProfile = " zu Ihrer VSO-Build-Arg-Liste hinzuzufügen, um dies zu erreichen. – chief7

+0

Yeh ich habe das getan ... scheint nicht zu funktionieren, deshalb habe ich am Ende diese Frage gestellt :( – War

0

Ich mache das die ganze Zeit. Was ich getan habe, war, ein Release in der Release-Registerkarte einzurichten und sich für die Aktivierung von Deployment-Gruppen zu registrieren. Sobald Sie eine Deployment-Gruppe für Ihr Konto aktiviert haben, müssen Sie MS kontaktieren, um dies zu aktivieren. Ich könnte PS-Skript herunterladen, das ich auf jedem der Computer ausführen, auf denen ich bereitstellen möchte. Dann kann ich im Bildschirm "Release" die Schritte konfigurieren, die in einer Deployment-Gruppe ausgeführt werden. Anschließend werden die verschiedenen Veröffentlichungsaufgaben auf dem lokalen Server ausgeführt, damit sie funktionieren können.

Die Verwendung der Bereitstellungsgruppen ist eine hervorragende Lösung, da die Lastverteilung nur für einen Teil der Lastenausgleichsserver gleichzeitig erfolgt. Lassen Sie die App die ganze Zeit aufbleiben.