持续集成记录备忘

持续集成

持续集成(Continuous integration,简称 CI)

开发中,我们经常遇到一些奇怪问题,比如:

本地可以编译成功的代码但是同事们更新代码后编译出错;

在项目有多个Target(目标)的时候,资源文件只添加到了当前的Target,另外一个Target这个时候是不能正常编译的;

写的工具类,被同事改了,或者自己有改动,很多地方用到了,怎么保证这个类的行为没有发生变化而影响到项目中的其它模块呢?

诸如此类。

引起各种奇怪问题的原因有很多,比如:

开发环境比较复杂不干净;

IDE的bug;

提交前有一些必要的检查需要做,但是开发时因为各种原因没做。

那么这些问题可否避免呢?当然是可以避免的,如果代码有新的改动,提交到版本库中的时候,有一个人帮我们检查必要事项,然后做做测试。这个当然是可以的,前提是老板同意专门招一个这样的人。

这些机械重复的事情我们可以找一个工具来帮我们完成,这个工具跑在一个专门的服务器上,该服务器环境相对干净、可以运行一些自动化操作(自动编译,代码检查,测试等环节)。那么这种工具,就是接下来讲的“持续集成”。

简单理解持续集成

为解决程序代码提交质量低,提交内容导致原有系统的bug,按时或按需自动编译版本,自动进行自动化测试。

详细理解持续集成

早集成、频繁的集成能够帮助项目开发者在早期发现项目风险和质量问题,越到后期发现的问题,解决的成本越高,从而有可能导致项目延期或者项目失败。

持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就是一个团队每天将集成多次,每次的集成都通过自动化的构建(包括编译,发布,自动化测试)来验证。简单来说,就是持续的定时的在多个团队成员的工作中进行集成,并且给予反馈。

持续集成的核心价值

持续集成中重复的编译发布等环节都是自动完成的,无需太多的人工干预,有利于减少重复过程以节省时间、费用和工作量;

持续集成保障了每个时间点上团队成员提交的代码是能成功集成的。换言之,任何时间点都能第一时间发现软件的集成问题,使任意时间发布可部署的软件成为了可能;

持续集成还能利于软件本身的发展趋势,这点在需求不明确或是频繁性变更的情景中尤其重要,持续集成的质量能帮助团队进行有效决策,同时建立团队对开发产品的信心。

业界普遍认同的持续集成的原则

需要版本控制软件保障团队成员提交的代码不会导致集成失败。常用的版本控制软件有IBM Rational ClearCase、CVS、Subversion 等;

开发人员必须及时向版本控制库中提交代码,也必须经常性地从版本控制库中更新代码到本地;

需要有专门的集成服务器来执行集成构建。根据项目的具体实际,集成构建可以被软件的修改来直接触发,也可以定时启动,如每半个小时构建一次;

必须保证构建的成功。如果构建失败,修复构建过程中的错误是优先级最高的工作。一旦修复,需要手动启动一次构建;

不更新构建失败的代码。

持续集成系统的组成

一个自动构建过程,包括自动编译、分发、部署和测试等。可帮助我们节省大量时间,完成这个过程的自动化后,在以后的开发过程中,我们需要做的,就是只是提交代码到版本库中,构建自动完成,基本不再需要人工干预。

一个代码存储库,即需要版本控制软件来保障代码的可维护性,同时作为构建过程的素材库。

一个持续集成服务器。最好有一台服务器单独作为持续集成服务器,一方面保证了环境的纯净,一方面不影响开发,而且持续集成服务器一般是随时准备开始构建的,所以一般也不关机。本文中介绍的 Jenkins 就是一个配置简单和使用方便的持续集成服务器。

集成操作步骤

首先要有统一的代码库,服务器不断从版本控制服务器上检查代码状态,看代码是否有更新。如果发现有代码更新,那么就从版本控制服务器下载最新的代码。等代码完全更新以后,调用自动化编译脚本,进行代码编译。然后运行所有的自动化测试,并且进行代码分析。如果其中任何一个步骤失败,就表示build失败,持续集成服务器会给予响应的反馈。每次代码提交之后,都会在持续集成服务器上触发一个定时构建,然后进行编译、部署。

