目前团队项目中有多个Web、服务以及与大数据平台对接接口等应用,每次的发布和部署采用手工的方式进行。停止应用程序,拷贝发布包,启动应用程序,不停的循环着,并且时不时地会出现一些人为错误性问题。这种模式消耗的很多团队时间和精力。

为了解决该问题,决定引入自动构建和持续部署的一些辅助工具,采用的是微软公司的TeamFoundationServer2017,并把DevOps相关模式推广到团队中。

在这个过程中,有一系列已遇到或会将遇到的问题需要解决,作为一个整理和记录,希望以后可以快速处理类似的问题。

在我们的应用中,有一个数据计算和文件上传入库计算的两个Self-Host WCF服务,服务运行在多个服务器上,每台服务器运行一个或多个服务实例进行着大量和较长时间的计算服务。服务以控制台的形式运行在WindowServer2012 R2系统上,并提供一些数据计算过程信息的过程步骤监控信息。基于这样的操作环境和应用服务类型,使用Invoke-Command等方式,因为操作系统内权限等问题,是无法正常启动远程机器上带有界面的应用程序的,通常是进程启动了但是没有应用的交互界面(比如启动远程服务上的计算器)。针对这样的应用,下面是我采用实现停止、发布和启动服务过程的一些具体实现方法。

实现这个发布流程需要两个PowerShell脚本,一个应用在构建服务Agent服务器上,负责完成对分发服务器的认证授权和指令发送,另一个运行在服务所运行在的服务上,负责启动和关闭服务器上的Self-Host应用程序。TFS构建代理上通过调用代理服务上的脚本,实现基本认证和授权,传递命令到服务寄宿的服务上,并调用脚本完成应用程序的启动和停止。

构建服务器上的脚本文件1

 param(
[string]$applicationName = '**.Service.WebSocketHost',
[string]$switchType = 'on',
[string]$account = "administrator",
[string]$password = "",
[string[]]$computername="10.0.0.102",
[string]$applicationType ="UploadHost"
) Write-Host 'ApplicatnonName:' $applicationName
Write-Host 'SwithType:' $switchType
Write-Host 'Account:' $account
Write-Host 'Password:' $password
Write-Host 'IP:' $computername $secpwd = convertto-securestring $password -asplaintext -force
$cred = new-object System.Management.Automation.PSCredential -argumentlist $account,$secpwd $session_many = new-pssession -computername $computername -Credential $cred
if( $applicationType -eq "WebSocketHost")
{
if($switchType -eq 'on')
{
Invoke-Command -Session $session_many -ThrottleLimit -ScriptBlock { C:\CICD\ExecutedAppManagement.ps1 -applicationName 'C:\ODWebSocketHost\ Service.WebSocketHost.exe' -switchType 'on' -applicationType 'WebSocketHost' }
}
if($switchType -eq 'off')
{
Invoke-Command -Session $session_many -ThrottleLimit -ScriptBlock { C:\CICD\ExecutedAppManagement.ps1 -applicationName 'Service.WebSocketHost' -switchType 'off' -applicationType 'WebSocketHost' }
}
}

服务器端的脚本文件2

脚本文件1中对应ExecutedAppManagement.ps1文件名

 param(
[string]$applicationName = 'applicationName',
[string]$switchType = 'on',
[string]$applicationType = 'WebSocketHost'
)
Write-Host $switchType if($switchType -eq "on")
{
Write-Host "Turn on App!" $applicationName
#开启WebSocket应用程序
if($applicationType -eq 'WebSocketHost')
{
$registerTask = Get-ScheduledTaskInfo -TaskName "TaskODWebSocketHost"
if( !$registerTask)
{
Write-Host $registerTask
$taskAction = New-ScheduledTaskAction $applicationName #"C:\ODWebSocketHost\Service.WebSocketHost.exe"
$taskTrigger = New-ScheduledTaskTrigger -AtStartup
Register-ScheduledTask TaskODWebSocketHost -Action $taskAction -Trigger $taskTrigger
}
Start-ScheduledTask -TaskName "TaskODWebSocketHost"
} }
if($switchType -eq "off")
{
Write-Host "Turn off App!" $applicationName
stop-process -name $applicationName
Write-Host $applicationName + "has turn off"
}

控制过程

首先需要在构建代理服务器上添加对应用寄宿服务器上的信任

Set-Item wsman:\localhost\Client\TrustedHosts -value 10.0.0.*

将脚本文件2拷贝的应用寄宿服务器上指定的违章。

通过调用脚本文件1,并传递适当的参数实现对Sefl-Host服务器的启停控制。

最后将调用脚本文件1的命令集成到TFS2107的发布定义中,实现对类似Windows环境上运行的带有交互界面的应用程序进行启动、发布和停止控制。下图是持续发布结果

