簡體   English   中英

在Web服務器上部署可執行進程的最佳方法是什么?

[英]What's the best way to deploy an executable process on a web server?

原來的問題:

這個問題的標題可能有點笨拙,但這是情況:

我在我的服務器上部署了一個.NET Web項目。 它仍處於測試階段,所以發布了大量的釋放和重新發布。

我還在同一個VS解決方案(稱為“admin.exe”)中編寫了一個C#可執行文件,該解決方案在服務器的后台運行,定期執行某些業務規則完整性檢查並對數據庫中的警告表進行適當的插入。

問題是:部署此應用程序的最佳方式是什么,以便每當我發布新版本時它都會更新? 它應該在不同版本之間一直運行,所以理想情況下我想要某種設置,即shutdown-deploy-startup過程涉及盡可能少的步驟。

謝謝!

編輯 - 賞金開始了

到目前為止給出的答案是有用和有趣的,但沒有為我提供一個清晰,簡潔和優雅的解決方案。 請不要認為我對部署項目有廣泛的了解,因為我沒有。 Bounty會找到能夠提供以下解決方案的人:

  1. 發布最新版本的網站;
  2. 關閉服務器上運行的任何admin.exe實例;
  3. 更新admin.exe;
  4. 啟動admin.exe;
  5. 所有這些都應該優選地在一個步驟中完成,或者盡可能少的步驟,看到它將在產品的整個壽命期間重復進行;
  6. 所有上述操作都應該優先完成,無需安裝任何第三方軟件。

謝謝您的幫助!

次要編輯 - 澄清

我認為到目前為止提供的很多解決方案都高估了問題的復雜性,所以讓我澄清一下:所有要部署的東西,只需要部署在台計算機上,也很高興Visual Studio可以提供所有源代碼。 我只需要(1)將網站發布到web文件夾,(2)關閉,重新安裝並重新啟動同一服務器上的admin.exe。 有沒有一個簡單的方法一步到位? 是否可以使用VS部署項目完成?

聽起來您需要查看自定義MSBuild腳本以進行部署。

MSBuild不僅僅是構建解決方案。 您也可以使用它來復制文件並更新它們。 執行此操作的任務的良好資源是此處的MSBuild社區任務。

然后,您可以在部署網站部署的同時包括后台進程的部署。

另一種方法可能是使用Windows PowershellPSExec之類的東西來遠程執行復制和更新命令。

使用Hudson等持續集成服務器,這兩種方法都可以很好地實現自動化。 我有一個構建過程,它自動監視我的源代碼存儲庫,構建程序,部署到登台服務器,運行驗收測試,然后部署到預覽框。 我有另一個(手動)作業,只需點擊一下即可部署此預覽版本,最大限度地減少停機時間,並(通常)減少錯誤命令的錯誤。

“正確”的方式可能是設置部署腳本和安裝程序,但只需單擊Visual Studio中的發布並跳過遠程桌面就可以在開發過程中更加方便。

我有一個管理員Web應用程序作為命令行應用程序的前端 - 與您正在做的略有不同,但相同的解決方案應該工作。

只需在管理員Web應用程序中添加對控制台項目的引用即可。 即使您沒有在控制台項目中調用任何方法,該引用也會導致在您發布管理網站時重建和上載控制台應用程序。

添加到Web應用程序的簡單啟動/停止頁面負責第2步和第4步 - 我們調用Process.Start()/ Process.Kill(),盡管您顯然可以根據admin的設置選擇更干凈的關閉。可執行程序。

下面是我的開始/停止頁面中的代碼 - 我將它們設置為Web服務方法(以便於您可能不需要的某些監視),但它們應該可以通過簡單的按鈕單擊方法調用。 請注意,服務帳戶需要運行/停止進程的權限 - 在開發框中,最簡單的選項是將iis設置為以管理員用戶身份運行,而不是默認服務帳戶。

    private void KillProcess(string name)
    {
        var binpath = Server.MapPath("~/bin");
        var pp2 = Process.GetProcesses();

        var pp = from p in pp2 where p.ProcessName.Contains(name) && !p.ProcessName.Contains("vshost") select p;
        foreach (var p in pp)
        {
            p.Kill();
        }
    }

