TFS2017持續發布中調用PowerShell啟停遠程應用程序

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

?

?

轉載于:https://www.cnblogs.com/jlw123199/p/8005385.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/453922.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/453922.shtml
英文地址,請注明出處:http://en.pswp.cn/news/453922.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Flask 多線程

參數 app.run()中可以接受兩個參數,分別是threaded和processes,用于開啟線程支持和進程支持。 threaded: 是否開啟多線程,默認不開啟。 if __name__ __main__:app.run(threadedTrue)processes:進程數量&#xff0c…

40天python入門教程_Python入門教程超詳細1小時學會Python

Java和Javascript,不用1小時你就可以用Python快速流暢地寫有用的Python程序.為什么使用Python假設我們有這么一項任務:簡單測試局域網中的電腦是否連通.這些電腦的ip范圍從192.168.0.101到192.168.0.200.思路:用shell編程.(Linux通常是bash而Windows是批處理腳本).例如,在Windo…

基于LVS對LAMP做負載均衡集群

一、簡介 LVS是Linux Virtual Server的簡稱,也就是Linux虛擬服務器, 是一個由章文嵩博士發起的自由軟件項目,它的官方站點是www.linuxvirtualserver.org。現在LVS已經是 Linux標準內核的一部分,在Linux2.4內核以前,使用LVS時必須要…

Python_Day1

1、猜年齡游戲: (1):每循環3次,counter值返回為0,重新開始循環;(2):continue 意思是跳出當前循環;(3)&#xff1…

kafka 入門

初識 Kafka 什么是 Kafka Kafka 是由 Linkedin 公司開發的,它是一個分布式的,支持多分區、多副本,基于 Zookeeper 的分布式消息流平臺,它同時也是一款開源的 基于發布訂閱模式的消息引擎系統。 Kafka 的基本術語 消息&#xf…

實體詞典 情感詞典_tidytextpy包 | 對三體進行情感分析

騰訊課堂 | Python網絡爬蟲與文本分析TidyTextPy前天我分享了 tidytext | 耳目一新的R-style文本分析庫 但是tidytext不夠完善,我在tidytext基礎上增加了情感詞典,可以進行情感計算,為了區別前者,將其命名為tidytextpy。大家有時間…

TensorFlow實現LeNet5模型

# -*- coding: utf-8 -*-import tensorflow as tffrom tensorflow.examples.tutorials.mnist import input_data# 獲取mnist數據mnist input_data.read_data_sets("MNIST_data/", one_hotTrue)# 注冊默認session 后面操作無需指定session 不同sesson之間的數據是獨立…

Python基礎第一天

一、內容 二、練習 練習1 題目&#xff1a;使用while循環輸出1 2 3 4 5 6 8 9 10 方法一&#xff1a; 圖示&#xff1a; 代碼&#xff1a; count 1 while count < 11:if count ! 7:print(count)count 1輸出結果&#xff1a; 1 2 3 4 5 6 8 9 10 View Code方法二&#xff1…

python flask 上傳下載 api_Flask 文件下載API

給前端提供一個文件下載接口時, 遇到了文件名亂碼的問題, 幾經折騰總算實現效果, 代碼如下:import requestsfrom flask import Response, jsonify, request, stream_with_contextfrom flask_login import login_requiredfrom . import bpfrom .models import Coursewarebp.rout…

OpenGL實用開源代碼列表

有了網絡的最大好處就是可以資源共享。網絡是最大的知識庫&#xff0c;也是最好的老師&#xff0c;正所謂“沒有你想不到的&#xff0c;只有你找不到的”。以下是我收集的以游戲編程&#xff0c;OpenGL 3D編程相關的免費擴展庫資料。不斷更新中&#xff0c;如果你有好的建義&am…

vaOJ10369 - Arctic Network

1 /*2 The first line of each test case contains 1 < S < 100, the number of satellite channels!3 注意&#xff1a;S表示一共有多少個衛星&#xff0c;那么就是有 最多有S-1個通道&#xff01; 然后將最小生成樹中的后邊的 S-1通道去掉就行了&#xff01; 4…

python-kafka 常用 api 匯總

簡介 python連接kafka的標準庫&#xff0c;kafka-python和pykafka。kafka-python使用的人多是比較成熟的庫&#xff0c;kafka-python并沒有zk的支持。pykafka是Samsa的升級版本&#xff0c;使用samsa連接zookeeper&#xff0c;生產者直接連接kafka服務器列表&#xff0c;消費者…

scp選擇二進制_二進制傳輸與文本傳輸區別

Ftp&#xff0c;winscp等工具下載文件時候有選項&#xff0c;可選的有二進制方式和文本方式。文本方式又稱為ASCII方式兩者區別如下。ASCII 方式和BINARY方式的區別是回車換行的處理&#xff0c;binary方式不對數據執行任何處理&#xff0c;ASCII 方式將回車換行轉換為本機的回…

在ffmpeg中加入x264模塊

引言&#xff1a;最近一直致力于多媒體應用開發&#xff0c;一說起編碼解碼就不得不說下FFmpeg。FFmpeg是一個集錄制、轉換、音/視頻編碼解碼功能為一體的完整的開源解決方案。FFmpeg的開發是基于Linux操作系統&#xff0c;但是可以在大多數操作系統中編譯和使用。下面就詳細介…

RabbitMQ實例教程:發布/訂閱者消息隊列

消息交換機&#xff08;Exchange&#xff09; RabbitMQ消息模型的核心理念是生產者永遠不會直接發送任何消息給隊列&#xff0c;一般的情況生產者甚至不知道消息應該發送到哪些隊列。 相反的&#xff0c;生產者只能發送消息給交換機&#xff08;Exchange&#xff09;。交換機的…

OAuth 2.0(網轉)

&#xff08;一&#xff09;背景知識 OAuth 2.0很可能是下一代的“用戶驗證和授權”標準&#xff0c;目前在國內還沒有很靠譜的技術資料。為了弘揚“開放精神”&#xff0c;讓業內的人更容易理解“開放平臺”相關技術&#xff0c;進而長遠地促進國內開放平臺領域的發展&#xf…

kafka 自動提交 和 手動提交

Consumer 需要向 Kafka 匯報自己的位移數據&#xff0c;這個匯報過程被稱為提交位移&#xff08;Committing Offsets&#xff09;。因為 Consumer 能夠同時消費多個分區的數據&#xff0c;所以位移的提交實際上是在分區粒度上進行的&#xff0c;即 Consumer 需要為分配給它的每…

axios vue 回調函數_vue中ajax請求與axios包完美處理

這次給大家帶來vue中ajax請求與axios包完美處理&#xff0c;vue中ajax請求與axios包處理的注意事項有哪些&#xff0c;下面就是實戰案例&#xff0c;一起來看一下。在vue中&#xff0c;經常會用到數據請求&#xff0c;常用的有&#xff1a;vue-resourse、axios今天我說的是axio…

用int還是用Integer?

昨天例行code review時大家有討論到int和Integer的比較和使用。 這里做個整理&#xff0c;發表一下個人的看法。【int和Integer的區別】int是java提供的8種原始類型之一&#xff0c;java為每個原始類型提供了封裝類&#xff0c;Integer是int的封裝類。int默認值是0&#xff0c;…

前端之 JavaScript 常用數據類型和操作

JavaScript 常用數據類型有&#xff1a;數字、字符串、布爾、Null、Undefined、對象 JavaScript 擁有動態類型 JavaScript 擁有動態類型。這意味著相同的變量可用作不同的類型 var x; // 此時x是undefined var x 1; // 此時x是數字 var x "Alex" …