又到一年国庆,终于有了难得的几天空闲,计划陪陪媳妇娃子,再把最近阅读的几本相关书总结梳理下。当然,计划总是美好的,于时接到了一个老朋友电话。大意是他搞了一个.net小网站,部署了4个节点,每次更新程序都是手动复制到4个机器,时不时忘记部署,忘记备份之类的问题,不胜其烦,希望我帮忙想个办法。回想2年前,在做无人货架项目时,也有部分是.net项目,当时自己也没能处理这个问题,当时用了webdeploy,效果并不理想,虽然后来几乎没碰过.net了,这个问题依然萦绕心头。既然有时间,有报酬,何不接此机会弥补两前年的遗憾呢,于时满口应承了下来。想想现在都在谈CI/CD, DevOps.. 过程应该会是相当愉悦的,又是小网站,要求也不是那么高。网站结构如下,非常简单。
01
还是jenkins
百度一番,一搜一大把,几乎都是利用jenkins,加上之前有过用jenkins做tomcat自动化部署的经验,心中一阵窃喜,过程真的如预期一般顺畅。于时动手,开始了我们愉悦之旅。jenkins是基于Java开发的一种持续集成工具,于时先安装java环境,配置环境变量(我是直接下载 window版本的 jdk 8)。接着下载window对应的jenkins版本,下载地址点这里,按提示操作,安装推荐插件(安装后也可以插件管理中自行安装),没有注意事项!一波流带走,就来到了欢迎界面。没有任何障碍,感觉半天就可以打卡收工。因为要编译.net程序,需要安装msbuild插件:以次 “Manage Jenkins” -> "Manage Plugins" -> "可选插件", 搜索 MsBuild,点击直接安装。操作如下图。
接着 “Manage Jenkins” -> "System Configuration" -> "Global Tool Configuration" 中配置 MSBuild,因为MSBuild插件中自带的编译工具可能比较老,建议在本机安装 visual studio 相同版本,直接使用其自带的编译工具。配置如下
接着,安装git服务,并在 “Manage Jenkins” -> "System Configuration" -> "Global Tool Configuration" 中配置 git 相关参数,配置如下。
再接着,安装插件 Publish Over SSH。然后在应用程序机器上安装FreeSSHD,用于文件上传和远程执行命名。FreeSSHD 配置过程如下:
1,添加用户jenkins,
2,配置telnet, ssh 端口为 23,28;
3,配置 authentication 目录, 在jenkins服务器,生成ssh key,把公钥文件复制到这个目录,重命名为jenkins,与用户名相同。(使用命令 ssh-keygen -t rsa 生成公钥,私钥 )
4,配置sftp 目录,为文件上传目录。
5,以管理员身份运行 FreeSSHd。这个很重要,不然一直提示 auth fail.
操作步骤如下图:
接着,在 “Manage Jenkins” -> "System Configuration" -> "Global Tool Configuration" 中配置Publish Over SSH 相关参数,配置如下。
在jenkins和应用服务上安装 7Z工具,用于压缩和解压。并在环境变量 path 中配置 7Z的安装目录(用于在任意目录执行命令)。到这里系统工具及配置就完成了,接下来开始任务配置。
02
愉悦的构建
环境搭建完成,就开始我们的表演吧。新建任务,名称你随意就好,选择“Freestyle project”类型,点击确定。进入任务配置界面。
General 配置中,可以选中 Discard old builds 可以配置以天数和build记录数保留数据。
源码管理中,添加好指定的git地址,及账号密码。以上流程没有任何障碍。
构建中,添加步骤Execute Windows batch command,用户nuget restore。因为前面已经在jenkins机器上安装了visual stadio ,可以直接使用其自带的nuget 工具。 配置如下图,其中 nuget.bat的内容如下:
NuGet.Build.Tasks.Console.exe restore VideosGYFileS.sln。其中 NuGet.Build.Tasks.Console.exe 为VS自带的,在path中配置了目录这里可以直接运行。(这个命令是在解决方案根目录执行的。),命令最后为exit 0 表示结束。
接着添加步骤 Build a Visual Studio project or solution using MSBuild,选择第一步中添加的 MSBuild 配置,如下图,其中编译参数为:
/t:Rebuild /property:Configuration=Release;DeployOnBuild=true;TargetFrameworkVersion=v4.6。
接着添加步骤Execute Windows batch command,用于打包编译后的文件,方便后面上传。压缩时需要排除一些配置文件,配置如下图,compress.bat文件内容如下:
7z a deploy.zip .PrecompiledWebWeb* -xr!upload -xr!logs -x!web.config。 (. 表示打包时去除前缀, -xr! 表示排除目录,-x! 表示排除文件)
到这里,构建选项就已经配置完成了,开始构建,在解决方案目录生成了deploy.zip文件。那说明已经成功了70%了。
03
完美的构建后操作
构建完成,接下来就是把文件上传到目标服务器了。这就是要用到我们前面配置的 Publish Over SSH插件了。 添加构建后步骤,选择Send build artifacts over SSH。并添加第一步中创建的 应用服务器。多个服务器,可以添加多个server。要传输的文件为构建步骤中生成的文件 deploy.zip,上传后要执行的命令为:cmd.exe /c "d: && cd wwwroot && backup.bat" 中 backup.bat 完成文件备份以当前时间生成备份文件放到 backup文件夹中。文件内容如下;
set vardate=%date:~0,4%%date:~5,2%%date:~8,2% set h=%time:~0,2%
# 格式化小时,如果小时10,补0,不然会有空格
set h=%h: =0% set otime=%h%%time:~3,2%%time:~6,2%
# 备份文件格式 YYYYMMddHHmmss.zip
set filename=%vardate%%otime%.zip # 备份原文件 7z a %filename% .gyapp* -x!deploy.zip -xr!upload -xr!logs # 移动文件到backup 文件夹 move %filename% .Backup # 解压文件 7z x deploy.zip -aoa -o"D:wwwrootgyapp"
最后来一张构建成功的截图。
到这里所有配置就完成了,如果顺利的话,自动化部署就完成了。鉴于本人能力问题,自到第79次构建,才真正愉快的左打收工了。没错,是79次!
04
结语
文章到这里,我只想说,这个过程真的不怎么愉悦。整个过程需要用到方方面面的知识,比如构建过程,环境变量配置,编写bat文件等 。也有很多异常问题,比如sshkey 版本问题,bat中时间格式问题等等。也要用到一些工具软件,比如7Z,FreeSSHD,jenkins。再者也有很多细节要考虑,比如备份文件,排除文件等。再有前面说的,百度一下,一搜打把的文章,大部分并无太多用处,很多都只是demo。比如,大部分都有说所到用ftp,但是无法支持子目录传输。以上种种问题,多次要奔溃放弃,怎奈受人之托,忠人之事,还好媳妇一直鼓励,并带着大宝小宝玩耍。最后断断续续用了几天时间,整体来说还是痛苦并快乐着。想着过程中那么问题,就想着整理成文,希望有需要的人看到本文,真的可以半天搞定。
I have a dream to be a good programmer。