您当前的位置:首页 > 养生 > 内容

持续集成的作用(jenkins 持续集成可以做哪些功能)

本文目录

  • jenkins 持续集成可以做哪些功能
  • 以下说法哪个不属于持续集成的好处
  • 集成的名词解释
  • 持续集成对软件开发有什么作用
  • 如何优化系统架构 进行有效的持续集成/持续交付
  • 有没有技术大牛了解java开发,测试和CI的关
  • jenkins+maven+svn 远程部署到weblogic 持续集成
  • Docker的主要作用是什么
  • 如何在jenkins 构建 github工程

jenkins 持续集成可以做哪些功能

可以的。1.先在jenkins ---》系统管理---》插件管理里面安装权限策略role-strategy.jpi插件,再注册几个用户。2.在系统管理---》Configure Global Security里统一用户权限配置,在这里配置的权限针对所有job有作用。3.也可以在job 配置里面单独授权给用户。在这里配置的权限针对当前job有作用。比如这图上可以看到admin和zhangxxx有权限,那么当用wangxxx登录时,这个job就不会显示,视图上就看不到。

以下说法哪个不属于持续集成的好处

在没有应用持续集成之前,传统的开发模式是项目一开始就划分模块,然后等所有的代码都开发完成之后再集成到一起进行测试,随着技术的发展,各种方法百花齐放,规模也在扩大,需求越来越复杂,已经不能简单地通过划分模块的方式来开发,需要项目内部互相合作,划 分模块这种传统的模式的弊端也越来越明显,由于很多 bug 在项目的早期就存在,到最后集成的时候才发现问题,开发者需要在集成阶段花费大量的时间来寻找 bug 的根源,加上的复杂性,问题的根源很难定位,甚至出现不得不调整底层架构的情况,在这个阶段的除虫会议(bug meetings)特别多,会议的内容基本上都是讨论 bug 是怎么产生的,最后往往发展成为不同模块的负责人互相推诿责任。持续集成最大的优点是可以避免这种传统模式在集成阶段的除虫会议。持续集成主张项目的开发人员频繁的将他们对源码的修改提交(check in)到一个单一的源码库,并验证这些改变是否对项目带来了破坏,持续集成包括以下几大要点:访问单一源码库,将所有的源代码保存在单一的地点(源码控制系统), 让所有人都能从这里获取最新的源代码(以及以前的版本)。支持自动化创建脚本,使 创建过程完全自动化,让任何人都可以只输入一条命令就完成系统的创建。测试完全自动化,要求开发人员提供自测试的代码,让 任何人都可以只输入一条命令就运行一套完整的系统测试。提供主创建,让任何人都可以只输入一条命令就可以开始主创建。提倡开发人员频繁的提交(check in)修改过的代码。持续集成的关键是完全的自动化,读取源代码、编译、连接、测试,整个创建过程都应该自动完成。对于一次成功的创建,要求在这个自动化过程中的每一步都不能出错,而最重要的一步是测试,只有最后通过测试的创建才是成功的创建。在持续集成里面创建不再只是传统的编译和连接那么简单,创建还应该包括自测试,自测试的代码是开发人员提交源码的时候同时提交的,是针对源码的单元测试(源自 XP 的实践),将所有的这些自测试代码整合到一起形成测试集,在 所有的最新的源码通过编译和连接之后还必须通过这个测试集的测试才算是成功的创建。这 种测试的主要目的是为了验证创建的正确性,M cConnell 称之为冒烟测试,在 持续集成里面,这 叫做集成验收测试Build Verify Test,简称 BVT。BVT 测试是质量的基础,QA 小组不会感受到 BVT 的存在,他们只针对成功的创建进行测试(如功能测试)。BVT 测试应该尽量的详尽,详尽的测试才能发现更多的问题,而由此得到的反馈结果也更有参考意义,测试应该全部执行完毕,这样得到的反馈结果才是完整的,而不是遇到错误就放弃测试过程。持续集成和日创建相比还有以下特点:持续集成强调了集成频率,和日创建相比,持续集成显得更加频繁,目前的最佳实践是每一个小时就集成一次。持续集成强调及时反馈,日创建的目的是得到一个可以使用的稳定的发布版本,而持续集成强调的是集成失败之后向开发人员提供快速的反馈,当 然成功创建的结果也是得到稳定的版本。日创建并没有强调开发人员提交(check in)源码的频率,而持续集成鼓励并支持开发人员尽快的提交对源码的修改并得到尽快的反馈。从上面列出的续集成和日创建相比的特点来看,很明显, 频率和反馈这两个词出现的特别多,持 续集成有一个与直觉相悖的基本要点,那 就是 经常性的集成比偶尔集成要好。Martin Fowler 认为对于持续集成来说,集成越频繁,效果越好 ,如果你的集成不是经常进行的(少于每天一次),那么集成就是一件痛苦的事情,如果集成偶尔才进行一次(一周甚至一个月), 等到集成阶段发现bug,然后找原因解决bug,会耗费你大量的时间与精力,而且这种方式有点象传统的集成模式,这违背了持续集成的初衷。根据Martin Fowler 的观点,项目 bug 的增加和时间并不是线性增长的关系,而是和时间的平方成正比,两次集成间隔的时间越长,bug 增加的数量越超过你的预期,解决 bug 付出的工作量也越大,而你越觉得付出的工作量越大,你就越想推迟到以后去集成,企图到最后一次性解决问题,结果 bug 产生的就更多,导致下一次集成的工作量更大,你越感觉到集成的痛苦,就越将集成的时间推后,最后形成恶性循环。因此如果集成的结果是让你感到痛苦,也许就说明你应该更频繁地进行集成。频繁的集成和及时的反馈鞭策着项目小组积极的面对问题,而 不是将问题推到最后来解决,如 果方法正确,更频繁的集成应该能减少你的痛苦,让你节约大量时间。因为持续集成最终是通过测试来验证创建,所以你会发现对于持续集成的频率的要求跟Kent Beck 提出的测试驱动的开发方法里面测试第一的理念完全一致。需要注意的是从项目的一开始就引入持续集成可以尽早的发现 bug,但是并不代表持续集成可以帮你你抓到所有的 bug。持续集成的排错能力取决于测试技术,众所周知,无法证明已经经过测试的代码就已经找到了所有的错误。