[WebMethod]
    public void StartQueueRunner()
    {
        var binpath = Server.MapPath("~/bin");
        System.Diagnostics.Process.Start(Path.Combine(binpath, "TwoNeeds.QueueRunner.exe"));
    }

[WebMethod]
    public void StartQueueRunner()
    {
        var binpath = Server.MapPath("~/bin");
        System.Diagnostics.Process.Start(Path.Combine(binpath, "TwoNeeds.QueueRunner.exe"));
    }

可能有一種更清潔的方式,但可能將其安裝為Windows服務,然后使用installutil.exe編寫安裝/卸載命令的腳本。 然后只需更新服務所在的文件夾,並為每次更新重新運行腳本?

大服務的教程在這里

希望這可以幫助

我建議編寫一個可以在PC上運行的腳本,通過網絡進行部署(這樣您就不必每次都登錄到目標機器)。 我使用msbuild完成了它,但你真的可以去一個批處理文件。

我假設您的管理進程正在運行Windows服務(無論如何,將其作為服務運行是有意義的),因此您將像這樣部署它(這是msbuild腳本的一部分 - 您可以使用用戶名和密碼刪除位你不需要它):

<ItemGroup>
    <ReleaseFiles Include="localPath\bin\*.dll"/>
    <ReleaseFiles Include="localPath\bin\*.exe"/>
    <ReleaseFiles Include="localPath\bin\*.pdb"/>
    <ReleaseFiles Include="localPath\bin\*.config"/>   
</ItemGroup>

<Target Name="Release">
    <Message Text="Installing Admin on $(DeploymentMachine) as user $(User)"/>
    <Exec ContinueOnError="true" Command="sc.exe \\$(DeploymentMachine) stop &quot;Admin&quot;" />
    <Exec ContinueOnError="true" Command="sc.exe \\$(DeploymentMachine) delete &quot;Admin&quot;" />
    <Delete ContinueOnError="true" Files="\\$(DeploymentMachine)\C$\path-to-admin\*.*"/>
    <MakeDir Directories="\\$(DeploymentMachine)\C$\path-to-admin"/>
    <Copy SourceFiles="@(ReleaseFiles)" DestinationFiles="@(ReleaseFiles->'\\$(DeploymentMachine)\C$\path-to-admin\%(RecursiveDir)%(Filename)%(Extension)')" />
    <Exec Command="sc.exe \\$(DeploymentMachine) create &quot;Admin&quot; binpath= &quot;C:\path-to-admin\admin.exe&quot; start= auto obj= $(User) password= $(Password)"  />
    <Exec ContinueOnError="true" Command="sc.exe \\$(DeploymentMachine) start &quot;Admin&quot;" />
</Target>

部署IIS網站通常會有點痛苦,但如果您在目標計算機上設置了所有內容,那么可能只需通過網絡復制文件(再次使用\\ DeploymentMachine \\ share或\\ DeploymentMachine \\ C $ \\路徑尋址)。

不幸的是,部署永遠不會很好也不優雅:

如果您需要澄清任何事情,請告訴我

這是一個討厭的想法。 如果你是admin.exe沒有做任何太難的核心,為什么不扔進IIS? 要編寫C#Web服務,您可能不需要進行太多更改。

為了確保重復調用它,您可以使用各種方法,如Windows Scheduler,每分鍾運行一次wget。 使用文件鎖保持並發副本,如果完成時間超過一分鍾。

這將使您的部署像文件副本(FTP)一樣簡單。 我甚至認為你在推送C#DLL時不需要重啟IIS。 如果這樣做,您可以通過SSH編寫腳本。

對我而言,您的問題聽起來很像SharePoint通過在每個WFE中運行的Timer服務解決的部署問題,stsadm將管理任務排入隊列,該服務出列並運行它們等。

我要做的是

  • 編寫在每個WFE中運行的服務
  • 編寫一個小的自定義“stsadm”工具,以便您可以排隊任務,指定他們何時需要運行,等等。

另一種方法:如何使用普通的Windows任務計划程序? 這里 ,您可以輕松地遠程排隊任務。

