目前团队项目中有多个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

TFS2017持续发布中调用PowerShell启停远程应用程序相关推荐

  1. 如何定时启停Winform应用程序

    如何定时启停Winform应用程序 整体思路 关闭应用程序 启动应用程序 定时操作 这段时间,因为业务需要,要将一个由C#开发的winform应用程序做下定时关闭.开启操作.折腾了一番,碰到了一些小坑 ...

  2. python执行bat文件_Python中调用PowerShell、远程执行bat文件实例

    python调用本地powershell方法 1.现在准备一个简陋的powershell脚本,功能是测试一个IP列表哪些可以ping通: function test_ping($iplist) { f ...

  3. paurse java_在eclipse中通过RSE插件运行远程java程序时遇到问题

    我花了很多时间来确定如何使用RSE插件从本地 Eclipse运行远程Java程序. 我能够通过使用RSE的eclipse连接到我的远程机器,在远程系统资源管理器透视图上在eclipse上的远程mave ...

  4. 太原理工web课程答案——web程序设计课程答案 (第八章 CSS3页面布局)持续发布中——

    8.1.2 1[单选题] 在CSS中,为页面中的某个DIV标签设置样式div{width:200px;padding:0  20px;border:5px:},则该标签的实际宽度为( ) A. 200 ...

  5. C#中调用halcon引擎来执行hdev程序

    调用halcon引擎有两个直接的好处: 避免C# 与halcon代码混编时可能产生的内存泄露问题 修改halcon程序时不用重新编译C# 勇哥写了一个示例,详细的应用感受和缺点限制勇哥会持续做相关的总 ...

  6. java访问其它服务器,一个Java Web应用程序是否可以在tomcat服务器的同一本地主机中调用另一个Java Web应用程序...

    i am trying to deploy two web applications say appA and appB in same local host tomcat server and wh ...

  7. 增压撬启停控制优化及纳入GE UCP控制系统可行性研究

    1.整合增压撬进GE系统的必要性 增压撬是压缩机干气密封系统重要组成部分,目前增压撬控制算法存在一定不足,其通过压缩机进出口汇管差压值决定增压泵启停,而没将干气密封密封性能核心指标PDIT153差压值 ...

  8. WF4.0 基础篇 (二十八) WF调用PowerShell

    PowerShell 提供了命令行管理系统的功能,但通常情况下,操作人员要完成某种业务需要多组PowerShell 命令,这样会很烦琐,错误率也比效高.操作人员可以编写powerShell脚本来组织命 ...

  9. crontab 批量启停

    由于要更改一批机器的配置,需要批量停服务,但是这批机器里面都有守护进程,所以需要关闭守护进程再停服务: 那么如何关闭守护进程呢? 只要批量将crontab 中的内容注释掉,即相当于批量停止了cront ...

最新文章

  1. 11.3-全栈Java笔记:线程的生命周期
  2. PIL中的Image和numpy中的数组array相互转换
  3. 又拍云再放大招,CDN同时支持HTTP/2和SPDY/3.1协议
  4. iis 发布MVC HTTP错误 403.14
  5. 【Android】Android模拟器无法上网问题
  6. 蔚来:首台ET7白车身合肥工厂下线
  7. jsp获取连接池的实时连接数_一篇看懂数据库连接池概念、原理、运行机制
  8. 【Linux】如何在文件中写入感叹号
  9. C语言课程设计:学生管理系统
  10. MacOS壁纸文件夹如何查找
  11. 【学习笔记】生物数据库の初步了解
  12. 大雪满弓刀之林冲 [转]
  13. EXCEL制作统计图表
  14. Linux日文教程,在Deepin/Ubuntu下安装fcitx-Anthy以输入日语(日文)
  15. MySQL 排序规则
  16. Excel导入数据库(vue+py)py部分
  17. AI软件编辑文字时出现“滚滚长江东逝水”解决方法
  18. 让我们的爱洒满孩子们的心
  19. Lambda表达式练习【应用】
  20. 刘彬20000词汇02

热门文章

  1. 【洛谷 - P3410】拍照(最大权闭合图,网络流最小割)
  2. 【qduoj - 1010】easy problem(巧妙的枚举)
  3. 从零开始学视觉Transformer (10):目标检测DETR-1
  4. linux 使用gzip压缩打包的文件,linux常用的解压,压缩,打包
  5. 按钮开关java代码,Android自定义实现开关按钮代码
  6. druid mysql配置详解_druid 参数配置详解
  7. 复频域求零输入响应_第十四章 动态电路的复频域分析 习题答案
  8. rabbitmq技术的一些感悟(一)
  9. Linux(12)-命令行的使用,shell脚本
  10. 剑指offer_05