不同于发布Web项目,自动发布Windows服务项目需要解决以下几个问题:

  1. 如何远程停止和开启服务?需要在发布前停止服务,在发布完成后开启服务。
  2. 如何上传编译文件到目标服务器?

问题1:如何远程停止和开启服务

在msbuild之前添加一个execute windows batch command,执行cmd命令,cmd命令如下:

echo **********stop remote server windows service**********
"C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe" -verb:sync -source:runCommand="net stop UbtripWs_Business" -dest:auto,computername=192.168.1.21,username=administrator,password=P@ssw0rd.

这里使用的是msdeploy的sync操作,通过runCommand在目标服务器上执行cmd命令。

注意:

如果服务当前是已停止状态,运行runCommand (net stop UbtripWs_Business)就会报如下错误,所以先要保证服务是已启动状态,然后再构建!

问题2:如何上传编译文件到目标服务器

在msbuild之后添加一个execute windows batch command,执行cmd命令,cmd命令如下:

echo **********以下内容有三段,.preSync:先Kill进程,.同步本地与远程,.postSync:最后启动服务**********
"C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe" -verb:sync -preSync:runCommand="TASKKILL /F /IM SSharing.Ubtrip.WinService.exe /T",waitAttempts=,waitInterval= -source:contentpath=%WORKSPACE%\DEV\Ubtrip\SSharing.Ubtrip.WinService\bin\Debug\ -dest:contentpath=C:\WindowsServices\UbtripJob\,computername=192.168.1.21,username=administrator,password=P@ssw0rd. -enableRule:DoNotDeleteRule -postSync:runCommand="net start UbtripWs_Business",waitAttempts=

使用msdeploy的sync操作,通过runCommand在目标服务器上执行cmd命令。preSync指在复制文件之前运行的命令,postSync是复制文件之后运行的命令。

注意:

1,虽然在msbuild之前已经执行cmd命令停止服务了,但是有的时候进程还在,这样会导致覆盖文件失败,所以需要在上传文件之前运行TASKKILL命令结束进程。

2,由于msdeploy默认的skip策略是删除在源服务器上不存在的文件,增加在目标服务器上不存在的文件,更新源和目标同时存在的文件,所以这个会导致目标服务器上的一些配置目录被删除,但是这个是我们不希望看到的,所以需要添加参数 -enableRule:DoNotDeleteRule,意思从不删除目标服务器上的文件,只做新增和更新操作。

自动排除Web.config和App.config

1,windows服务项目

通过给msdeploy添加参数-skip,命令如下:

-skip:objectName=filePath,absolutePath=App\.config,skipAction=Update

2,web项目

由于web项目的构建是通过msbuild+msdeploy service的方式进行的,所以没有办法像windows服务项目那样给msdeploy添加-skip参数,对于web项目的解决方案是,修改站点的csproj项目文件,添加一个Target来告诉msbuild,构建的时候就自动排除Web.config文件,命令如下:

<!--发布的时候告诉msbuild排除Web.config文件-->
<Target Name="CustomExcludeFiles" BeforeTargets="ExcludeFilesFromPackage">
<ItemGroup>
<ExcludeFromPackageFiles Include="Web.config">
</ExcludeFromPackageFiles>
</ItemGroup>
</Target>

附完整构建配置

1,Windows服务项目

msbuild之前cmd命令:

echo **********begin restore nuget package**********
C:\mcgrady\tools\nuget.exe restore "%WORKSPACE%\DEV\Ubtrip\SSharing.Ubtrip.sln" -source https://www.nuget.org/api/v2/
echo **********stop remote server windows service**********
"C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe" -verb:sync -source:runCommand="net stop UbtripWs_Business" -dest:auto,computername=192.168.1.21,username=administrator,password=xxxxxx

msbuild参数:

/t:Rebuild
/p:Configuration=Debug
/p:VisualStudioVersion=12.0
/p:ExcludeGeneratedDebugSymbol=false
/p:ExcludeXmlAssemblyFiles=false

msbuild之后cmd命令:

echo **********以下内容有三段,.preSync:先Kill进程,.同步本地与远程,.postSync:最后启动服务**********
"C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe" -verb:sync -preSync:runCommand="TASKKILL /F /IM SSharing.Ubtrip.WinService.exe /T",waitAttempts=,waitInterval= -source:contentpath=%WORKSPACE%\DEV\Ubtrip\SSharing.Ubtrip.WinService\bin\Debug\ -dest:contentpath=C:\WindowsServices\UbtripJob\,computername=192.168.1.21,username=administrator,password=xxxxxx -enableRule:DoNotDeleteRule -skip:objectName=filePath,absolutePath=App\.config,skipAction=Update -postSync:runCommand="net start UbtripWs_Business",waitAttempts=

2,Web项目

msbuild之前命令:

C:\mcgrady\tools\nuget.exe restore "%WORKSPACE%\DEV\Ubtrip\SSharing.Ubtrip.sln" -source https://www.nuget.org/api/v2/

msbuild参数:

/t:Rebuild
/p:VisualStudioVersion=12.0
/p:DeployOnBuild=True
/p:SkipExtraFilesOnServer=True
/p:WarningLevel=
/p:NoWarn=
/p:DeployTarget=MSDeployPublish
/p:MSDeployPublishMethod=WMSVC
/p:AllowUntrustedCertificate=True
/p:MsDeployServiceUrl=https://192.168.1.21:8172/msdeploy.axd
/p:username=webserver-dev\administrator
/p:password=xxxxxx
/p:DeployIisAppPath=Ubtrip
/p:Configuration=Debug
/p:ExcludeGeneratedDebugSymbol=false
/p:ExcludeXmlAssemblyFiles=false