集成的名词解释

  • 集成[jí chéng] 

  • 集成(integration)就是一些孤立的事物或元素通过某种方式改变原有的分散状态集中在一起,产生联系,从而构成一个有机整体的过程。

  • 出    处:《告竣恭进表》

  • 基本资料

    基本解释:

    [corpus;grand compendium] 总体;尤指知识的或证据的。

    集成(integration)就是一些孤立的事物或元素通过某种方式集中在一起,产生联系,从而构成一个有机整体的过程。

    引证

    1、指聚合而成。多指汇集诸家著作而成丛书。

    清朝蒋廷锡《告竣恭进表》:“惟图书之钜册,为 圣祖 所集成。”如:《诸子集成》。

    2、也指集约度很高的生产工艺、生产设备及产品。例如手机、数码视听等便携电子产品广泛使用的是集成度很高的贴片工艺和集成电路芯片。电脑主板往往集成了集成显卡、声卡和网卡。一块CPU芯片,可以集成上千万个半导体零件;神舟飞船则集成了约20万个配套的系统。在家装业,集成吊顶的优势也是传统装饰无法比拟的。

  • 其他相关:

系统集成

所谓系统集成(SI,System Integration),就是通过结构化的综合布线系统和计算机网络技术,将各个分离的设备(如个人电脑)、功能和信息等集成到相互关联的、统一和协调的系统之中,使资源达到充分共享,实现集中、高效、便利的管理。系统集成应采用功能集成、BSV液晶拼接集成、综合布线、网络集成、软件界面集成等多种集成技术。系统集成实现的关键在于解决系统之间的互连和互操作性问题,它是一个多厂商、多协议和面向各种应用的体系结构。这需要解决各类设备、子系统间的接口、协议、系统平台、应用软件等与子系统、建筑环境、施工配合、组织管理和人员配备相关的一切面向集成的问题。

服务方式

系统集成作为一种新兴的服务方式,是近年来国际信息服务业中发展势头最猛的一个行业。系统集成的本质就是最优化的综合统筹设计,一个大型的综合计算机网络系统,系统集成包括计算机软件、硬件、操作系统技术、数据库技术、网络通讯技术等的集成,以及不同厂家产品选型,搭配的集成,系统集成所要达到的目标-整体性能最优,即所有部件和成分合在一起后不但能工作,而且全系统是低成本的、高效率的、性能匀称的、可扩充性和可维护的系统,为了达到此目标,系统集成商的优劣是至关重要的。

增长驱动

根据预测,未来3 年中国系统集成服务市场将以17.40%的年均复合增长率增长,主要驱动因素来自于几个方面:①信息化和工业化融合战略正在加快实施,利用信息技术改造提升传统产业成为普遍共识;②技术更新周期加快,重点行业通过信息化应用提高自动化、智能化程度。

2007-2012 年中国系统集成服务市场规模变化如上图

素质要求

这就对系统集成技术人员提出了很高的要求:不仅要精通各个厂商的产品和技术,能够提出系统模式和技术解决方案。更要对用户的业务模式、组织结构等有较好的理解。同时还要能够用现代工程学和项目管理的方式,对信息系统各个流程进行统一的进程和质量控制,并提供完善的服务。

