目前團隊項目中有多個Web、服務以及與大數據平臺對接接口等應用,每次的發佈和部署採用手工的方式進行。中止應用程序,拷貝發佈包,啓動應用程序,不停的循環着,而且時不時地會出現一些人爲錯誤性問題。這種模式消耗的不少團隊時間和精力。服務器
爲了解決該問題,決定引入自動構建和持續部署的一些輔助工具,採用的是微軟公司的TeamFoundationServer2017,並把DevOps相關模式推廣到團隊中。session
在這個過程當中,有一系列已遇到或會將遇到的問題須要解決,做爲一個整理和記錄,但願之後能夠快速處理相似的問題。app
在咱們的應用中,有一個數據計算和文件上傳入庫計算的兩個Self-Host WCF服務,服務運行在多個服務器上,每臺服務器運行一個或多個服務實例進行着大量和較長時間的計算服務。服務以控制檯的形式運行在WindowServer2012 R2系統上,並提供一些數據計算過程信息的過程步驟監控信息。基於這樣的操做環境和應用服務類型,使用Invoke-Command等方式,由於操做系統內權限等問題,是沒法正常啓動遠程機器上帶有界面的應用程序的,一般是進程啓動了可是沒有應用的交互界面(好比啓動遠程服務上的計算器)。針對這樣的應用,下面是我採用實現中止、發佈和啓動服務過程的一些具體實現方法。工具
實現這個發佈流程須要兩個PowerShell腳本,一個應用在構建服務Agent服務器上,負責完成對分發服務器的認證受權和指令發送,另外一個運行在服務所運行在的服務上,負責啓動和關閉服務器上的Self-Host應用程序。TFS構建代理上經過調用代理服務上的腳本,實現基本認證和受權,傳遞命令到服務寄宿的服務上,並調用腳本完成應用程序的啓動和中止。大數據
構建服務器上的腳本文件1spa
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 }
控制過程rest
首先須要在構建代理服務器上添加對應用寄宿服務器上的信任code
Set-Item wsman:\localhost\Client\TrustedHosts -value 10.0.0.*
將腳本文件2拷貝的應用寄宿服務器上指定的違章。
經過調用腳本文件1,並傳遞適當的參數實現對Sefl-Host服務器的啓停控制。
最後將調用腳本文件1的命令集成到TFS2107的發佈定義中,實現對相似Windows環境上運行的帶有交互界面的應用程序進行啓動、發佈和中止控制。下圖是持續發佈結果