持续集成利器--Jenkins

提到 Jenkins 就不得不提另一个持续集成工具——Hudson , Hudson 由 Sun 公司开发,2010 年 Sun 公司被 Oracle 公司收购, oracle 公司声称对 hudson 拥有商标所有权。 Jenkins是从 Hudson 中分离出来的一个可扩展的持续集成引擎,并将继续走 Open Source 的道路。二者现在由不同的团队在维护。

Jenkins 在持续集成领域市场份额中居于主导地位,被各种大小规模的团队用于用各种语言实现的各类项目中,语言包括.NET、Java、Ruby、Groovy、Grails、PHP 等。

Jenkins是一个独立的基于Java开发的一种开源持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能,使开发者从繁杂的集成中解脱出来,专注于更为重要的业务逻辑实现上。可用于自动化各种任务,如构建、测试和部署软件。

Jenkins可以建立一个软件项目或工作运行的计划任务。

Jenkins特点

开源免费。

跨平台,支持所有的平台。

安装配置超级简单。可以通过本机系统包Docker安装,甚至可以通过安装Java Runtime Environment的任何机器独立运行。

易于使用。web形式的可视化的用户管理页面,简单、直观、友好,发布工作人员只需要通过简单的 UI 操作就可以替代原来繁琐的发布工作。

master/slave支持分布式的build。

tips及时快速的帮助。

拥有良好的扩展性。已有的200多个开源插件可供使用,而且几乎每周会有新的开源插件贡献进来,这些插件的安装都十分快捷和简单。

发展良好。Jenkins 开源社区的规模变得越来越大、活跃度也变得越来越高,发展速度非常快。

Jenkins 的两个功能

不断地进行项目的构建/测试软件。

监控外部运行的作业: 如计划任务作业和 Qrocmail 的工作,即使是那些在远程机器上运行的计划任务。 Jenkins 生成这些日志并且很容易让你注意到错误的出现。实施监控集成中存在的错误,提供详细的日志文件和提醒功能,还能用图表的形式形象地展示项目构建的趋势和稳定性。

Jenkins的工作步骤

典型的工作流包括以下几个步骤:

开发

提交

编译

测试

发布

有了Jenkins的帮助,除了第1步,后续的4步都是自动化完成的。具体的,当你完成了提交,Jenkins会自动运行你的编译脚本,编译成功后,再运行你的测试脚本,这一步成功后,接着它会帮你把新程序发布出去,特别的,在最后一步,你可以选择手动发布,或自动发布,毕竟发布这件事情,还是需要人为的确认一下比较好。

Jenkins安装

安装过程包含如下几个方面:(具体安装方法可以自行百度一下,教程比较丰满)

1. JDK

2. Jenkins War包

3. Ant

4. Maven

查阅官方文档:https://jenkins.io/ 

Jenkins的启动和配置

启动命令如下:sudo service jenkins start

配置文件是/etc/sysconfig/jenkins,修改如下两项配置(根据实际需要设置)

#修改为18080,默认是8080

JENKINS_PORT="18080"

#内存设置,我这里设置成如下配置

JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true -Xms512m -Xmx1024m -XX:MaxNewSize=512m -XX:MaxPermSize=1024m"

初始化和修改工作空间

在浏览器中输入http://localhost:8090(默认是使用8080端口)

1. 从主页面直接到“系统管理>系统配置”,点击右边“高级”按钮,在工作空间目录”直接修改默认工作空间目录为自定义的/home/jenkins/workspace/${ITEM_FULLNAME}

2. 从主页面直接到“系统管理>Global Tool Configuration”,点击右边“Ant安装”按钮,在name中填入名字,可以自己取,这里我填写成ant(到时Invoke Ant时,需要选择ant),ANT_HOME填入Ant的环境变量

3. 全局配置JDK从主页面直接到“系统管理>Global Tool Configuration”,点击右边“JDK安装”按钮,在name中填入名字,可以自己取,这里我填写成ant(到时Invoke Ant时,需要选择ant),ANT_HOME填入Ant的环境变量

