目前團隊項目中有多個Web、服務以及與大數據平臺對接接口等應用,每次的發布和部署采用手工的方式進行。停止應用程序,拷貝發布包,啟動應用程序,不停的循環著,并且時不時地會出現一些人為錯誤性問題。這種模式消耗的很多團隊時間和精力。
為了解決該問題,決定引入自動構建和持續部署的一些輔助工具,采用的是微軟公司的TeamFoundationServer2017,并把DevOps相關模式推廣到團隊中。
在這個過程中,有一系列已遇到或會將遇到的問題需要解決,作為一個整理和記錄,希望以后可以快速處理類似的問題。
在我們的應用中,有一個數據計算和文件上傳入庫計算的兩個Self-Host WCF服務,服務運行在多個服務器上,每臺服務器運行一個或多個服務實例進行著大量和較長時間的計算服務。服務以控制臺的形式運行在WindowServer2012 R2系統上,并提供一些數據計算過程信息的過程步驟監控信息。基于這樣的操作環境和應用服務類型,使用Invoke-Command等方式,因為操作系統內權限等問題,是無法正常啟動遠程機器上帶有界面的應用程序的,通常是進程啟動了但是沒有應用的交互界面(比如啟動遠程服務上的計算器)。針對這樣的應用,下面是我采用實現停止、發布和啟動服務過程的一些具體實現方法。
實現這個發布流程需要兩個PowerShell腳本,一個應用在構建服務Agent服務器上,負責完成對分發服務器的認證授權和指令發送,另一個運行在服務所運行在的服務上,負責啟動和關閉服務器上的Self-Host應用程序。TFS構建代理上通過調用代理服務上的腳本,實現基本認證和授權,傳遞命令到服務寄宿的服務上,并調用腳本完成應用程序的啟動和停止。
構建服務器上的腳本文件1
1 param( 2 [string]$applicationName = '**.Service.WebSocketHost', 3 [string]$switchType = 'on', 4 [string]$account = "administrator", 5 [string]$password = "111", 6 [string[]]$computername="10.0.0.102", 7 [string]$applicationType ="UploadHost" 8 ) 9 10 Write-Host 'ApplicatnonName:' $applicationName 11 Write-Host 'SwithType:' $switchType 12 Write-Host 'Account:' $account 13 Write-Host 'Password:' $password 14 Write-Host 'IP:' $computername 15 16 $secpwd = convertto-securestring $password -asplaintext -force 17 $cred = new-object System.Management.Automation.PSCredential -argumentlist $account,$secpwd 18 19 $session_many = new-pssession -computername $computername -Credential $cred 20 if( $applicationType -eq "WebSocketHost") 21 { 22 if($switchType -eq 'on') 23 { 24 Invoke-Command -Session $session_many -ThrottleLimit 1 -ScriptBlock { C:\CICD\ExecutedAppManagement.ps1 -applicationName 'C:\ODWebSocketHost\ Service.WebSocketHost.exe' -switchType 'on' -applicationType 'WebSocketHost' } 25 } 26 if($switchType -eq 'off') 27 { 28 Invoke-Command -Session $session_many -ThrottleLimit 1 -ScriptBlock { C:\CICD\ExecutedAppManagement.ps1 -applicationName 'Service.WebSocketHost' -switchType 'off' -applicationType 'WebSocketHost' } 29 } 30 }
?
?
?
服務器端的腳本文件2,
腳本文件1中對應ExecutedAppManagement.ps1文件名
?
1 param( 2 [string]$applicationName = 'applicationName', 3 [string]$switchType = 'on', 4 [string]$applicationType = 'WebSocketHost' 5 ) 6 Write-Host $switchType 7 8 if($switchType -eq "on") 9 { 10 Write-Host "Turn on App!" $applicationName 11 #開啟WebSocket應用程序 12 if($applicationType -eq 'WebSocketHost') 13 { 14 $registerTask = Get-ScheduledTaskInfo -TaskName "TaskODWebSocketHost" 15 if( !$registerTask) 16 { 17 Write-Host $registerTask 18 $taskAction = New-ScheduledTaskAction $applicationName #"C:\ODWebSocketHost\Service.WebSocketHost.exe" 19 $taskTrigger = New-ScheduledTaskTrigger -AtStartup 20 Register-ScheduledTask TaskODWebSocketHost -Action $taskAction -Trigger $taskTrigger 21 } 22 Start-ScheduledTask -TaskName "TaskODWebSocketHost" 23 } 24 25 } 26 if($switchType -eq "off") 27 { 28 Write-Host "Turn off App!" $applicationName 29 stop-process -name $applicationName 30 Write-Host $applicationName + "has turn off" 31 }
?
控制過程
首先需要在構建代理服務器上添加對應用寄宿服務器上的信任
Set-Item wsman:\localhost\Client\TrustedHosts -value 10.0.0.*
將腳本文件2拷貝的應用寄宿服務器上指定的違章。
通過調用腳本文件1,并傳遞適當的參數實現對Sefl-Host服務器的啟停控制。
最后將調用腳本文件1的命令集成到TFS2107的發布定義中,實現對類似Windows環境上運行的帶有交互界面的應用程序進行啟動、發布和停止控制。下圖是持續發布結果
?
?