TFS2017持續發佈中調用PowerShell啓停遠程應用程序

目前團隊項目中有多個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環境上運行的帶有交互界面的應用程序進行啓動、發佈和中止控制。下圖是持續發佈結果

 

相關文章
相關標籤/搜索