显著特点

系统集成有以下几个显著特点:

1:系统集成要以满足用户的需求为根本出发点。

2:系统集成不是选择最好的产品的简单行为,而是要选择最适合用户的需求和投资规模的产品和技术。

3:系统集成不是简单的设备供货,它体现更多的是设计、调试与开发的技术和能力。

4:系统集成包含技术、管理和商务等方面,是一项综合性的系统工程。技术是系统集成工作的核心,管理和商务活动是系统集成项目成功实施的可靠保障。

5:性能性价比的高低是评价一个系统集成项目设计是否合理和实施是否成功的重要参考因素。

总而言之,系统集成是一种商业行为,也是一种管理行为,其本质是一种技术行为。

发展方向

随着系统集成市场的规范化、专用化的发展,系统集成商将趋于以下三个方向发展:

产品技术服务型

以原始厂商的产品为中心,对项目具体技术实现方案的某一功能部分提供技术实现方案和服务,即产品系统集成。

系统咨询型

对客户系统项目提供咨询(项目可行性评估、项目投资评估、应用系统模式、具体技术解决方案)。如有可能承接该项目,则负责对产品技术服务型和应用产品开发型的系统集成商进行项目实现招标、并负责项目管理(承包和分包)。

应用产品开发型

表现在与用户合作共同规划设计应用系统模型,与用户共同完成应用软件系统的设计开发,对行业知识和关键技术具有大量的积累,具有一批懂行业知识又懂计算机系统的两栖专业人员。为用户提供全面系统解决方案,完成最终的系统集成。

以当前系统集成市场的结果看,用户均看中应用产品开发型的系统集成商。能够提供组织合理,管理有效,技术有保障的系统集成是成功的关键。

系统集成新概念

在2008年,IBM就率先提出了“智慧地球”,试图从软件服务的角度切入工业基础设施领域。其商业模式是销售其软件、硬件和服务及融资的四位一体合同,其解决方案的核心是在数据整合互联化的基础上实现城市交通、水资源利用、医疗体系、平安保障和应急系统的智能化。

持续集成

持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。

问题

持续集成(Continuous integration)

集成软件的过程不是新问题,如果项目开发的规模比较小,比如一个人的项目,如果它对外部系统的依赖很小,那么软件集成不是问题,但是随着软件项目复杂度的增加(即使增加一个人),就会对集成和确保软件组件能够在一起工作提出了更多的要求-要早集成,常集成。早集成,频繁的集成帮助项目在早期发现项目风险和质量问题,如果到后期才发现这些问题,解决问题代价很大,很有可能导致项目延期或者项目失败。

定义

大师Martin Fowler对持续集成是这样定义的:持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽快地发现集成错误。许多团队发现这个过程可以大大减少集成的问题,让团队能够更快的开发内聚的软件。

措施

减少风险

一天中进行多次的集成,并做了相应的测试,这样有利于检查缺陷,了解软件的健康状况,减少假定。

减少重复过程

减少重复的过程可以节省时间、费用和工作量。说起来简单,做起来难。这些浪费时间的重复劳动可能在我们的项目活动的任何一个环节发生,包括代码编译、数据库集成、测试、审查、部署及反馈。通过自动化的持续集成可以将这些重复的动作都变成自动化的,无需太多人工干预,让人们的时间更多的投入到动脑筋的、更高价值的事情上。

任何时间、任何地点生成可部署的软件

持续集成可以让您在任何时间发布可以部署的软件。从外界来看,这是持续集成最明显的好处,我们可以对改进软件品质和减少风险说起来滔滔不绝,但对于客户来说,可以部署的软件产品是最实际的资产。利用持续集成,您可以经常对源代码进行一些小改动,并将这些改动和其他的代码进行集成。如果出现问题,项目成员马上就会被通知到,问题会第一时间被修复。不采用持续集成的情况下,这些问题有可能到交付前的集成测试的时候才发现,有可能会导致延迟发布产品,而在急于修复这些缺陷的时候又有可能引入新的缺陷,最终可能导致项目失败。

增强项目的可见性

持续集成让我们能够注意到趋势并进行有效的决策。如果没有真实或最新的数据提供支持,项目就会遇到麻烦,每个人都会提出他最好的猜测。通常,项目成员通过手工收集这些信息,增加了负担,也很耗时。持续集成可以带来两点积极效果:

(1)有效决策:持续集成系统为项目构建状态和品质指标提供了及时的信息,有些持续集成系统可以报告功能完成度和缺陷率。

(2)注意到趋势:由于经常集成,我们可以看到一些趋势,如构建成功或失败、总体品质以及其它的项目信息。

建立团队对开发产品的信心

