====== Jenkins的介绍安装与使用 ====== ===== 什么是持续集成 ===== 随着软件开发复杂度的不断提高,团队开发成员间如何更好地协同工作以确保软件开发的质量已经慢慢成为开发过程中不可回避的问题。尤其是近些年来,敏捷(Agile) 在软件工程领域越来越红火,如何能再不断变化的需求中快速适应和保证软件的质量也显得尤其的重要。 持续集成正是针对这一类问题的一种软件开发实践。它倡导团队开发成员必须经常集成他们的工作,甚至每天都可能发生多次集成。而每次的集成都是通过自动化的构建来验证,包括自动编译、发布和测试,从而尽快地发现集成错误,让团队能够更快的开发内聚的软件。 ===== 持续集成的核心价值 ===== - 持续集成中的任何一个环节都是自动完成的,无需太多的人工干预,有利于减少重复过程以节省时间、费用和工作量; - 持续集成保障了每个时间点上团队成员提交的代码是能成功集成的。换言之,任何时间点都能第一时间发现软件的集成问题,使任意时间发布可部署的软件成为了可能; - 持续集成还能利于软件本身的发展趋势,这点在需求不明确或是频繁性变更的情景中尤其重要,持续集成的质量能帮助团队进行有效决策,同时建立团队对开发产品的信心。 ===== 持续集成的原则 ===== 业界普遍认同的持续集成的原则包括: - 需要版本控制软件保障团队成员提交的代码不会导致集成失败。常用的版本控制软件有 IBM Rational ClearCase、CVS、Subversion 等; - 开发人员必须及时向版本控制库中提交代码,也必须经常性地从版本控制库中更新代码到本地; - 需要有专门的集成服务器来执行集成构建。根据项目的具体实际,集成构建可以被软件的修改来直接触发,也可以定时启动,如每半个小时构建一次; - 必须保证构建的成功。如果构建失败,修复构建过程中的错误是优先级最高的工作。一旦修复,需要手动启动一次构建。 ===== 持续集成系统的组成 ===== 由此可见,一个完整的构建系统必须包括: 一个自动构建过程,包括自动编译、分发、部署和测试等。 一个代码存储库,即需要版本控制软件来保障代码的可维护性,同时作为构建过程的素材库。 一个持续集成服务器。本文中介绍的 Jenkins 就是一个配置简单和使用方便的持续集成服务器。 ===== Jenkins的介绍 ===== Jenkins 是一个开源项目,提供了一种易于使用的持续集成系统,使开发者从繁杂的集成中解脱出来,专注于更为重要的业务逻辑实现上。同时 Jenkins 能实施监控集成中存在的错误,提供详细的日志文件和提醒功能,还能用图表的形式形象地展示项目构建的趋势和稳定性。 Jenkins的官网地址:http://jenkins-ci.org/ ===== Jenkins的安装 ===== 以下是在Ubuntu 14.04.2上安装的步骤(摘自官网的安装步骤:https://wiki.jenkins-ci.org/display/JENKINS/Installing+Jenkins+on+Ubuntu) wget -O - https://jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add - #使用sudo输入root的密码 sudo sh -c 'echo deb http://pkg.jenkins-ci.org/debian binary/ > /etc/apt/sources.list.d/jenkins.list' sudo apt-get update sudo apt-get install jenkins 安装过后,详情如下: * 自动新建一个jenkins用户,宿主目录位于/var/lib/jenkins(可以进root用户passwd jenkins修改密码) * 日志文件位于/var/log/jenkins/jenkins.log * 配置文件位于:/etc/default/jenkins和/etc/init.d/jenkins * 默认端口8080 由于,在我的机器8080端口已经被tomcat占用,所以这里要修改端口,方法如下: - 修改/etc/init.d/jenkins,搜索''"$HTTP_PORT" "8080"'',改成''"$HTTP_PORT" "7070"'' - 修改/etc/default/jenkins,搜索''HTTP_PORT=8080''改成''HTTP_PORT=7070'' 启动脚本可以带上端口号,使用nohup让进程在背后运行 nohup java -jar /usr/share/jenkins/jenkins.war --httpPort=7070 >> ~/logs/jenkins/jenkins_nohup.out & 到这里,安装都已完成。 ===== Jenkins的访问 ===== http://121.43.104.34:7070/ {{ :分享:技术:持续集成:1.png?300 |}} {{ :分享:技术:持续集成:2.png?300 |}} ===== Jenkins新建构建任务前的准备 ===== 访问 系统管理>系统配置 http://121.43.104.34:7070/configure * 设置maven {{ :分享:技术:持续集成:3.png?300 |}} * 设置subversion {{ :分享:技术:持续集成:4.png?300 |}} {{ :分享:技术:持续集成:5.png?300 |}} {{ :分享:技术:持续集成:6.png?300 |}} ===== Jenkins新建构建任务 ===== {{ :分享:技术:持续集成:7.png?300 |}} {{ :分享:技术:持续集成:8.png?300 |}} {{ :分享:技术:持续集成:9.png?300 |}} {{ :分享:技术:持续集成:10.png?300 |}} 到这里,Jenkins构建任务就可以成功执行完,相当于Ubuntu上之前写的脚本,达到的效果是一样的: mkdir -p ~/build/target/record mkdir -p ~/distribute/record cd ~/build/target/record rm -rf * svn co svn://121.43.104.34/gxx/trunk/record --username gxx --password 123456 ~/build/target/record cd ~/build/target/record mvn clean install -P test cp ~/build/target/record/target/*.war ~/distribute/record/record.war cp ~/build/target/record/target/*.war /home/soft/apache-tomcat-6.0.39/webapps/ tail -f ~/logs/record/record.log ===== Jenkins常用菜单介绍 ===== 构建历史可以查看之前的构建记录,红色表示构建失败,蓝色表示构建成功 {{ :分享:技术:持续集成:11.png?300 |}} 点击#1,#2进入页面后,点击左侧的Console Output可以查看构建成功日志,失败日志和失败后的解决建议 {{ :分享:技术:持续集成:12.png?300 |}} ===== Jenkins暂未研究功能 ===== Jenkins用户 {{ :分享:技术:持续集成:13.png?300 |}} Jenkins插件 {{ :分享:技术:持续集成:14.png?300 |}} Jenkins邮件功能:比如构建失败会邮件通知 {{ :分享:技术:持续集成:15.png?300 |}} {{ :分享:技术:持续集成:16.png?300 |}} Jenkins定规则构建:比如定时每天早上9点构建一次 ===== Jenkins相关目录介绍 ===== ~/.jenkins #安装Jenkins后,用户宿主目录下会有一个隐藏文件夹(类似.m2),需要ls -a才能看到,里面放置Jenkins基本上所有的东西 ~/.jenkins/plugins #插件目录 ~/.jenkins/jobs #任务目录 ~/.jenkins/jobs/record/workspace #任务名为record的工作空间目录,里面放置svn拉下来的源代码 ~/.jenkins/jobs/record/workspace/src #源代码目录 ~/.jenkins/jobs/record/workspace/pom.xml #pom.xml ~/.jenkins/jobs/record/workspace/target #构建目标目录 ~/.jenkins/jobs/record/workspace/target/record.war #构建后的war包 ===== Jenkins构建出错记录 ===== * 报错1 [workspace] $ java -Xms256m -Xmx512m -cp /home/gxx/.jenkins/plugins/maven-plugin/WEB-INF/lib/maven31-agent-1.5.jar:/home/soft/apache-maven-3.3.3/boot/plexus-classworlds-2.5.2.jar:/home/soft/apache-maven-3.3.3/conf/logging jenkins.maven3.agent.Maven31Main /home/soft/apache-maven-3.3.3 /home/gxx/.jenkins/war/WEB-INF/lib/remoting-2.51.jar /home/gxx/.jenkins/plugins/maven-plugin/WEB-INF/lib/maven31-interceptor-1.5.jar /home/gxx/.jenkins/plugins/maven-plugin/WEB-INF/lib/maven3-interceptor-commons-1.5.jar 45620 Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000dae00000, 89456640, 0) failed; error='Cannot allocate memory' (errno=12) # # There is insufficient memory for the Java Runtime Environment to continue. # Native memory allocation (malloc) failed to allocate 89456640 bytes for committing reserved memory. # An error report file with more information is saved as: # /home/gxx/.jenkins/jobs/record/workspace/hs_err_pid9721.log ''insufficient memory''表示内存不足,Ubuntu中''top''查看''KiB Mem: 1016272 total, 943532 used, 72740 free, 248 buffers'',显示1016M内存已经使用943M,还剩72M内存可用,内存基本已经用满,所以构建失败!解决方法:扩大内存,或者,kill掉其他进程释放内存,重新构建。 * 报错2 Started by user anonymous Building in workspace /home/gxx/.jenkins/jobs/record/workspace Updating svn://121.43.104.34/gxx/trunk at revision '2015-07-15T18:00:42.200 +0800' At revision 39 no change for svn://121.43.104.34/gxx/trunk since the previous build Parsing POMs [workspace] $ /bin/sh -xe /tmp/hudson8535227838770415382.sh + cp target/record.war /home/soft/apache-tomcat-6.0.39/webapps/ ERROR: No such file /home/gxx/.jenkins/jobs/record/workspace/pom.xml Perhaps you need to specify the correct POM file path in the project configuration? Finished: FAILURE ''No such file /home/gxx/.jenkins/jobs/record/workspace/pom.xml''表示pom.xml找不到,原因是svn路径写错''svn://121.43.104.34/gxx/trunk'',应该是''svn://121.43.104.34/gxx/trunk/record''