从装修厨房看项目开发效率优化
持续部署
- 装修厨房
全部装好之后发现灯不亮,电路有问题,冷热水装反了,管路有问题。这些问题要解决就必须把地砖、墙砖拆掉 -----一个环节有问题,其他环节跟着返工。
那怎么做会好一些呢?
任何安装完成及时测试, 确保其可以正常工作。 - 项目开发
开发过程中进行单元测试能够通过, 但是部署到服务器上运行出现问题。
那怎么做会好一些呢?
仅仅单元测试还不够, 各个模块都必须能够在服务器上运行。 - 关注点
持续部署的关注点在于项目功能部署至服务器后可以运行, 为下一步测试环节或最终用户正式使用做好准备。
持续集成
- 装修厨房
装修厨房时我们需要铺地砖, 如果把所有地砖都切好再拿去铺就会发现: 每一
块地砖单独看都是好的, 但是实际铺的时候, 把所有地砖整合起来, 发现和厨房
地面总体尺寸不匹配, 边边角角的地砖需要重新切, 时间和物料成本陡然升高。
那怎么做会好一些呢?
切一块铺一块, 根据需要的尺寸来切, 尽早发现尺寸变化, 避免返工。 - 项目开发
各个小组分别负责各个具体模块开发, 本模块独立测试虽然能够通过, 但是上线前夕将所有模块整合到一起集成测试却发现很多问题, 想要解决就需要把很多代码返工重写而且仍然有可能有问题, 但现在时间很可能不够了。
那怎么做会好一些呢?
经常性、 频繁的把所有模块集成在一起进行测试, 有问题尽早发现, 这就是持续集成。 - 关注点
持续集成的关注点在于尽早发现项目整体运行问题, 尽早解决。
持续交付
- 装修厨房
全部装修好之后房屋主人来验收, 各项功能都正常, 但是水龙头的样式主人不喜欢, 灶台的位置主人不满意, 要求返工。
那怎么做会好一些呢?
房屋主人随时查看装修进度, 施工团队及时调整。 - 项目开发
项目的各个升级版本之间间隔时间太长, 对用户反馈感知迟钝, 无法精确改善用户体验, 用户流失严重。
那怎么做会好一些呢?
用小版本不断进行快速迭代, 不断收集用户反馈信息, 用最快的速度改进优化。 - 关注点
持续交付的关注点在于研发团队的最新代码能够尽快让最终用户体验到。
总体目标
- 好处 一: 降低风险
一天中进行多次的集成, 并做了相应的测试, 这样有利于检查缺陷, 了解软件的健康状况, 减少假定。 - 好处 二: 减少重复过程
产生重复过程有两个方面的原因, 一个是编译、 测试、 打包、 部署等等固定操作都必须要做, 无法省略任何一个环节; 另一个是一个缺陷如果没有及时发现, 有可能导致后续代码的开发方向是错误的, 要修复问题需要重新编写受影响的所有代码。
而使用 Jenkins 等持续集成工具既可以把构建环节从手动完成转换为自动化完成, 又可以通过增加集成频次尽早发现缺陷避免方向性错误。 - 好处 三: 任何时间、 任何地点生成可部署的软件
持续集成可以让您在任何时间发布可以部署的软件。 从外界来看, 这是持续集成最明显的好处, 我们可以对改进软件品质和减少风险说起来滔滔不绝, 但对于客户来说, 可以部署的软件产品是最实际的资产。 利用持续集成, 您可以经常对源代码进行一些小改动, 并将这些改动和其他的代码进行集成。 如果出现问题, 项目成员马上就会被通知到, 问题会第一时间被修复。 不采用持续集成的情况下, 这些问题有可能到交付前的集成测试的时候才发现, 有可能会导致延迟发布产品, 而在急于修复这些缺陷的时候又有可能引入新的缺陷, 最终可能导致项目失败。 - 好处 四: 增强项目的可见性
持续集成让我们能够注意到趋势并进行有效的决策。 如果没有真实或最新的数据提供支持, 项目就会遇到麻烦, 每个人都会提出他最好的猜测。 通常, 项目成员通过手工收集这些信息, 增加了负担, 也很耗时。 持续集成可以带来两点积极效果:- 有效决策: 持续集成系统为项目构建状态和品质指标提供了及时的信息,有些持续集成系统可以报告功能完成度和缺陷率。
- 注意到趋势: 由于经常集成, 我们可以看到一些趋势, 如构建成功或失败、总体品质以及其它的项目信息。
- 好处 五: 建立团队对开发产品的信心
持续集成可以建立开发团队对开发产品的信心, 因为他们清楚的知道每一次构建的结果, 他们知道他们对软件的改动造成了哪些影响, 结果怎么样。
持续集成工具
Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。
Jenkins:目前最流行的一款持续集成及自动化部署工具
技术组合:Jenkins 可以整合 GitHub 或 Subversion
JavaEE 项目部署方式对比
手动部署
自动化部署
自动化” 的具体体现: 向版本库提交新的代码后, 应用服务器上自动部署, 用户或测试人员使用的马上就是最新的应用程序。
搭建上述持续集成环境可以把整个构建、 部署过程自动化, 很大程度上减轻工作量。对于程序员的日常开发来说不会造成任何额外负担——自己把代码提交上去之后, 服务器上运行的马上就是最新版本——一切都发生在无形中。
下面我们讲带领大家一步一步搭建整套持续集成环境, 这个操作过程只需要细心认真即可, 没有任何难度。 但是需要优秀的你具备以下前置知识:
- Linux 基本操作命令和 VIM 编辑器使用
- Maven 的项目构建管理
- GitHub 或 SVN 使用
Jenkins + SVN 持续集成环境搭建
系统结构总述
- 创建虚拟机安装Linux系统
- 版本控制子系统
- Subversion服务器
- 项目对应版本库
- 版本库中钩子程序
- 持续集成子系统
- JDK
- Tomcat
- Maven
- Jenkins
- 主体程序
- SVN插件
- Maven插件
- Deploy to Web Container 插件
- 应用发布子系统
- JDK
- Tomcat
版本控制子系统
SVN服务器安装过程参考 CentOS 7搭建SVN服务器,这里记录一下版本库的访问账号密码。
特别提示: svnserve.conf
文件中 anon-access
一定要打开注释并设置为 none
应用发布子系统
tomcat服务器安装过程省略,仅记录Tomcat服务器的账号密码。
配置文件位置:/usr/local/apache-tomcat-8.5.47/conf/tomcat-users.xml
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<role rolename="manager-jmx"/>
<role rolename="manager-status"/>
<user username="admin" password="123456" roles="manager-status,manager-gui,manager-script,manager-jmx"/>
注:由于设置tomcat的账户密码,所以启动访问tomcat时候会报错,如下:
解决方法:修改/usr/local/apache-tomcat-8.5.47/webapps/manager/META-INF/context.xml
配置文件,将
Valve className=”org.apache.catalina.valves.RemoteAddrValve”
allow=”127.\d+.\d+.\d+|::1|0:0:0:0:0:0:0:1” />
注解掉。如下:
Jenkins 主体程序安装配置
- 把
jenkins.war
放在Tomcat
解压目录/webapps
目录下 - 打开 Tomcat 解压目录
/usr/local/apache-tomcat-8.5.47/conf/server.xml
修改 URL 地址的编码解码字符集
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8"/>
- 启动 Tomcat 并通过浏览器访问
- 网址示例:
http://192.168.198.198:8080/jenkins/
- 网址示例:
- 解锁jenkins
依照提示, 查看/root/.jenkins/secrets/initialAdminPassword 文件内容填入文本框
这里填入的密文同时也是 admin 账号的密码。
- 选择插件安装方式
选择哪种方式都不会对后续操作有太大影响。 因为有需要的插件我们可以在后续有针对性的安装。
在这里选择“安装推荐的插件”。
安装过程如下:
打X 的插件是由于网络传输导致的安装失败, 后面再重新安装即可。
注意: 这个步骤中如果选择了安装插件则 Linux 必须能够联网。
- 新建账号或以管理员身份继续
可以选择使用 admin 账户继续, 后面有需要仍然有机会注册新账户。
- 开始使用 Jenkins
系统初始化配置
- 系统管理界面
- 全局安全配置
- 全局工具配置: Maven Configuration
- 全局工具配置: JDK
- 全局工具配置: Maven
- 全局工具配置: Git[若有] , 不使用 Git, 所以删除即可。
最后点击 save 保存退出
安装插件
安装插件时受到网络状况的影响有可能会失败, 不要紧, 多试几次, 直到成功。
创建工程
创建工程
指定工程名称和工程类型
源码管理
这里一定要再选一下!
配好的效果:
注意: 此时 Jenkins 的工作区中还没有代码, 需要执行一次构建操作之后Jenkins 才会下载代码。
构建
构建后操作
这里同样一定要选一下!
手动构建
Jenkins 使用天气状况来表示构建成功率
构建触发器
远程触发的基本原理是 SVN 服务器给 Jenkins 项目特定的 URL 地址发送请求,但必须以请求参数的形式携带一个特定值, 这个特定值就是这里的“身份验证令牌”。
比如我们这个项目的地址触发地址是:http://192.168.198.198:8080/jenkins/job/apple/build
身份验证令牌是:ZCF_TOKEN
那么最终的访问地址就是:
http://192.168.198.198:8080/jenkins/job/apple/build?token=ZCF_TOKEN
触发访问地址中 Jenkins 访问地址是根据实际情况改变的, 项目名称根据实际情况改变, 其他都不变。
获取 crumb 值
Linux 的 curl 命令
Linux 的 curl 命令用来发送 HTTP 请求。
-X
参数: 指定请求方式-v
参数: 显示响应结果-u
参数: 携带用户名/密码-H
参数: 携带请求消息头信息
curl -X post -v -u [Jenkins 用户名]:[Jenkins 密码] -H "请求消息头信息" http://[服务器 IP 地址]:[服务器端口号]/jenkins/job/[Jenkins 项目名称]/build?token=[身份验证令牌]
curl -X post -v -u admin:f6b840e1b115431c8f0f7898b6ae1d60 http://192.168.198.198:8080/jenkins/job/apple/build?token=ZCF_TOKEN
编辑 SVN 版本库中的钩子程序
钩子程序由 post-commit.tmpl
复制得到
- 这里注意不要使用任何扩展名。 如果按照我们习惯的使用.sh 扩展名则钩子程序无法正常工作。
- 记得使用
chmod
命令设置为可执行权限
把原有内容注释, 加入 curl 命令
测试
在 Eclipse 中提交修改, 在页面上查看显示内容变化。
补充
如果发生 Jenkins 服务器从 SVN 服务器下载代码不是最新版的情况, 那么就在SVN服务器的URL地址后面加上 @HEAD
强制要求下载最新版。