持续集成可以建立开发团队对开发产品的信心,因为他们清楚的知道每一次构建的结果,他们知道他们对软件的改动造成了哪些影响,结果怎么样。

要素

1.统一的代码库

2.自动构建

3.自动测试

4.每个人每天都要向代码库主干提交代码

5.每次代码递交后都会在持续集成服务器上触发一次构建

6.保证快速构建

7.模拟生产环境的自动测试

8.每个人都可以很容易的获取最新可执行的应用程序

9.每个人都清楚正在发生的状况

10.自动化的部署

原则

1. 所有的开发人员需要在本地机器上做本地构建,然后再提交的版本控制库中,从而确保他们的变更不会导致持续集成失败。

2. 开发人员每天至少向版本控制库中提交一次代码。

3. 开发人员每天至少需要从版本控制库中更新一次代码到本地机器。

4. 需要有专门的集成服务器来执行集成构建,每天要执行多次构建。

5. 每次构建都要100%通过。

6. 每次构建都可以生成可发布的产品。

7. 修复失败的构建是优先级最高的事情。

8. 测试是未来,未来是测试

持续集成对软件开发有什么作用

软件主要区分于系统软件和应用软件以及两者之间的中间件,其中系统软件包括操作系统和支撑软件,操作系统主要指计算机硬件和软件资源的程序,它是计算机系统的内核与基石。 支撑软件则是指支撑各种软件的开发与维护的软件,又叫软件开发环境,主要包括环境数据库与各种接口软件以及工具组,

如何优化系统架构 进行有效的持续集成/持续交付

首先先做基层,比如开发,比如运维然后开始做team leader然后开始做project leader然后在发展的话,看你自己的方向,如果还是技术,那就架构师,如果不是,那就是管理职位

有没有技术大牛了解java开发,测试和CI的关

