前言
现在稍微有点规模的系统,很多都是采用分布式/微服务架构,将一个大系统拆分为很多个功能模块进行开发、测试、发布、管理等,如果全部流程都采用人工的形式进行的话,效率肯定是超级不高效滴。而且现在很多项目都采用极限编程的模式,将原有比较复杂的过程分解为更小的周期进行管理,将开发的成果快速的体现给用户,如果单纯人工操作,就需要大量的人力成本才能达到要求(频繁的开发、测试、部署是很耗时的),另外很容出错。所以自动化的集成和交付是很有必要的,接下来就开始这系列的学习和分享,小伙伴们一起哦。
极限编程(ExtremeProgramming,简称XP)是一个轻量级的、灵巧的软件开发方法;同时它也是一个非常严谨和周密的方法;XP是一种近螺旋式的开发方法,它将复杂的开发过程分解为一个个相对比较简单的小周期;通过积极的交流、反馈以及其它一系列的方法,开发人员和客户可以非常清楚开发进度、变化、待解决的问题和潜在的困难等,并根据实际情况及时地调整开发过程。---摘自百度百科
正文
1. CI/CD简介
需求变更频繁、开发人员时间不够用、传统人工运维费事费力是项目遇到的三大难题,所以各种模式应运而生,比如常听见的DevOps、CI/CD、敏捷开发等,其实最终的目的就是通过自动化的工具协作和沟通来完成软件的生命周期管理,从而更快、更频繁地交付更稳定的软件产品,尽可能降低开发成本,满足客户需求。
有了自动化就不用加班了?想多了,只是减少不必要的时间浪费,节省出来时间还得去做其他的更有意义的事,所以该加的还加。
1.1 CI持续集成
CI(Continuous integration)持续集成:根据开发情况,随时将功能集成到整个项目中。
有点规模的系统都会分解为很多模块,每个模块又会分解为很多小功能,每个小功能还会分解成很多小操作,而这些功能模块可能都是不同的开发人员进行开发,持续集成的目的就是开发人员根据功能的完成情况,可以随时将对应的开发成果合并到整体项目中,尽早的与其他模块集成并进行测试,尽早发现问题并解决。
1.2 CD持续交付
CD(Continuous delivery)持续交付:根据功能集成情况,小周期内形成小版本交付,快速迭代,让用户尽快的体验到新功能。
项目开发过程中,需求变更是避免不了的,通过短周期的小版本交付,实时获取用户反馈,有针对性的快速优化和完善,减少不必要的返工和大的需求变动,还可以降低累积功能交付的风险。另外一个角度来说,让用户快速使用到新功能,用户的体验感也不一样(用户就是上帝)。
2. CI/CD实操流程
实际工作中,其实通俗点说就是将原有的部分人为参与的步骤借助自动化工具进行管理,使得整个流程自动化、标准化,降低人为操作错误的风险。人为操作和自动化操作流程如下:
人为操作
上图简述:
1.开发人员将功能代码推送的服务器;
2.经过多轮测试,直到可发布;
3.运维人员拉取可发布代码;
4.然后进行打包;
5.最后发布到应用服务器上;
当然也有开发人员把活全干了的,但不管咋弄,假如发布的功能比较多或是发布比较频繁,那对应的人员工作就只能干发布这一件事了,而且人为操作出错的概率比较高。
自动化操作
上图简述:
1.开发人员将功能代码推送的服务器,推送正式代码前会先自动化测试和人工测试(图中没体现);
2.版本控制服务器收到代码的同时,会触发对应的钩子程序(或定时程序) ;
3.通知持续集成工具(Jenkins,Hudson等),工具会自动先使用安装的git/svn插件从版本控制服务器上拉取源代码;
4.工具会使用编译/打包插件将拉取下来的代码进行自动编译打包;
5.工具最后将打包的程序发布到应用服务器上;(这里根据打包的形式不一样,发布方式也不一样;比如直接运行,或者是镜像方式,又或者是集成K8S,后续我们会逐步实操);这步使用插件根据部署场景不一样,使用的也不一样。
6.在自动化期间如果发生错误,可以配置通知,相关人员会及时进行处理,从而快速响应,快速迭代。
相比人工操作,开发人员只需提交代码,后续就基本自动化了,这样是不是很给力。至于要不要这样做,主要还是看业务和制度。
3. Jenkins 简介及安装
关于持续集成的工具有Jenkins,Hudson,gitLab-runner等,大家常用的就是Jenkins,接一下来就以它为工具的前提下进行实操演示。
3.1 Jenkins简介
Jenkins是一个开源的软件项目,是基于Java开发的一种持续集成工具,帮助开发人员自动构建项目;Jenkins通过插件化的方式可以集成不同开发语言、不同版本控制工具、不同流程部署等场景。
3.2 Jenkins安装
这里还是采用Docker的方式进行安装,采用的是云服务器(Linux),具体步骤如下:
执行Docker命令进行安装
docker run -p 8080:8080 -p 5000:5000 --name jenkins \ -u root \ -v /mydata/jenkins_home:/var/jenkins_home \ -d jenkins/jenkins:lts
命令解析:
-p 8080:8080 -p 5000:5000 指定主机和容器的映射端口;
--name jenkins 指定容器名为jenkins;
-u root 指定用户,这里root用户下;
-v /mydata/jenkins_home:/var/jenkins_home 挂载目录;
-d 是以后台形式启动容器;最后一串是代表使用的镜像。
访问8080端口看效果,如下:
查找初始密码
命令方式,如下:
docker logs jenkins # 看容器的启动日志
进入容器内部看初始密码文件的方式,如下:
安装插件
登录之后就提示进行插件安装,刚开始直接安装推荐插件即可;
接下来就是等待插件安装完成即可,如果安装失败,就多试几次。
新建用户
推荐插件安装完毕之后,会出现新建用户的界面,根据自己需要创建属于自己的新账号,如下:
配置地址,这个地址先按默认的来,后续用到了我们再来解释
安装完成
总结
其实对于项目周期的管理越是简单高效越好,不要盲目使用工具;就比如小小的单体程序,各种持续集成、部署工具都用上,那就是自己给自己添堵,一定要以解决问题为目的。
到这就先把Jenkins环境搭建好,后续的文章会陆续分享,从代码到最后容器化,咱们一步一步的来;之后的案例将会使用码云作为代码的版本控制服务器,相对github来说比较快,不过原理都差不多。关注“Code综艺圈”,和我一起学习吧;