4. 添加信任证书,因为我的工程的源码是放在SVN上,所以在这里我们就是要添加SVN的验证,即SVN的用户名和密码。从主页面左边菜单点击到“Credentials”,进入到 Credentials列表点击Name列中即可对Credentials中用户进行修改、新增、删除操作

建立 Jenkins 自动化持续集成项目

 新建自由风格项目

点击左侧边栏的“新建”按钮,新建一个任务。

填写项目的名称,并选择一种构建的方式,此时我们选择第一个,构建一个自由风格的软件项目,然后点击“OK”按钮创建任务,并进行详细的配置

General

进入到主界面

第一步,点击高级按钮

第二步,勾选“自定义工作空间”,输入工作空间路径

若是只有一个项目,也可以直接到“系统管理>系统配置>工作空间目录”直接修改默认工作空间目录

源码管理

因为,我们的代码是部署在SVN服务器上的,所以这里有下面三个步骤来配置jenkins监控SVN服务器代码变化。

第一步,选择Subversion;

第二步,在Repository URL输入项目SVN地址;

第三步,在Credentials选择SVN用户名和账号,初次会需要点击Add添加

构建触发器

指定的项目完成构建后,触发此项目的构建。

Poll SCM:当选择此选项,您可以指定一个定时作业表达式来定义Jenkins每隔多久检查一下源代码 仓库的变化。如果发现变化,就执行一次构建。例如,表达式中填写H 2 * * *将使Jenkins每隔2分                  钟就检查一次源码仓库的变化。

Build periodically:此选项仅仅通知Jenkins按指定的频率对项目进行构建,而不管SCM是否有变化。如果想在这个Job中运行一些测试用例的话,它就很有帮助。

构建环境

构建

这部分主要是配置构建的相关内容,用于定时触发构建或者手动执行构建的时候,对代码检验、编译时进行的操作。构建概念到处可查到,形象来说,构建就是要把代码从某个地方拷贝过来,编译,再拷贝到某个地方去等等操作,当然不仅与此,但是主要用来干这个。因为我的项目是用ant脚本实现的编译和打包,所以我选择的是Invoke Ant,注意不要选择default喔,那个选择了没有用。

增加构建步骤:Invoke Ant

Targets:(什么也没写,默认执行根目录下的build.xml)

如果你的构建脚本build.xml不在workspace根目录、或者说你的构建脚本不叫build.xml。那么需要在高级里设置Build File选项的路;

build.xml配置文件请查看附件“build.xml说明”,里面有每句配置说明;checkstyleBuild.xml配置文件请查看附件“checkstyleBuild.xml说明”,里面有每句配置说明;findBugsBuild.xml配置文件请查看附件“findBugsBuild.xml说明”,里面有每句配置说明。

构建后操作

用于定义当前项目构建完之后的一些操作,比如构建完之后将checkstyle结果输出到指定日志文件,重新发布项目,去执行其他项目构建等。

注意,首先你必须安装好Deploy Plugin插件,然后在tomcat的conf目录配置tomcat-users.xml文件;

配置完之后一次war包路径、用户名、密码、主机即可配置完之后一次war包路径、用户名、密码、主机即可;

lWAR/EAR files:war文件的存放位置,如:**/build/warDest/ad-gx-admin.war。

lContext path:访问时需要输入的内容,如ad-gx-admin访问时如下:     http://172.16.4.166:10001/ ofCard/ad-gx-admin如果为空,默认是war包的名字。

lContainer:选择你的web容器,如tomca 7.x

lManager user name:填入tomcat-users.xml配置的username内容

lManager password:填入tomcat-users.xml配置的password内容

lTomcat URL:填入http://192.168.x.x:8080/

lDeploy on failure:构建失败依然部署,一般不选择

注意:虽然这种部署方法可能会导致tomcat加载时出现卡死的现象。但是也是最简单的部署方式。如果卡死了重启下就好了,将tomcat的java内存参数调高可以解决这个问题。最后不要忘记点击保存喔。好了!到此一个项目的获取源码,打包,远程部署构建;

