2012-03-14 10 views
0

私は非常にうまくやっているかもしれませんが、わかりません。私は、IIS ExpressがインストールされているWindows XPマシンでTeamCityビルドエージェントを設定しようとしています。私はIIS Expressを起動するビルドステップを作成し、それを停止する別のビルドステップを作成したいと考えています。TeamCityでIIS Expressをどのように起動および停止しますか?

私がコマンドラインビルドステップを作成することができますが、次のようなコマンドを使用して、IIS Expressのインスタンスを開始します。

"C:\Program Files\IIS Express\iisexpress.exe" /path:%1\src\Web /port:80 /systray:false 

これは、サーバーを起動しますが、その後、私のログは「停止するには 『Q』を入力語りますIIS Express "となり、このステップは待機します。私はビルド・ステップを待つことを望んでいません。ビルドを次のステップに進めたい。

誰もがこれについて考えていますか?

答えて

2

iisexpress.exeとまったく同じ引数をとる単純なラッパー実行ファイルまたはバッチファイルを作成し、そのラッパーは指定されたコマンドライン引数を使用してiisexpress.exeを起動してすぐに戻ることができます。

+0

感謝を。私は何かが組み込まれていないかどうか疑問に思っていたが、私はそうは思わない。 –

+0

私はこれが古かったことを知っていますが、私はいくつかの有益なプロセス上の考慮事項でこの答えを以下に展開しました。この質問に将来の訪問者を助けるためにこれを掲示する。 –

4

答えは単純なバッチファイルを書くよりも複雑です。ほとんどの場合、IIS Expressが起動するまで待ってから、いくつかの機能を実行してから再度IIS Expressプロセスを停止する必要があります。

この最後の段階は、複数のビルドで重複したサイトを開始しないようにするために重要です。エラーや誤解を招く結果を招きます。私たちはまた、プロセスを慎重に管理して、 'press Q to quit'プロンプトが私たちのアプリが継続してコアの機能を実行するのを妨げないようにする必要があります。

ここで私がPhantom.JSを実行するためにC#でコンソールアプリケーション用に書いたコードは、それだけでなく、エラーが発生したシナリオを正常に処理する必要があります。

using System; 
using System.Diagnostics; 
using System.Threading.Tasks; 

internal class Program 
{ 
    private static int Main(string[] args) 
    { 
     string iisExpressPath = args[0]; 
     string websitePath = args[1]; 
     string websitePort = args[2]; 
     string phantomJSPath = args[3]; 
     string jsControllerPath = args[4]; 

     var startIisTask = StartIis(iisExpressPath, websitePath, websitePort); 

     Process iisexpress; 
     try 
     { 
      iisexpress = startIisTask.Result; 
     } 
     catch (Exception) 
     { 
      Console.Write("An error occurred while starting IIS express"); 
      return -1; 
     } 

     if (iisexpress != null) 
     { 
      var phantomJS = new Process(); 
      phantomJS.StartInfo.FileName = phantomJSPath; 
      phantomJS.StartInfo.Arguments = jsControllerPath; 

      phantomJS.StartInfo.UseShellExecute = false; 
      phantomJS.StartInfo.RedirectStandardOutput = true; 

      var tcs = new TaskCompletionSource<bool>(); 

      phantomJS.Start(); 

      Task.Run(
       () => 
       { 
        string str; 
        while ((str = phantomJS.StandardOutput.ReadLine()) != null) 
        { 
         if (str == "Unable to load the address!") 
         { 
          tcs.SetException(new ArgumentException(str)); 
          return; 
         } 

         Console.WriteLine(str); 
        } 

        tcs.SetResult(true); 
       }); 

      try 
      { 
       var complete = tcs.Task.Result; 
      } 
      catch (Exception) 
      { 
       phantomJS.Kill(); 
       iisexpress.Kill(); 
       return -1; 
      } 

      iisexpress.Kill(); 
      return 0; 
     } 

     Console.Write("An error occurred while starting IIS express"); 
     return -1; 
    } 

    private static Task<Process> StartIis(string iisExpressPath, string websitePath, string websitePort) 
    { 
     var tcs = new TaskCompletionSource<Process>(); 

     var iisexpress = new Process(); 
     iisexpress.StartInfo.FileName = iisExpressPath; 
     iisexpress.StartInfo.Arguments = string.Format("/path:{0} /port:{1}", websitePath, websitePort); 
     iisexpress.StartInfo.RedirectStandardOutput = true; 
     iisexpress.StartInfo.UseShellExecute = false; 
     iisexpress.EnableRaisingEvents = true; 

     // Implicit capture is ok here as we are capturing an object we need later. 
     iisexpress.Exited += IisexpressOnExited(tcs); 

     iisexpress.Start(); 

     Task.Run(
      () => 
      { 
       string str; 
       while ((str = iisexpress.StandardOutput.ReadLine()) != null) 
       { 
        if (str.Contains("IIS Express is running")) 
        { 
         iisexpress.Exited -= IisexpressOnExited(tcs); 
         tcs.SetResult(iisexpress); 
        } 
       } 
      }); 

     return tcs.Task; 
    } 

    private static EventHandler IisexpressOnExited(TaskCompletionSource<Process> tcs) 
    { 
     return (sender, args) => tcs.TrySetCanceled(); 
    } 
} 

アプリは、パイプは、それ自身のコンソールにphantom.jsの出力は、あなたは、クライアント側のユニットテストを実行するためにそれを使用することができますので、しかし、同じように簡単にホスティング必要とするかもしれない任意のビルドステップに適合させることができます。あなたはより多くの情報が必要な場合は、IISでチームシティー内からジャスミンのユニットテストを実行する方法についての私の記事を参照してください

は表現:あなたの応答のためのhttp://roysvork.wordpress.com/2013/03/29/running-jasmine-tests-hosted-in-iis-express-as-part-of-a-teamcity-build/

+0

これは天才です! – jcvandan

+0

著者がここに含まれているリンクに問題はありません。それは補完的なものであり、必要な情報はすべて実際には答えであり、完全に免責されています。それを残すか? –

関連する問題