一、简介
关于使用Jenkins做自动化部署入门篇,我已经分别写了两篇文章,不管企业现在是在用.Net Framework还是.Net Core,不管企业是在用git还是SVN。其实这两篇文章一般足以交付开发阶段的80%业务了。不足的是这两篇文章都只是将环境
部署到了单台机器上。所以这篇文章在介绍如何将编译好的源码包传输到其他服务器上时,顺便一起将windows服务做持续部署的内容也加入进来,和很多朋友交流后,大部分企业所使用的技术都还相对比较保守,觉得很有必要一起谈谈
关于windows服务做CI/CD的话题。毕竟在开发新项目的同时也要维护老项目。
Windows+.NetCore+git+IIS在Jenkins上的自动化部署入门。
Windows+.Net Framework+svn+IIS在Jenkins上的自动化部署入。
二、所需环境
1.Publish Over SSH 在Jenkins插件管理中安装
2.Publish Over FTP在Jenkins插件管理中安装
3.windows搭建FTP
4.windows安装OpenSSh
三、安装FTP/SSH环境及Jenkins中配置FTP/SSH进行构建
1.关于在Jenkins中安装Publish Over FTP和Publish Over SSH两款插件,这里就不多介绍了,不懂如何安装的可以看下前两篇文章。
2.在jenkins的系统配置中进行FTP账号相关配置。
2.1 上面的name取任意名称就行,remote Directory为服务器上的目录,这里填写的目录服务器上一定要提前创建好。一般服务器根目录可以这样写“/”。
- windows上搭建FTP,这个可以百度。注意的地方时防火墙记开启端口21和20。
4.使用topShelf创建一个.Net Framework服务。
5.新建*风格项目TestWinservice,进行配置,步骤如下:
5.1代码拉取配置
5.2 构建配置
5.2.1 编译命令说明
/p:Configuration=Release
/p:VisualStudioVersion=16.0
/p:ExcludeGeneratedDebugSymbol=false
/p:ExcludeXmlAssemblyFiles=false
5.3 FTP文件传输配置
5.4 开始构建,看结果
上图明显看到传输过去4个文件,一切都是成功的,但这时有个问题,传输过去的文件怎么让它自动部署起来,远程怎么执行部署脚本?突然shit 了,我没考虑周到。所以准备上SSH,当然也可以用 Web Deploy,我觉得用Web Deploy有些繁琐,所以放弃。
5.5 windows上安装OpenSSh。
下载地址:https://github.com/PowerShell/Win32-OpenSSH/releases
解压好后打开目录,使用管理员权限执行一下命令
powershell.exe -ExecutionPolicy Bypass -File install-sshd.ps1
设置服务自动启动并启动服务
net start sshd
记得防火墙规则放行22端口,可以用Xshell工具测试连接。
5.6 Jenkins中配置SSH,和前面在Jenkins中配置FTP是一样的步骤,这里采用账号方式。
基本上和配置FTP都类似,就不过多解释。
5.7 之前构建项目FTP配置的地方替换成SSH Server,看下图。
执行的脚本逻辑,使用TopShelf创建的windows服务都要以管理员方式运行安装。
cd C:\WINDOWS\system32
e:
cd E:\publish\ConsoleService
set scrpath=C:\publish\ConsoleService\*.*
set dirpath=E:\publish\ConsoleService
sc query MhgService | findstr /i "STATE">nul
:: 如果服务未安装,则跳过停止服务的步骤
if errorlevel 1 goto NotExist
:: 更新windows服务
NetFxConsoleService.exe stop
XCOPY %scrpath% %dirpath% /Y /S
NetFxConsoleService.exe start
if not %ERRORLEVEL% geq 0 goto Error:
goto next
:NotExist
XCOPY %scrpath% %dirpath% /Y /S
NetFxConsoleService.exe install
NetFxConsoleService.exe start
:next
echo "MhgService更新成功!" goto :success
:error
echo "MhgService更新失败!"
:success
echo 执行完毕,任意键退出
pause >nul
exit
注意:上面脚本中我以"cd C:\WINDOWS\system32"方式切换到管理员方式运行脚本在我某一台服务器上是可以安装起来的,在另外一台服务器上就会提示要以管理员方式安装服务。因这个问题折腾了许久。后来网上了解到脚本执行中可以获取管理员的权限。请看下面的脚本。
@ECHO OFF
setlocal EnableDelayedExpansion
color 3e
title 服务配置
PUSHD %~DP0 & cd /d "%~dp0"
%1 %2
mshta vbscript:createobject("shell.application").shellexecute("%~s0","goto :runas","","runas",1)(window.close)&goto :eof
:runas
::脚本逻辑
e:
cd E:\publish\ConsoleService
set scrpath=C:\publish\ConsoleService\*.*
set dirpath=E:\publish\ConsoleService
sc query MhgService | findstr /i "STATE">nul
..................
用这种方式经过测试,目前只有在服务器上双击运行可以安装成功,在Jenkins SSH Server中执行 没有看到服务安装起来。如果有人知道什么原因可以告诉我。其实还折腾过vbs,也仅仅只是服务器上可以双击运行起来。
四、总结
在弄Windows服务自动化部署的过程中,感觉在windows中要做CI/CD这些事情,头发真会越来越少。如果要玩CI/CD ,有机会尽可能项目环境用linux 、.net core 拥抱开源。总之,只有折腾过才能感觉到吧。