我會編寫一個命令行應用程序來完成所有這些工作。

這是一個粗略的例子:

Site.api.publish();
admin.api.shutdown();
while(shell.status("admin.exe") == true) {}; //still running
file.replace("admin.exe", "path-to-compile\admin.exe");
shell.run("admin.exe");

你可能會明白這一點。 如果您希望它自動執行,只需使用任務計划每天調用它,或者通常您需要它。

在服務器/ Web上存儲最新版本的在線項目。 例如:在version.txt中,值為“2.1.0”,或者如果您也有訪問權限,則查詢數據庫。

您在客戶端上運行的應用程序將定期讀取version.txt文件的內容,然后與內置(自我)版本號進行比較。

  • 如果檢測到補丁或次要版本,例如2.1.123,則會悄悄地旋轉出第二個應用程序(updater.exe)
    • 做升級,
    • 它應從服務器/網站下載更新的(首選壓縮)項目。
    • 停止所有運行的實例。
    • 解壓縮內容。
    • 備份現有文件(重命名)
    • 復制/安裝新版本的項目,
    • 啟動應用程序(當應用程序成功重啟時,它將刪除自己的備份文件)。
  • 如果檢測到主要版本,例如:3.0.0
    • 通知用戶有重大升級
    • 如果用戶接受,請下載安裝程序
    • 運行完整的安裝程序更新

這有幫助嗎?

用於Web應用程序的VS部署項目並不容易掌握,有些不可靠。 我建議的是什么:

  1. 將Admin.exe修改為.NET Windows服務。 看看為什么你需要這樣做。
  2. 使用sc.exe,InstallUtil.exe或安裝程序構建服務(如installer.codeeffects.com)可在每次部署時快速重新安裝服務。 順便說一下,如果我沒記錯的話,在installer.codeeffects.com上你可以下載一個VS示例代碼,說明如果你不熟悉服務,如何構建.NET Windows服務。

可以像這樣進行部署(假設您在自動化方面的需求很少,而且幾乎可以手動部署):

運行上述任一工具以首先重新安裝您的服務。 sc.exe和InstalUtil.exe工具支持命令行。 因此,如果您的Web應用程序,VS和服務在同一台計算機(您的開發計算機,我假設?)上運行,您可以右鍵單擊VS中的Web項目,選擇“屬性”並設置構建前或構建后命令那里的Build Events選項卡。 這樣,您的VS可以在發布Web應用程序之前自動重建並重新安裝您的服務。 這就是為什么exe程序在你的情況下不好的主要原因,Windows服務會更好地為你服務。

然后部署您的Web應用程序(假設它已按照上面的討論進行構建)。 這里沒有大佬,只需使用VS中的發布命令或移動您的Web應用程序的所有文件,除了.cs文件,/ Properties /和/ obj /文件夾。 或者,如果從項目文件夾運行,只需右鍵單擊主頁面並選擇“在瀏覽器中查看” - 這將通過VS啟動運行時而不啟動調試器。

很抱歉這么長的帖子。 我是否正確理解了您的問題和說明? :)

如何在部署后點擊admin.exe。 然后在admin.exe中,在檢查業務規則的完整性之前,檢查更新是否可用。 如果是,請更新,然后繼續檢查。

為了簡化操作並確保我能夠回滾所有內容,我將創建一個執行以下操作的PowerShell腳本:

  1. 停止應用程序池。
  2. 將當前Web應用程序復制到“歷史記錄文件夾”,以便您可以根據需要回滾到該版本
  3. 部署新的Web應用程序
  4. 從服務中停止當前的admin.exe
  5. 通過執行Uninstall.bat卸載admin.exe(這在Windows服務中很常見)
  6. 將當前的admin.exe應用程序復制到歷史文件夾(參見2)
  7. 將新的admin.exe復制到正確的位置並運行install.bat
  8. 啟動新服務
  9. 啟動應用程序池

你可以在Powershell腳本中自動化所有這些(我唯一不確定的是應用程序池,但我很確定你可以這樣做)。

有關PowerShell的更多信息,請訪問: http//arstechnica.com/business/news/2005/10/msh.ars/2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM