Jenkins发布C#Windows服务

1. Jenkins介绍

Jenkins 是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。让部署不再复杂,一键实现自动化构建部署。

2. Jenkins发布Windows服务

在没使用 Jenkins 之前,部署服务通常有以下几步:

  1. Visual Studio 中生成项目
  2. 把生成的 Release 目录上传到服务器中
  3. 把Windows\Microsoft.NET\Framework\v4.0.30319\ InstallUtil.exe 工具也上传上去(部分服务器存在可忽略这一步)
  4. 在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发布步骤
  1. 在jenkins中添加目标服务器( 前提是已经安装好“Publish Over SSH”插件 ,在系统设置>插件管理中下载安装即可)
    系统管理>系统设置>增加一个 SSH Server(也就是你要部署的目标服务器)
    在这里插入图片描述
    填写完目标服务器信息,点击 Test Configuration
    在这里插入图片描述
    提示 Success 表示成功,可以正常发布。
    注意:若目标服务器有密码,点击高级填写密码,再Test Configuration即可在这里插入图片描述
    最后点击保存。

  2. 回到首页,点击 新建
    在这里插入图片描述
    完了之后点击 OK ,进入到新项目配置中
    在这里插入图片描述

  3. 在源码管理中配置 SVN
    3.1 点击 Subversion(使用Git选择Git即可,这里我们以 Subversion 为例)在这里插入图片描述
    3.2 首先我们添加一个凭证(Credentials
    在这里插入图片描述
    填写完信息点击 ADD
    3.3 接下来填写其他信息
    在这里插入图片描述
    详细解释一下Local module directory:
    假设输入的是 . , 工作区是 jenkinsWorkpace(工作区可以在系统设置中配置)
    那么检出项目时就会在 jenkinsWorkpace 目录下创建如下目录(目录中就是项目的源码)
    在这里插入图片描述

  4. 重点来了,配置构建。
    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. 配置 构建后操作
    5.1 点击 增加构建后操作步骤
    在这里插入图片描述
    选择 Send build artifacts over SSH
    在这里插入图片描述
    5.2 填写配置信息:

    在这里插入图片描述
    这里做的工作主要是:
    ①把构建好的文件传送到目标服务器
    ②传送完成后执行安装命令

  6. 在目标服务器中创建安装服务的批处理

@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 服务自动化部署也就说完了,希望对您有所帮助。

人的差别在于业余时间,业余时间怎样安排,很大程度上就决定了你以后的人生轨迹。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值