参考资料

1,官方文档:https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/dd569106(v=ws.10)

2,msdeploy skip rules:https://blog.richardszalay.com/2012/12/17/demystifying-msdeploy-skip-rules/

3,使用 MSDeploy 手動部署網站時如何避免 Web.config 被更新:https://blog.miniasp.com/post/2010/09/01/MSDeploy-Skip-Command-for-Webconfig-file.aspx

4,Jenkins使用教程之管理节点:https://www.jianshu.com/p/047362b11403

使用Jenkins自动发布Windows服务项目的更多相关文章

  1. Jenkins 自动发布 Spring Boot 项目(Gitee)

    1.下载 wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war,并部署到tomcat下 2.机器安装好 java ,maven ,g ...

  2. web站点和windows服务项目发布时如何排除指定文件

    在发布asp.net站点和windows服务项目时,有的时候这样的需求:msbuild编译之后发布到服务器指定目录时要排除指定文件,比如通过jenkins构建时,不希望覆盖原来的Web.config和 ...

  3. jenkins自动发布java代码

    注:本文来源于<KaliArch> jenkins笔记 一.相关概念 1.1 Jenkins概念: Jenkins是一个功能强大的应用程序,允许持续集成和持续交付项目,无论用的是什么平台. ...

  4. Jenkins自动发布代码实战篇

    Jenkins自动发布代码实战篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.  一.Jenkins服务器配置秘钥对并上传到Gitlab中 1>.在Jenkins后端生成秘钥 ...

  5. 发布 Windows 服务

    1. 如何新建 Windows 服务 打开VS,“新建项目”-->“windows 桌面”-->“windows 服务”: http://www.cnblogs.com/sorex/arc ...

  6. VS2013开发Windows服务项目

    这篇随笔里,我将介绍如何用VS2013开发Windows服务项目,实现的功能是定时发送电子邮件. 开发环境:VS2013,SQL Server2008,采用C#语言开发 步骤一:创建Windows服务 ...

  7. Windows服务项目打包成安装包(Windows服务)-----------VS2017项目程序打包成.msi或者.exe

    VS2017项目程序打包成.msi或者.exe Windows服务项目使用VS2017项目程序打包成.msi或者.exe安装包 项目打包成安装包(Windows服务) 1.安装打包插件:Microso ...

  8. [原]Jenkins(九)---jenkins分别发布多个项目到多个远程主机

    /** * lihaibo * 文章内容都是根据自己工作情况实践得出. * 版权声明:本博客欢迎转发,但请保留原作者信息! http://www.cnblogs.com/horizonli/p/533 ...

  9. saltstack 迭代项目到客户端并结合jenkins自动发布多台服务器

    前面已经讲解了Webhook实现Push代码后的jenkins自动构建,接下来通过结合slatstack 实现多台机器的项目代码发布. 利用saltstack中file.recurse方法,运用该模块 ...

随机推荐

  1. 在阿里云ECS CentOS7上部署基于MongoDB+Node.js的博客

    前言:这是一篇教你如何在阿里云的ECS CentOS 7服务器上搭建一个个人博客的教程,教程比较基础,笔者尽可能比较详细的把每一步都罗列下来,包括所需软件的下载安装和域名的绑定,笔者在此之前对Linu ...

  2. NeuChar 平台使用及开发教程(四):使用 NeuChar 的素材服务

    各类公众号的功能之一就是为用户提供各类图文和多媒体的信息,因此素材是必不可少的. 进入 Neural Cell 设置界面,点击右侧[素材管理]按钮,进入素材管理界面. 目前系统提供了文本.多图文.图片 ...

  3. 消息队列RabbitMq、ActiveMq、ZeroMq、kafka之间的比较

    MQ框架非常之多,比较流行的有RabbitMq.ActiveMq.ZeroMq.kafka.这几种MQ到底应该选择哪个?要根据自己项目的业务场景和需求.下面我列出这些MQ之间的对比数据和资料. 第一部 ...

  4. 深入理解Spring Redis的使用 (四)、RedisTemplate执行Redis脚本

    对于Redis脚本使用过的同学都知道,这个主要是为了防止竞态条件而用的.因为脚本是顺序执行的.(不用担心效率问题)比如我在工作用,用来设置考试最高分. 如果还没有用过的话,先去看Redis脚本的介绍, ...

  5. 使用RSA加密在Python中逆向shell

    i春秋翻译小组-Neo(李皓伟) 使用RSA加密在Python中逆向shell 这是一个关于使用RSA加密编程逆向shell的python教程. 我想提一下,这篇文章更多的是关于理解shell中涉及的 ...

  6. Web前端-JavaScript基础教程上

    Web前端-JavaScript基础教程 将放入菜单栏中,便于阅读! JavaScript是web前端开发的编程语言,大多数网站都使用到了JavaScript,所以我们要进行学习,JavaScript ...

  7. [Swift]LeetCode529. 扫雷游戏 | Minesweeper

    Let's play the minesweeper game (Wikipedia, online game)! You are given a 2D char matrix representin ...

  8. [Swift]LeetCode762. 二进制表示中质数个计算置位 | Prime Number of Set Bits in Binary Representation

    Given two integers L and R, find the count of numbers in the range [L, R] (inclusive) having a prime ...

  9. [Swift]LeetCode894. 所有可能的满二叉树 | All Possible Full Binary Trees

    A full binary tree is a binary tree where each node has exactly 0 or 2 children. Return a list of al ...

  10. Java编程——学习大纲

    Java基础 Java基础--JDK的安装和配置 Java基础--Eclipse使用 Java基础--基本概念.数据类型.运算符 Java扩展--整型和浮点型在计算机中的存储格式 Java基础--流程 ...