checkstyle-result.xml配置文件请查看附件“checkstyle-result.xml说明”,里面有配置说明。所有这些配置多做完之后,在最下方点击“保存”按钮,现在回到首页去进行构建吧!!! 

监控

1、左边菜单栏

l新建:这里进入新建项目。

l用户:用户管理模块,对监控系统用户的增删改查。

l任务历史:以往构建过的项目。

l系统管理:进去是一些配置方面的东西,进入之后几个主要的子菜单分别是系统设置Global Tool    Configuration管理插件几个模块

lMy Views:当前监控的项目列表。

lCredentials:添加监控源码的的证书,其实就是SVN用户名和密码验证。

 2、监控项目列表 这里主要是Jenkins当前正在监控的项目列表。点击进去可查看当前项目详细情况。 

模块1:

l状态:最后一次构建的状态;

l修改记录:代码修改记录;

l工作空间:编译后代码存放的目录;

l立即构建:单击此处,可立即进行构建;

l删除Project:单击此处,可删除该项目;

l配置:配置该项目相关监控信息(工作空间、chestyle规则等);

lCheckstyle Warnings:当前这次构建发现的静态警告;

lFindBugs Warnings:当前这次构建发现的FindBugs。

模块2:

这里显示的最近一次构建的相关信息,是否构建成功、构建用时等

模块3:

lCheckstyle Trend:历史构建完之后的解决的代码中静态警告走势;

lFindBus Trend:历史构建完之后的解决的代码中FindBugs走势。

构建状态查询

当任务一旦运行,您将会看到这个任务正在队列中的仪表板和当前工作主页上运行。

1构建状态:        下图中分级符号概述了一个Job新近一次构建会产生的四种可能的状态:

Successful:完成构建,且被认为是稳定的。

Unstable:完成构建,但被认为不稳定。

Failed:构建失败。

Disabled:构建已禁用。

2. 构建稳定性:        当一个Job中构建已完成并生成了一个未发布的目标构件,如果您准备评估此次构建的稳定性,Jenkins会基于一些后处理器任务为构建发布一个稳健指数(从0-100 ),这些任务一般以插件的方式实现。它们可能包括单元测试(JUnit)、覆盖率(Cobertura )和静态代码分析(FindBugs)。分数越高,表明构建越稳定。下图中分级符号概述了稳定性的评分范围。任何构建作业的状态(总分100)低于80分就是不稳定的。当前作业主页上还包含了一些有趣的条目。左侧栏的链接主要控制Job的配置、删除作业、构建作业。右边部分的链接指向最新的项目报告和构件。通过点击构建历史(Build History)中某个具体的构建链接,就能跳转到Jenkins为这个构建实例而创建的构建主页上。

如果你想通过视图输出界面来监控当前任务的进展情况。你可以单击Console Output(控制台输出)。如 果工作已完成,这将显示构建脚本产生的静态输出;如果作业仍然在运行中,Jenkins将不断刷新网页的内容,以便您可以看到它运行时的输出

常见错误处理

1.  java.lang.UnsupportedClassVersionError

这是因为jenkins和jdk版本不对应引起的。我这里用的是jdk1.7,所以下载版本http://pkg.jenkins-ci.org/redhat/jenkins-2.33-1.1.noarch.rpm(jenkins下载地址:http://pkg.jenkins-ci.org/redhat/),   原先现在2.5版本以上,版本太高,启动报“java.lang.UnsupportedClassVersionError”错,所以要卸载之前安装的jenkins-2.54-1.1.noarch,使用如下命令

2. command execution failed.Maybe you need to configure the job to choose one of your Ant installations?