大家可能对如下情景比较熟悉:

  • 如果开发过SSH的web项目,启动服务器可能会比较慢,有的项目甚至需要1分多钟,甚至更多,这个启动时间的等待一般就浪费了;

  • 在开发项目时,有些功能比较复杂,当时觉得思路特清晰,但是过了一段时间后,自己也忘了,完善功能时频繁出现bug,降低开发速度;

  • 在维护项目时,不知道自己修改的对还是不对,是否存在隐患;维护速度降下来了;

  • 如果开发一个很多人都使用的接口,典型的如用户系统,要保证比如升级时向下兼容;

  • 在团队间协作时,有时候只定义好接口,对方还没有给实现,如何进行同步开发?

  • 如上问题,估计只要是个开发人员,都可能遇到过;如果此时有了单元/集成测试,那我们能很好的解决这些问题。(注:加下来如果没有特殊情况,不刻意强调 单元测试/集成测试,即提到测试是指的是单元/集成测试)

    我从以下几个方面介绍测试:

    1、为什么需要测试?

    2、如何进行测试?

    3、测试有哪些好处?

    4、一切都需要测试吗?

    1、为什么需要测试?

    测试的目的是什么?我的理解是:

  • 缩短发现问题到解决问题的速度;

  • 给程序一个修改后能验证是否正确的保证;(回归测试)

  • 如果是开源软件,我们可以通过单元测试了解其是怎么使用的;比如我之前通过cglib的单元测试学习过cglib的使用;

  • 所以如果你遇到如上问题,就需要写测试。写测试可能是为了自己(1、2);也可能是为了帮助别人(3)。

    2、如何进行测试?

    很多朋友不知道如何进行测试,其实测试很简单,别把它想复杂了,按照自己的想法测试每个功能点是否正确即可。

    2.1、测试流程

    单元测试流程

    集成测试流程

    集成测试流程 

    可以看出,单元测试与集成测试唯一不同点是一个调用依赖系统而一个不调用;因为单元测试是最小粒度的测试,如在Java中是测试一个类,不会测试依赖系统;而集成测试是会测试依赖系统的。

    测试的步骤:

  • 准备环境

  • 调用被测系统

  • 验证

  • 清理环境

  • 环境:也叫做夹具(fixture)或者固件,表示调用被测系统时需要准备/清理的数据等等;

    被测系统:在Java中就是要测试的类,如UserService;

    依赖系统:测试被测系统时,其依赖的部分,如UserDao;

    测试用例:包含测试方法的类,里边有很多测试方法来测试被测系统。

    接下来仔细看看各部分都做了哪些工作。

    2.2、环境

    环境,也叫做夹具(fixture),表示调用被测系统时需要准备/清理的数据等等;保证测试时环境是干净的,如不被之前的数据库数据影响;保证每次测试都是在干净/新鲜的环境中执行的。所谓干净的环境表示如当前测试不被之前测试插入/删除/修改的数据造成影响。在junit中可以使用:

  • @Before(setUp) 安装夹具或准备环境:在测试用例的每个测试方法之前执行;比如创建新鲜的被测系统,单元测试时安装Mock的依赖系统;

  • @After(tearDown)卸载夹具或清理环境:在测试用例的每个测试方法之后执行;比如数据库测试时回滚事务,删除数据;关闭文件;

  • @BeforeClass:在整个测试用例之前执行;

  • @AfterClass:在整个测试用例之后执行;

  • 使用如上方法,而不是直接在测试方法中安装/卸载;是因为不管有没有异常,@After/@AfterClass都会执行,这样防止出现异常可能造成环境是不新鲜的问题。

    如果大家使用spring test来测试数据库相关的系统,可以考虑使用@TransactionConfiguration来支持默认事务回滚,这样不会对现有系统造成影响。具体可参考《【第十三章】 测试 之 13.1 概述 13.2 单元测试 ——跟我学spring3》和《【第十三章】 测试 之 13.3 集成测试 ——跟我学spring3》

    测试时一定要保证环境是干净/新鲜的,才能保证每次测试的结果是一样的。

    2.3、被测系统与依赖系统

    被测系统:在Java中就是被测试的Java类。

    依赖系统:就是被测试Java类依赖的其他类。

    如果是单元测试,一般情况下,会对依赖系统进行模拟(Mock),即给它一个假的实现;典型的如测试服务层时注入一个Mock的DAO层,这样的好处:

  • 加快测试速度;因为不会调用真实的被测系统,所以速度特别快;

  • 测试还没有完成的功能;尤其在多团队协作时,可以只在定义好接口的情况下开发系统;

  • 如果是集成测试时,直接注入真实的依赖系统即可,好处:

  • 完成联调;

  • 发现自己的问题;

  • 还可能发现自己使用上问题及使用的API的问题;

  • 单元测试虽然好,但是是隔离测试,即不会调用被测系统来完成测试,因为不是真实的联调,所以很可能会潜在有一些问题,因此还是需要集成测试。(所以不是很刻意分单元或集成测试,且有些系统可能只有集成测试)

    但是集成测试速度是比较慢的,一般提交给CI执行,不影响当前开发进度。

    2.4、验证

    验证的目的:是保证实际结果和我们预期的结果是否一致,说白了就是是否是我们想的那样。

    一般使用断言来验证,如:

    Assert.assertEquals(expectedResult, actualResult); //验证预期结果和实际结果是否相等

    验证主要有两种:

  • 结果验证

  • 行为验证

  • 结果验证:即验证被测系统返回的结果是否正确,如:

    Java代码  

  • @Test  

  • public void testCount() {  

  • String ql = “select count(o) from User o“;  

  • long expectedCount = repositoryHelper.count(ql) + 1;  

  • User user = createUser();  

  • repositoryHelper.getEntityManager().persist(user);  

  • long acutalCount = repositoryHelper.count(ql);  

  • Assert.assertEquals(expectedCount, acutalCount);  

  • }  

  • 验证返回的数据总数 = 插入之前的总数 + 1; 即结果验证。此处我们使用了一种叫做相对(delta)测试;即不关心数据库里到底多少条,只关心实际的和预期的差。

    行为验证:即验证被测系统是否调用了依赖系统的某个API ,这个只有当我们使用Mock时测试时比较简单,如当用户注册时:

    1、加积分

    2、发系统消息

    3、……

    此时我们并不能通过结果验证是否调用了这些方法;那么我们可以使用Mock技术来完成验证是否调用了这些API,比如使用jmock测试框架就支持行为验证。集成测试是很难进行行为验证的,如果测试需要预留间谍接口。

    3、测试有哪些好处?

    我们写代码的目的是正确的完成某个功能,如何保证正确呢?测试!所以在不使用如单元测试技术时,我们也是需要测试,但是这个测试是我们人工验证的。缺点很明显:

  • 不是自动的,每次需要对比预期结果与实际结果,尤其数据量/逻辑复杂时更痛苦;

  • 不是回归的,上次测试完成后,下次还得重复自己一遍;

  • 为了解决这个问题,我们使用如单元测试技术来解决这个问题:

  • 测试自动化;即验证预期结果与实际结果交给计算机吧;

  • 测试回归性,可以重复执行测试,验证修改后逻辑是否还是正确的;

  • 即测试的好处,从如上已经提炼出来了:

  • 缩短发现问题到解决问题的时间;

  • 重复使用测试,保证修改后的代码还是正确的;

  • 如果做开源项目,可以提供给使用人员参考如何使用;

  • 因为单元测试都非常快,所以提升了开发速度;

  • 4、一切都需要测试吗?

    肯定不是,一切都是相对的;哪些不需要测试呢:

  • 你非常熟悉的功能;

  • 一些简单的CRUD;

  • 你认为不需要测试的;比如你很有把握的东西,就没有必要浪费时间测试了;

  • 哪些需要测试呢:
  • 复杂的业务逻辑/系统核心功能,最典型的如订单系统:一定要有足够的单元测试保证,这是一个电商系统的核心;还有如用户系统、积分系统等等;

  • 框架级别/工具级别/通用级别的代码需要测试,即提供给第三方使用的代码,因为这些代码可能被很多系统依赖,应该保证其正确性;而且还要保证以后版本升级的向下兼容;

  • 你认为需要测试的,比如你没有把握的东西,还是写点测试来缩短如开发web项目的重启系统的时间吧;

  • 测试不是不耗时间的,没意义的测试就是浪费时间,最典型是一些书上的对一个增删改查进行测试,实际项目没有任何意义。所以你应该只对自己很难驾驭的觉得有必要的代码进行测试。不要成为一个测试狂,什么都测试。 

    一些测试可以参考我的《es——JavaEE快速开发脚手架》中的代码。通过测试我得到了许多好处。 

    到此我们介绍完成了测试,但是如果我们使用了如集成测试时,测试执行起来可能比较慢,跑一遍测试可能需要5分钟,那怎么办呢?

  • 每天下班前跑一遍集成测试,然后修复,下班走人;

  • CI:持续集成,交给持续集成服务器,自动地测试完成后把测试报告以邮件的形式发到开发人员邮箱;

  • ------------------------------------分割线----------------------------------

    接下来介绍一下CI吧。

    1、为什么需要CI

    2、CI如何工作的

    3、travis-ci介绍

    1、为什么需要CI

    正如前边说的,我们单独测试可能会遇到如下问题:

  • 如果写了一个测试,就要把所有测试跑一遍看看整个系统是否是正确的,那么每次等待时间是非常漫长的;

  • 如果团队中的其他成员改了功能并提交了,如何快速得到该次提交对当前系统代码是正确还是失败的反馈;

  • 那怎么办呢?自动化地持续集成(CI)!CI的核心就是干这件事情的。自动化持续地集成测试。

    使用CI后,如果使用Maven,可以新建多个profile:

  • 本地测试时忽略一些比较慢的测试;

  • CI服务器上执行所有测试;

  • 2、CI如何工作的

    一个典型的持续集成流程:

  • 定期检测版本服务器上是否有代码更新;

  • 如果发现代码更新,从版本服务器下载最新的代码;

  • 自动构建并自动化的测试;

  • 不管错误/失败,生成报告给开发人员;

  • 有些CI服务器还能产生可执行的软件,自动化地部署到测试机器,交给测试人员测试。

  • 如图所示:

    持续集成服务器其实就是一个定时器,自动帮你下载最新代码、编译、测试、集成及产生报告发给开发人员。

    常见的CI服务器有:

  • Apache Continuum

  • Hudson

  • CruiseControl

  • Jenkins CI

  • TeamCity 

  • Travis CI

  • 我09年时使用过TeamCity社区版,足够满足常见需求;目前我使用github托管项目,使用Travis CI进行分布式的持续集成,免费,目前看来还是不错的。

    3、travis-ci介绍

    我现在开发的ES-JavaEE项目开发脚手架就是使用travis ci进行持续集成;具体参考《Getting started》进行与Github集成,其支持的语言:

  • C

  • C++

  • Clojure

  • Erlang

  • Go

  • Groovy

  • Haskell

  • Java

  • JavaScript (with Node.js)

  • Objective-C

  • Perl

  • PHP

  • Python

  • Ruby

  • Scala

  • 支持的数据库:

  • MySQL

  • PostgreSQL

  • MongoDB

  • CouchDB

  • Redis

  • Riak

  • RabbitMQ

  • Memcached

  • Cassandra

  • Neo4J

  • ElasticSearch

  • Kestrel

  • SQLite3

  • 更多请参考其官网的介绍。

    如果是Java开发人员,支持的JDK包括:OpenJDK 和 OracleJDK。 如果使用的是OpenJDK,Maven中使用ascii2native插件时,需要如下配置: 

    Java代码  

  • 《plugin》  

  • 《groupId》org.codehaus.mojo《/groupId》  

  • 《artifactId》native2ascii-maven-plugin《/artifactId》  

  • 《version》1.0-alpha-1《/version》  

  • 《executions》  

  • 《execution》  

  • 《phase》generate-resources《/phase》  

  • 《goals》  

  • 《goal》native2ascii《/goal》  

  • 《/goals》  

  • 《configuration》  

  • 《encoding》UTF-8《/encoding》  

  • 《src》src/main/messages《/src》  

  • 《dest》target/${project.artifactId}/WEB-INF/classes《/dest》  

  • 《includes》messages.properties《/includes》  

  • 《/configuration》  

  • 《/execution》  

  • 《/executions》  

  • 《!-- native2ascii 使用的tools.jar --》  

  • 《dependencies》  

  • 《dependency》  

  • 《groupId》com.sun《/groupId》  

  • 《artifactId》tools《/artifactId》  

  • 《version》1.7.0《/version》  

  • 《scope》system《/scope》  

  • 《systemPath》${java.home}/../lib/tools.jar《/systemPath》  

  • 《/dependency》  

  • 《/dependencies》  

  • 《/plugin》  

  • 如果使用mysql,端口只能是3306。

    如果想开端口测试,这是不允许的。

    如下是我项目中的一个配置.travis.yml,放到项目的根下即可:

    -----------------------------------

    language: java           语言

    env:                           环境

    - DB=mysql              使用mysql

    jdk:

    - openjdk                jdk使用openjdk

    mysql: 

    database: es         数据库名为es

    username: root     用户名为root

    password :            密码为空

    encoding: utf8      编码为utf8

    install:                     安装时执行的脚本

    - mvn install -Dmaven.test.skip=true     mvn安装并跳过测试

    before_script:        script之前执行的测试

    - cd web              

    - mvn db:create  创建数据库的mvn命令(此处使用了 maven-db-plugin 插件)

    - mvn db:schema  创建脚本的mvn命令

    - mvn db:data        安装数据的mvn命令

    - cd ..

    script:                      测试时执行的脚步

    - cd common 

    - mvn test              测试common子模块

    - cd ..

    - cd web

    - mvn test -Pit       测试web子模块,并指定使用it profile测试(即集成测试的配置,具体参考pom.xml中的profile/it)

    notifications:          触发

    email:                  测试完成后测试报告发到哪

    - zhangkaitao0503@gmail.com  

    -----------------------------------

    持续集成不能修复代码的错误,而是和单元测试一样,缩短发现问题带解决问题的时间,这样可以提高开发效率,降低项目风险,提高项目的稳定性。而且尤其是团队协作时,可以发现其他人的代码是否对自己的代码产生影响。 

    到此我们利用单元测试+CI可以加速开发人员的开发速度。利用好单元测试和CI,不要纯粹为了单元测试和CI而去做这些事情。

    本文没有介绍TDD,TDD并不会那么美好,我认为我们可以借鉴TDD的一些思想,但决不能迷信TDD,有时候,尤其如开发企业应用,先写功能再写测试可能效率更高,而且大部分时候是不需要TDD的。而且我也没能在实际项目中获取太多TDD的好处,但是我获得了测试的好处。

    本文也没有介绍测试覆盖率,我认为不要一味的追求覆盖率,有时候有的覆盖率没有任何意义。所以不要让为了覆盖率而覆盖率拖慢了项目开发进度。

    正如stackoverflow上的一篇帖子《How deep are your unit tests?》上Kent Beck的回答:

    写道

    老板为我的代码付报酬,而不是测试,所以,我对此的价值观是——测试越少越好,少到你对你的代码质量达到了某种自信。

    可以前往coolshell的“单元测试要做多细?”去得到一些经验。

