1. Jenkins介绍
Jenkins 是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。让部署不再复杂,一键实现自动化构建部署。
2. Jenkins发布Windows服务
在没使用 Jenkins 之前,部署服务通常有以下几步:
- 在 Visual Studio 中生成项目
- 把生成的 Release 目录上传到服务器中
- 把Windows\Microsoft.NET\Framework\v4.0.30319\ InstallUtil.exe 工具也上传上去(部分服务器存在可忽略这一步)
- 在cmd中执行 InstallUtil.exe xxxxx.exe 或者写个批处理去执行完成服务部署。
C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe D:\APPHOME\Notify\bin\release\ExpireNotify.exe
PAUSE
这种流程走下来,做一次感觉还好。假如每次需求变更都需要走这些流程,让人觉得累不说,关键费时间。俗话说:时间就是金钱!那么假设使用jenkins,部署不再那么麻烦费事了。接下来咱们就来聊聊如何使用jenkins部署C#Windows服务。
2.1 Jenkins发布步骤
在jenkins中添加目标服务器( 前提是已经安装好“Publish Over SSH”插件 ,在系统设置>插件管理中下载安装即可)
系统管理>系统设置>增加一个 SSH Server(也就是你要部署的目标服务器)
填写完目标服务器信息,点击 Test Configuration
提示 Success 表示成功,可以正常发布。
注意:若目标服务器有密码,点击高级填写密码,再Test Configuration即可
最后点击保存。回到首页,点击 新建

完了之后点击 OK ,进入到新项目配置中
在源码管理中配置 SVN
3.1 点击 Subversion(使用Git选择Git即可,这里我们以 Subversion 为例)
3.2 首先我们添加一个凭证(Credentials)
填写完信息点击 ADD
3.3 接下来填写其他信息
详细解释一下Local module directory:
假设输入的是 . , 工作区是 jenkinsWorkpace(工作区可以在系统设置中配置)
那么检出项目时就会在 jenkinsWorkpace 目录下创建如下目录(目录中就是项目的源码)
重点来了,配置构建。
4.1 顶部菜单栏选择 构建
4.2 在增加构建步骤之前在目标服务器中准备好安装服务用的 批处理
4.2.1 首先创建一个卸载服务的批处理,因为在安装服务时,服务存在,是不能正常安装的。
我们在目标服务器中 D:\jobs\bat(目录可以自己根据自己的需求放) 目录下创建一个批处理:C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe /u D:\APPHOME\Notify\bin\release\ExpireNotify.exe这里需要注意:一般公司生产环境都是需要管理员权限才能对服务进行管理,若需要管理员权限则使用下面的脚本:
@echo off >nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system" if '%errorlevel%' NEQ '0' ( goto UACPrompt ) else ( goto gotAdmin ) :UACPrompt echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs" echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs" "%temp%\getadmin.vbs" exit /B :gotAdmin if exist "%temp%\getadmin.vbs" ( del "%temp%\getadmin.vbs" ) pushd "%CD%" cd /D "%~dp0" C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe /u D:\APPHOME\Notify\bin\release\ExpireNotify.exe多加的这些就是获取管理权限用的。
4.3 回到 Jenkins 增加构建步骤
4.3.1 点击 增加构建步骤

选择 Send files or execute commands over SSH
填入配置信息:
上面 Exec command 写的路径就是刚刚所建的批处理。4.3.2 再次点击 增加构建步骤
这次选择 Build a Visual Studio project or solution using MSBuild (前提是需要安装了MSBuild插件)
填写配置信息:
/t:Rebuild /p:Configuration=Release /p:VisualStudioVersion=14.0 /p:OutputPath=bin这里做的工作主要是:
①在目标服务器中卸载并停止服务
②构建检出项目输出到bin目录下配置 构建后操作
5.1 点击 增加构建后操作步骤
选择 Send build artifacts over SSH
5.2 填写配置信息:
这里做的工作主要是:
①把构建好的文件传送到目标服务器
②传送完成后执行安装命令在目标服务器中创建安装服务的批处理
@echo off
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"
if '%errorlevel%' NEQ '0' (
goto UACPrompt
) else ( goto gotAdmin )
:UACPrompt
echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"
"%temp%\getadmin.vbs"
exit /B
:gotAdmin
if exist "%temp%\getadmin.vbs" ( del "%temp%\getadmin.vbs" )
pushd "%CD%"
cd /D "%~dp0"
C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe /u D:\APPHOME\Notify\bin\release\ExpireNotify.exe
C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe D:\APPHOME\Notify\bin\release\ExpireNotify.exe
有的小伙伴可能有疑问,这里怎么又写了一次卸载的命令?我来解释一下,因为在构建之前的那次卸载,会有几率卸载不干净,会导致最后安装失败,所以为了以防万一,在最后安装前,再卸载一次。
3. 服务安装后立即启动
到目前为止,其实已经完成了服务部署自动化工作,但其实还存在问题,也就是说部署完成之后服务的状态是未启动的。所以我们还需要做一步工作,非常简单。在 ProjectInstall.cs 中重写 OnAfterInstall 方法,加入如下代码:
base.OnAfterInstall(savedState);
using (System.ServiceProcess.ServiceController service
= new System.ServiceProcess.ServiceController(serviceInstaller1.ServiceName))
{
service.Start();
}
最后提交代码,在 Jenkins 中点击构建即可。
到这里 C# WIndows 服务自动化部署也就说完了,希望对您有所帮助。
人的差别在于业余时间,业余时间怎样安排,很大程度上就决定了你以后的人生轨迹。