控制台输出Started by user admin[EnvInject] - Loading node environment variables.Building in workspace /home/jenkins/workspace/My_cacheUpdating https://ip地址/svn/iptv/新业务/广西开机广告/code/ad-gx-cache at revision '2017-07-17T14:14:11.377 +0800'Using sole credentials hehaitao/****** in realm ‘<https://ip地址:443> VisualSVN Server’At revision 68144No changes for https://ip地址/svn/iptv/%E6%96%B0%E4%B8%9A%E5%8A%A1/%E5%B9%BF%E8%A5%BF%E5%BC%80%E6%9C%BA%E5%B9%BF%E5%91%8A/code/ad-gx-cachesince the previous build[workspace] $ ant -file checkstyleBuild.xml -DBUILD_NUMBER=8ERROR: command execution failed.Maybe you need to configure the job to choose one of your Ant installations?[CHECKSTYLE] Skipping publisher since build result is FAILURE[FINDBUGS] Skipping publisher since build result is FAILURE Warning: you have no plugins providing access control for builds, so falling back to legacy behavior of permitting any downstream builds to be triggeredFinished: FAILURE”这是由于没有成功全局配置ant的环境变量没有配置成功导致,请确保环境Ant环境变量配置成功,并且在Global Tool Configuration正确添加了Ant的路径

3JAVA_HOME is not defined correctly.

控制台输出Started by user admin[EnvInject] - Loading node environment variables.Building in workspace /home/jenkins/workspace/My_cacheUpdating https://ip地址/svn/iptv/新业务/广西开机广告/code/ad-gx-cache at revision '2017-07-17T15:33:26.714 +0800'Using sole credentials hehaitao/****** in realm ‘<https://ip地址:443> VisualSVN Server’At revision 68151[workspace] $ /home/lutong/apache-ant-1.10.3/bin/ant -file checkstyleBuild.xml -DBUILD_NUMBER=11Error: JAVA_HOME is not defined correctly.  We cannot execute javaBuild step 'Invoke Ant' marked build as failure[CHECKSTYLE] Skipping publisher since build result is FAILURE[FINDBUGS] Skipping publisher since build result is FAILUREWarning: you have no plugins providing access control for builds, so falling back to legacy behavior of permitting any downstream builds to be triggeredFinished: FAILURE” 这是由于没有成功全局配置JDK的环境变量没有配置成功导致,请确保环境Ant环境变量配置成功,并且在Global Tool Configuration添加的JDK路径正确

4. Unable to access the repository 

在配置“源码管理”时,如果Credentials 不选择或者选择了验证不正确,会出现这个错误

Jenkins启动

首先保证系统中已经安装了jdk,最好是jdk1.5以上。

第一种启动方法:

切换到jenkins.jar存放的目录,输入如下命令:

$ java -jar jenkins.war

如果需要修改端口可以使用如下命令:

$ java -jar jenkins.war--httpPort=8081

然后在浏览器中(推荐用火狐)输入localhost:8080,localhost可以是本机的ip,也可以是计算机名。就可以打开jenkins。

第二种方法是用tomcat打开

解压tomcat到某个目录,如/usr/local,进入tomcat下的/bin目录,启动tomcat

将jenkins.war文件放入tomcat下的webapps目录下,启动tomcat时,会自动在webapps目录下建立jenkins目录,在地址栏上需要输入localhost:8080/jenkins。

Jenkins 的安装非常简单,只需要从 Jenkins 的主页上下载最新的 jenkins.war 文件然后运行java -jar jenkins.war。同时,还可以点击 Jenkins 页面上的 launch 按钮完成下载和运行 Jenkins。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,392评论 25 707
  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 12,680评论 2 59
  • 1.持续集成 1.1持续集成的定义 持续集成是一种软件开发实践,即团队开发成员经常集成它们的工作,通过每个成员每天...
    闻香师叔阅读 902评论 0 0
  • ANT build.xml文件详解(一) Ant的概念 可能有些读者并不连接什么是Ant以及入可使用它,但只要使用...
    SkTj阅读 3,960评论 0 2
  • 前段时间看《那件疯狂的小事叫爱情》,虽然豆瓣评论都不太好,但是里面看到了久违的老帅哥谢霆锋,我还是放弃了吐槽。感觉...
    番茄不是西红柿222阅读 850评论 0 1