2012-03-14 23 views
0

我可能會做一些奇怪的事情,但我不確定。我正在嘗試在裝有IIS Express的Windows XP機器上配置TeamCity構建代理。我想創建一個構建步驟,啓動IIS Express,然後創建一個步驟來阻止它。如何從TeamCity中啓動和停止IIS Express?

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

這將啓動服務器,但後來我的日誌說:「進入‘Q’停止:

我可以創建一個命令行構建步驟類似如下的命令啓動IIS Express實例IIS Express「並且步驟等待。我不想讓構建步驟等待。我希望構建進入下一步。

有沒有人對此有任何想法?

回答

2

編寫一個簡單的包裝程序可執行文件或批處理文件,它採用與iisexpress.exe完全相同的參數,並且該包裝程序可以使用給定的命令行參數啓動iisexpress.exe並立即返回。

+0

感謝您的答覆。我想知道我是否缺少內置的東西,但我猜不是。 – 2012-03-14 16:20:11

+0

我知道這是舊的,但我已經在下面擴展了這個答案,並提供了一些有用的過程注意事項。發佈此信息可以幫助未來的訪問者解決這個問題。 – 2013-03-29 23:39:22

4

答案比編寫一個簡單的批處理文件更復雜,因爲在大多數情況下,您需要等到IIS express啓動,然後執行某些功能,然後再次停止IIS Express過程。

這最後一個階段對於避免啓動具有多個構建的重複站點很重要,這會導致錯誤和誤導結果。我們還需要仔細管理流程,以便「按Q退出」提示不會阻止我們的應用繼續執行並執行其核心功能。

下面是我在C#中爲控制檯應用程序編寫的一些代碼,以運行Phantom.JS,而不僅僅是這樣做,它還應該優雅地處理出現錯誤的場景。

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到它自己的控制檯輸出,使你可以用它來運行客戶端單元測試,但也可以很容易地適應任何構建步驟,可能需要託管。

如果您想了解更多信息,請參見我的有關如何從內部的TeamCity與IIS運行茉莉花單元測試後表示:http://roysvork.wordpress.com/2013/03/29/running-jasmine-tests-hosted-in-iis-express-as-part-of-a-teamcity-build/

+0

這是天才! – jcvandan 2013-07-26 14:19:57

+0

我沒有看到作者在此處包含的鏈接的問題。這是補充性的,所需的所有信息實際上都在答案中,並且完全放棄了。讓我們離開吧,我們? – 2014-11-03 14:01:51