目前团队项目中有多个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. ASP.NET没有魔法——ASP.NET 身份验证与Identity

    前面的文章中为My Blog加入了文章的管理功能(ASP.NET没有魔法——ASP.NET MVC使用Area开发一个管理模块),但是管理功能应该只能由“作者”来访问,那么要如何控制用户的访问权限?也 ...

  2. LeetCode 643. Maximum Average Subarray I (最大平均值子数组之一)

    Given an array consisting of n integers, find the contiguous subarray of given length k that has the ...

  3. octave中的一些基本操作

    1.矩阵的表示:v = [1 2 2]  %表示1行3列的矩阵 v = [1; 2; 2] %表示3行1列的矩阵 v = [1 2; 2 3; 4 5] %3*2矩阵 size(v) % 求v的行与列 ...

  4. 微信小程序图片放大预览

    需求:当点击图片时,当前图片放大预览,且可以左右滑动 实现方式:使用微信小程序图片预览接口 我们可以看到api需要两个参数,分别通过下面的data-list和data-src来传到js中 wxml代码 ...

  5. 18个超有趣的SVG绘制动画赏析

    SVG作为时下比较新颖的技术标准,已经建立了很多基于SVG的前端项目.由于SVG在绘制路径上非常灵活,我们将很多网页上的元素使用SVG来绘制而成,有各种人物.小图标.小动画等等.今天我们收集了18个非 ...

  6. PyQt中对RadioButton分组

    我们知道在同一widget组件中的radio button有排他属性,为了在一个窗口中显示多组radio button,我们需要对其分组. 通常有两种选择,一种是BoxGroup,另一种是Button ...

  7. Leetcode题解(28)

    90. Subsets II 题目 分析:代码如下 class Solution { public: vector<vector<int> > subsetsWithDup(v ...

  8. Codeforces Round #431 (Div. 1)

    A. From Y to Y time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  9. JavaScript正则表达式知识点

    通过学习imooc课程<JavaScript正则表达式>http://www.imooc.com/video/12539,对视频教学内容做一个知识整理. 一个正则表达式在线工具:http: ...

  10. python爬虫(一)_爬虫原理和数据抓取

    本篇将开始介绍Python原理,更多内容请参考:Python学习指南 为什么要做爬虫 著名的革命家.思想家.政治家.战略家.社会改革的主要领导人物马云曾经在2015年提到由IT转到DT,何谓DT,DT ...