jenkins+maven+svn 远程部署到weblogic 持续集成

1. 安装 Docker首先,我们要安装 docker,因为这是 Drone 的工作流的最关键的元素。Drone 合理的利用了 docker 来构建和测试应用。容器技术提高了应用部署的效率。要安装 docker ,我们需要在不同的 linux 发行版本运行下面对应的命令,我们这里会说明 Ubuntu 14.04 和 CentOS 7 两个版本。Ubuntu要在 Ubuntu 上安装 Docker ,我们只需要运行下面的命令。# apt-get update # apt-get install docker.io安装之后我们需要使用service命令重启 docker 引擎。# service docker restart然后我们让 docker 在系统启动时自动启动。# update-rc.d docker defaults Adding system startup for /etc/init.d/docker ... /etc/rc0.d/K20docker -》 ../init.d/docker /etc/rc1.d/K20docker -》 ../init.d/docker /etc/rc6.d/K20docker -》 ../init.d/docker /etc/rc2.d/S20docker -》 ../init.d/docker /etc/rc3.d/S20docker -》 ../init.d/docker /etc/rc4.d/S20docker -》 ../init.d/docker /etc/rc5.d/S20docker -》 ../init.d/dockerCentOS

Docker的主要作用是什么

目前来看,Docker至少有以下应用场景:1)测试:Docker 很适合用于测试发布,将 Docker 封装后可以直接提供给测试人员进行运行,不再需要测试人员与运维、开发进行配合,进行环境搭建与部署。2)测试数据分离:在测试中,经常由于测试场景变换,需要修改依赖的数据库数据或者清空变动 memcache、Redis 中的缓存数据。Docker 相较于传统的虚拟机,更轻量与方便。可以很容易的将这些数据分离到不同的镜像中,根据不同需要随时进行切换。3)开发:开发人员共同使用同一个 Docker 镜像,同时修改的源代码都被挂载到本地磁盘。不再因为环境的不同而造成的不同程序行为而伤透脑筋,同时新人到岗时也能迅速建立开发、编译环境。4)PaaS 云服务:Docker 可以支持命令行封装与编程,通过自动加载与服务自发现,可以很方便的将封装于 Docker 镜像中的服务扩展成云服务。类似像 Doc 转换预览这样的服务封装于镜像中,根据业务请求的情况随时增加和减少容器的运行数量,随需应变。具体到Docker技术在测试领域的应用,可以体现在:1)快速搭建兼容性测试环境从Docker的镜像与容器技术特点可以预见,当被测应用要求在各类Web服务器、中间件、数据库的组合环境中得到充分验证时,可以快速地利用基础Docker镜像创建各类容器,装载相应的技术组件并快速启动运行,测试人员省去了大量花在测试环境搭建上的时间。2)快速搭建复杂分布式测试环境Docker的轻量虚拟化特点决定了它可以在一台机器上(甚至是测试人员的一台笔记本电脑上)轻松搭建出成百上千个分布式节点的容器环境,从而模拟以前需要耗费大量时间和机器资源才能搭建出来的分布式复杂测试环境。3)持续集成Docker可以快速创建和撤销容器,在持续集成的环境中,可以频繁和快速地进行部署和验证工作。

