相信每一位程序员都经历过深夜加班上线的痛苦!而作为一个加班上线如家常便饭的码农,更是深感其痛。由于我们所做的系统业务复杂,系统庞大,设计到多个系统之间的合作,而核心系统更是采用分布式系统架构,由于当时对系统划分的不合理等等原因导致每次发版都会设计到多个系统的发布,小的版本三五个,大的版本十几个甚至几十个系统的同时发布!而我们也没有相应的基础设施的支撑,发版方式更是最传统的,开发人员将发布包发给运维人员,由其讲各个发布包一个一个覆盖到生产环境。因此每次上线仅仅发版就需要2-3个小时。这种方式不仅仅耗时、耗力,更是由于人工操作经常导致一些丢、落的现象。而我们当时的测试也是采用纯手工的测试,发版完毕后一轮回归测试就需要3-4个小时(当时主要是手工测试)。之前也一直提倡持续集成、自动化的测试和运维,但迟迟没有推进落地。终于在一个加班到凌晨四点的夜晚后,我再也受不了。回家后躺在床上迟迟睡不着,心想这个自动化的发布能有多难,他们搞不了,老子自己搞,于是6点爬起来来到公司,正式开始了我的持续集成、自动化部署的研究与推进之路。
一、初识Jenkins由于之前亦没有相关知识的积累,因此也是对如何实现也是一头雾水。于是只能找度娘,关键字"自动化发布"。搜索到很多工具和方法,但都是以Java平台居多,.net平台相关资料不多。其中以Jenkins介绍较多,微软也提供一套自动化部署的方式,也有一些其他持续集成工具可以实现自动化的发布,但最终还是选择了Jenkins。主要有以下几个原因:
代码开源、插件丰富完善、系统稳定
社区活跃,成功实践和网上资源较为丰富
安装配置简单
web形式的可视化的管理页面
1. Jenkins是什么Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。
** 持续集成: **
持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。
2.Jenkins能干什么众所周知,工业革命解放了人类的双手,使得人们避免了很多重复性的工作,而Jenkins能帮助开发测试运维人员解决很多重复性工作,我们可以将一些重复性的工作,写成脚本,如:代码提交,执行单元测试,程序的编译、构建、发布等封装成脚本,由Jenkins替我们定时或按需执行。事实上Jenkins的众多插件就是如此,究其根本就是执行一个或多个windows或linux命令来完成我们的需求。
3.Jenkins的一个工作流程通过对Jenkins的简单了解后,对完成自动化发布有了大致思路,如下图为Jenkins的一个工作流程
思路已经有了,接下来就是针对此流程,一步一步简单实现.NET Web应用程序基于Jenkins的自动化部署。
二、Jenkins 安装Jenkins有windows版本也有linux版本,由于我们项目都是基于.net freamwork进行开发,而jenkins构建需要编译.net程序,为了更方便的编译,因此选择安装windows版本。
1.下载可从Jenkins官网https://jenkins.io/download/下载windows安装包。
2.安装下载完成后,可按照提示进行安装即可。(windows下傻瓜式安装,注意Jenkins是java开发,因此需先安装对应jdk版本)
3.配置安装完成后会自动安装并启动一个windows服务,名为Jenkins,打开浏览器localhost:8080(Jenkins默认端口号为8080,如需修改可打开Jenkins安装目录找到Jenkins.xml修改其中端口,然后打开服务重启Jenkins服务即可)之后按照提示进行配置即可!配置完成后看到如下界面代表安装成功!
整个安装过程非常简单,基本上是傻瓜式按照提示操作即可,期间并未遇到问题,基本上10分钟左右就搞定了!接下来将介绍如何按照上述流程实现.NET下Jenkins的持续集成与自动化部署!
三、通过SVN获取源代码 1.安装插件根据我们的思路,首先要做的就是获取到我们的源代码。由于我们公司使用的源代码管理工具主要是SVN因此在这里主要介绍SVN的方式方法。根据度娘的指引,我们需要安装一个SVN的插件:Subversion Plug-in(如果:安装Jenkins时选择的安装推荐的插件,则Jenkins会直接给安装上这个插件,无需自己安装)。
2.项目配置安装插件后,选择新建一个自由风格的软件项目,起个名字,进入到项目配置后,找到源代码管理选项:
主要有以下几个选项需要配置:
Repository URL:要获取的SVN的路径,如:https://127.0.0.1:9666/svn/HS.Mall/SoureCode/Trunk/Test
Credentials:配置SVN用户名和密码
Ignore externals:是否忽略SVN外部引用(这个很重要,稍后会用到,关于SVN外部引用,可自行百度)
Additional Credentials:当你的SVN版本库使用外部引用关联其它版本库是这个就很重要了
Realm:填写SVN服务器的地址
<https://127.0.0.1:9666> VisualSVN Server //(注意这个格式)Credentials:填写SVN用户名和密码信息
其它一些选项直接按照默认值就可以,关于每一项的详细介绍可以点击后面的小?号查看。