2016-07-31 22 views
2

ここで提案されていることを完了しました:Deploy from Visual Studio Online build to private IIS server ...ブランチ全体を構築すると、ビルドの一部として自動デプロイメントをセットアップするにはどうすればいいですか?**/*.slnVisual Studio Team ServicesのビルドからプライベートIISサーバーに展開する

私が試してみました何...

VSで私は、コードの最新バージョンを取得するソリューションを開き、... は、右クリック>パブリッシュ>パブリッシュプロファイルを選ぶ>

を展開することができます私は、 "dev"、 "qa"、 "production"のような公開プロフィールをプロジェクトに配備する環境を指しています。プロファイルにはVSを配備するために必要なすべての設定情報が含まれます(webdeploy/msdeploy)を使用して、そのアプリケーションを「ワンクリックデプロイ」します。

ビルドサーバーでTeam Servicesにコードをビルドした後に定義された公開プロファイルを持つプロジェクトと全く同じことをしたいと思います。私の理解では、私はちょうどこのようにMSBuildの引数を追加することができますということでした

...

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"と呼ばれるグループをサーバーに追加し、問題の新しいアカウントとそのボックスのadminsグループを追加しました。

私は、Web Deployment AgentサービスとTeam Services Agentサービスの両方にこのアカウントで実行するように指示してから、再起動しました。

残念ながら結果は同じです... msdeployコマンドに使用されているアカウントを確実にする方法を知りたいのですが、スクリプトの読み込みに頼ることなく期待しています。マイクロソフトではこれを既定のTeam Servicesの展開ステップオプションとして設定していません。

答えて

2

[OK]をので、私はこのことについて、マイクロソフトではオーバー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ビルド引数を追加します。コマンドラインタスクを使用して、IISサイトにMSDeployパッケージを展開します。ここでWebDeploy /場合msdeployの作品からの詳細については、以下のとおりです。

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

+0

私は既にVSを使っていますが、私は1クリックのデプロイを行っていますが、私のプロジェクトはビルドして公開しています(MSDeployの公開プロファイルを使用しています)、公開プロファイルをMSDeployサービスパッケージを作成する)...どうやらVSOのビルドでは、スクリプトを作成して変数を設定し、サーバーURLを認証して保存するような変数を持つパッケージをビルドする代わりに、これらのプロファイルを公開することはできないでしょうか?私の既存のプロフィールを公開しています...あれば、どうですか? – War

+0

これを実現するには、VSOビルドのargリストに "/ p:DeployOnBuild = true/p:PublishProfile = "を追加する必要があります。 – chief7

+0

ええ私はそれをしました...うまくいかないようです、それで私はこの質問をしました:( – War

0

私はこれをいつもしています。私がしたことは、リリースタブでリリースをセットアップし、デプロイメントグループを有効にするためにサインアップしたことでした。アカウントで展開グループを有効にしたら(これを有効にするには、MSに連絡する必要があります)。私は、私が展開したいそれぞれのマシンで動くPSスクリプトをダウンロードすることができました。その後、リリース画面で、展開グループで実行する手順を設定し、ローカルサーバー上でさまざまなパブリッシュタスクを実行して、動作させることができます。

デプロイメントグループを使用すると、ロードバランスをとると負荷分散サーバーの一部に一度に展開できるため、優れたソリューションです。アプリが全期間に亘って滞在できるようにします。

関連する問題