如何在jenkins 构建 github工程

搭建持续集成首先要了解什么是持续集成,带着明确的目标去搭建持续集成环境才能让我们少走很多弯路。持续集成(Continuous integration)简称CI,是一种软件开发的实践,可以让团队在持续集成的基础上收到反馈并加以改进,不必等到开发的后期才寻找和修复缺陷。当然要明白的是持续集成环境的搭建也不是一劳永逸的,随着软件项目复杂度的增加,持续集成的环境同样要加以维护以确保集成环境的可靠性。持续集成的重要要素:1.统一的代码库。 2.CI服务器 3.自动化测试和构建的脚本 4.Slaves持续集成的流程:CI服务器控制持续集成的整个过程,轮询代码库更新,根据预定义的脚本进行项目的构建,服务器将任务分配到Slave端。这就是整个持续集成的过程,我们需要根据我们的项目需求,制定好一个完善的持续集成方案,然后根据方案选择CI服务器和版本管理软件,我们的项目选择了Jenkins+Github的持续集成环境,这也是我要主要和大家讲述的。为什么要选择Jenkins?Jenins是现在非常流行的持续集成CI服务器,这与它的前身Hudson也有着很大的关系,Jenkins易于安装,不需要数据库的支持,直接通过Web界面进行配置,而且集成了RSS/Email的通知机制,支持分布式构建,具有丰富的插件,这些都是Jenkins相比其他持续集成服务器的优势所在。对于版本控制软件的选择要看项目需要了,可能是SVN也可能是Git,一般来说Jenkins都有提供插件支持,下面讲解一下Jenins+Github持续集成环境搭建的细节。这个持续集成环境构建的主要流程就是Jenins会在后台运行,轮询版本控制的存储库,当发现版本库出现变更,就会通过预定义的构建脚本进行项目的构建,Jenkins会根据项目需求将构建的任务分配到Slave端。一般的项目构建过程主要分为自动化编译和自动化测试两个阶段,这同样是你脚本发挥作用的阶段。1.Jenkins安装进入Jenkins官方网站下载最新的Jenkins,Jenkins提供war包的下载和各种操作系统的安装文件,选择war包即可。Jenkins的启动方法有两种:第一种是使用tomcat直接打开,就是把jenkins.war放入tomcat下的webapps目录下,当启动jenkins时,就会自动在webapps下建立jenkins目录。然后再浏览器的地址栏输入另一种方法要确保系统中安装了jdk,并且配置了环境变量,检测方法就是在命令行输入java回车后有多行的命令符提示。直接在命令行输入java -jar jenkins.war即可启动jenkins,默认会运行在8080端口,切换到浏览器的地址栏输入


声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,谢谢。

上一篇: 微信表白代码是什么?表白程序代码

下一篇: slang什么意思中文?英语中有俚语(slang),俚语是什么语



猜你感兴趣

推荐阅读

网站内容来自网络,如有侵权请联系我们,立即删除! | 软文发布 | 粤ICP备2021106084号