TFS2017持续发布中调用PowerShell启停远程应用程序的更多相关文章

  1. C#中调用PowerShell代码

    在C#中调用PowerShell代码,很多时候Add是不好使的!要用AddScript!记录一下! using (Runspace runspace = RunspaceFactory.CreateR ...

  2. 在Bat批处理中调用Powershell脚本

    ##如何在BAT中调用powershell,把下面代码另存为bat格式pushd %~dp0powershell.exe -command ^  "& {set-executionp ...

  3. linux中守护进程启停工具start-stop-daemon

    1.功能作用 启动和停止系统守护程序 2.位置 /sbin/start-stop-daemon 3.主要参数 Commands: -S|--start -- <argument> ... ...

  4. 人多力量大vs.两个披萨原则,聊聊持续交付中的流水线模式

    人多力量大vs.两个披萨原则,聊聊持续交付中的流水线模式 在前面5期文章中,我们分别详细介绍了持续交付体系基础层面的建设,主要是多环境和配置管理,这些是持续交付自动化体系的基础,是跟我们实际的业务场景 ...

  5. Java 调用 Rest api 设置经典 Linux 虚拟机的实例启停

    现象描述 用户可以通过 Rest API 设置经典 Linux 虚拟机实例的启停.在调用该 API 时需要通过 Azure Active Directory(下文简称 AAD) 获取 Token,但是 ...

  6. 如何在windows计划中调用备份sharepoint2010网站集的powershell脚本

    最近有个项目需要在在windows计划中使用powershell脚本备份sharepoint2010网站集,打开sharepoint的powershell执行命令管理界面的属性 查看: C:\Wind ...

  7. PowerShell中调用外部程序和进程操作命令例子

    学习PowerShell,我们不指望通过C#编程去搞定所有事情,我们应该记住cmd.exe或者说批处理给我们留下的宝贵财富——通过调用外部程序去解决问题.调用了外部程序,势必就要对进程进行管理,这就是 ...

  8. ASP.NET CORE Linux发布工具(文件对比 只上传差异文件;自动启停WebServer命令;上传完成自动预热WebServer)

    最近这几日在搞一个小网站:教你啊 :(感兴趣的朋友可以来捧场,在这个网站上有任何消费我都可以退还) 由于更新频繁,手动更新特别麻烦,于是开发了这个小工具 用了一段时间,还是挺顺手的,同时.NET Co ...

  9. 在TFS持续集成(持续发布)中执行Telnet任务

    Telnet是一种在因特网或局域网上使用虚拟终端连接,提供双向交互式文本通信设备的协议. 它是最早的互联网通讯协议之一.自1969年启用以来,已经经过了将近50年时间,在开放式的操作系统中拥有广泛的用 ...

随机推荐

  1. 跨域资源共享CORS实现

    问题描述: 本地已经实现的restful接口,在地址栏输入url:loaclhost:8080/admins即可得到预期的json字符串,在网页上显示如下: [{"id":1,&q ...

  2. 跨站请求伪造(CSRF)-简述

    跨站请求伪造(CSRF)-简述 跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 ...

  3. R语言进行机器学习方法及实例(一)

    版权声明:本文为博主原创文章,转载请注明出处   机器学习的研究领域是发明计算机算法,把数据转变为智能行为.机器学习和数据挖掘的区别可能是机器学习侧重于执行一个已知的任务,而数据发掘是在大数据中寻找有 ...

  4. Vue源码后记-其余内置指令(3)

    其实吧,写这些后记我才真正了解到vue源码的精髓,之前的跑源码跟闹着玩一样. go! 之前将AST转换成了render函数,跳出来后,由于仍是字符串,所以调用了makeFunction将其转换成了真正 ...

  5. vue2.0实现在table中实现全选和反选

    其实在去年小颖已经写过一篇:Vue.js实现checkbox的全选和反选 小颖今天在跟着慕课网学习vue的过程中,顺便试试如何在table中实现全选和反选,页面的css样式是直接参考慕课网的样式写的, ...

  6. 关于在 IntellIj IDEA中JSP页面 cannot resolve method getParameter("")的解决方案

    File->Project Structure->Libraries,然后点加号,将Tomcat lib文件夹下的servlet.jar和servlet-api.jar包导入.

  7. Grunt参考

    Grunt参考: http://www.cnblogs.com/yexiaochai/p/3603389.html http://blog.csdn.net/wangfupeng1988/articl ...

  8. Visual formatting model 可视化格式模型

    在可视化格式模型里,每个元素都是由一个或者多个盒子组成,这些盒子的布局由下面规则控制: box dimensions and type.(块元素和行内元素) positioning scheme (n ...

  9. RobotFramework自动化测试框架-移动手机自动化测试Get Element Location关键字的使用

    Get Element Location关键字用来获取一个Element的Location位置,该关键字接收一个参数[ locator ] 示例1:使用Get Element Location来获取一 ...

  10. Java中Date日期字符串格式的各种转换

    public class DateParserT {           /**          * Date 与  String.long 的相互转换          * @param args ...