目前团队项目中有多个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. DNS over TLS到底有多牛?你想知道的都在这儿

    DNS over TLS,让电信.移动等各种ISP无法监视你的浏览轨迹...... SSL证书有助于客户端浏览器和网站服务器之间的加密连接. 这意味着在连接期间,所有的通信和活动都被遮蔽. 但通常意义 ...

  2. 雅虎军规以及Chrome调试

    1.尽量减少HTTP请求数 80%的终端用户响应时间都花在了前端上,其中大部分时间都在下载页面上的各种组件:图片,样式表,脚本,Flash等等.减少组件数必然能够减少页面提交的HTTP请求数.这是让页 ...

  3. LeetCode 437. Path Sum III (路径之和之三)

    You are given a binary tree in which each node contains an integer value. Find the number of paths t ...

  4. Tomcat 服务器及使用Eclipse绑定Tomcat并发布应用

    一.简介 Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache.Sun 和其他一些公司及个人共同开发而成 ...

  5. Hibernate映射类型

  6. 版本控制之三:SVN合并及解决冲突(转)

    转自 http://www.cnblogs.com/xiaobaihome/archive/2012/03/20/2408089.html 接下来,试试用TortoiseSVN修改文件,添加文件,删除 ...

  7. (转)Spark JAVA RDD API

    对API的解释: 1.1 transform l  map(func):对调用map的RDD数据集中的每个element都使用func,然后返回一个新的RDD,这个返回的数据集是分布式的数据集 l   ...

  8. Leetcode题解(八)

    26.Remove Duplicates from Sorted Array 题目 直接上代码,方法很简单: class Solution { public: int removeDuplicates ...

  9. DOM 遍历-同胞

    在 DOM 树中水平遍历 有许多有用的方法让我们在 DOM 树进行水平遍历: siblings() next() nextAll() nextUntil() prev() prevAll() prev ...

  10. jQuery选择器(子元素过滤选择器)第七节

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...