1.Jenkins介绍

  Jenkins是一款持续集成工具,通过和maven或者ant等工具整合,可以形成一个自动化持续集成的平台,达到一键更新发布项目的作用。

 

2.Jenkins安装

2.1安装包方式搭建

  1. 官网 http://pkg.jenkins-ci.org/获取需要安装包,例如centos系统,当前获取的最新版jenkins-1.564-1.1.noarch.rpm
  2. 将安装包上传到服务器,在存放目录执行

  rpm -ivh jenkins-1.564-1.1.noarch.rpm

 

  1. 安装完成后,启动jenkins

  Service Jenkins start

 

  1. 打开浏览器访问http://serviceIP:8080/

  注jenkins的启动需要jdk的支持,需要确定服务器上是否已安装jdk

  默认的端口是8080,如果需要修改可编辑/etc/sysconfig/jenkins文件进行配置

 

2.2war包方式搭建

  1. 官网http://pkg.jenkins-ci.org/获取最新war包
  2. 将war包上传至服务器的tomcat目录的webapps下
  3. 启动tomcat进行war包解压,解压完成后,重启tomcat
  4. 如果tomcat端口是8080,打开浏览器访问http://serviceIP:8080/

3.ant介绍

  ant是基于java的一款构建工具,通过配置build.xml,让项目可以进行编译,部署,打包。

 

4.ant安装

  1. 从官网http://ant.apache.org/bindownload.cgi获取最新的tar包。
  2. 上传至服务器目录,解压tar包即可

  tar –xvf   apache-ant-1.9.2-bin.tar

  注:使用javacc编译存在一些条件无法编译的情况,可以使用eclipse的编译器jdt进行编译。找到

  jdtCompilerAdapter.jar

  org.eclipse.jdt.compiler.tool_1.0.100.v_B79_R37x.jar

  org.eclipse.jdt.core_3.7.3.v20120119-1537.jar

  org.eclipse.jdt.debug.ui_3.6.1.v20111006_r372.jar

  上传至ant目录的lib下。在build.xml申明下使用jdt即可

  <property name="build.compiler"value="org.eclipse.jdt.core.JDTCompilerAdapter">

 

5.ant配置

  ant需要在项目路径下配置build.xml,通过build.xml写入的脚本,来实现功能。以下用一个示例文件来大致说明下。

  <?xml version="1.0" encoding="UTF-8"?>

  <project name="ZPublish_sks"  basedir="." default="publish">

  <property name="source.dir" value="JAVA" />

  <property name="lib.dir" value="UI/WEB-INF/lib" />

  <property name="plugin.dir" value="UI/WEB-INF/plugins" />

  <property name="tomcat.dir" value="/home/local/tomcat_test/tomcat_system" />

  <property name="classes.dir" value="${plugin.dir}/classes" />

  <property name="publish.dir" value="/home/web/skwx_test"/>

  <property name="database.dir" value="${publish.dir}/skwx_lgz/WEB-INF/plugins/classes" />

  <property name="backup.dir" value="/home/web/backup"/>

  <property name="wwwroot_skwx.dir" value="/home/web/resource_test/wwwroot_skwx"/>

  <property name="buildfile.dir" value="/home/web/buildfile"/>

用eclipse的编译工具编译,跳过不能编译泛型的问题-->

  <property name="build.compiler" value="org.eclipse.jdt.core.JDTCompilerAdapter"/>

定义jar包所在目录 -->

  <path id="classpath.dir">

  <fileset dir="${plugin.dir}/lib" includes="*.jar" />

  <fileset dir="${tomcat.dir}/lib" includes="*.jar" />

  <fileset dir="${lib.dir}" includes="*.jar" />

  <fileset dir="${plugin.dir}/required" includes="**/**/*.jar" />

  </path>

 

<target name="clean">

  <delete dir = "${classes.dir}"/>

  <mkdir dir="${classes.dir}" />

</target>

 

<target name="compile" depends="clean">

<!--执行编译 -->

  <javac source="1.6" target="1.6" encoding="UTF-8" srcdir="${source.dir}" destdir="${classes.dir}" includeantruntime="false" classpathref="classpath.dir"  includes="**/*/*.java"  debug="true" nowarn="true">

  </javac>

<!--拷贝src下的xml和config等文件  -->

  <copy todir="${classes.dir}">

  <fileset dir="${source.dir}">

  <include name="lang/**" />

  <include name="plugins/**" />

  <include name="dic/**" />

  <include name="**/*.config" />

  <include name="**/*.dat" />

  <include name="**/*.xml" />

  <include name="**/*.properties" />

  </fileset>

  </copy>

</target>

 

<target name="publish" depends="compile">

  <tstamp>

  <format property="DAY" pattern="yyyyMMddHHmmss" locale="cn" />

  </tstamp>

<!--备份文件-->

  <mkdir dir = "${backup.dir}/${DAY}"/>

  <copy todir="${backup.dir}/${DAY}">

  <fileset dir="${publish.dir}">

  </fileset>

  </copy>

<!--部署项目应用 -->

  <delete dir = "${publish.dir}"/>

  <mkdir dir = "${publish.dir}"/>

  <copy todir="${publish.dir}/skwx_lgz">

  <fileset dir="UI">

  </fileset>

  </copy>

<!--修改数据库连接为测试数据库  -->

  <delete file="${database.dir}/database.xml"/>

  <copy todir="${database.dir}" file="${buildfile.dir}/database.xml"/>

<!--拷贝模板等文件-->

  <delete includeemptydirs="true">

  <fileset dir="${wwwroot_skwx.dir}" includes="**/css/*.*,**/html/*.*,**/js/*.*,**/template/*.*,**/images/*.*"/>

  </delete>

  <copy todir="${wwwroot_skwx.dir}">

  <fileset dir="wwwroot_skwx">

  <include name="**/css/**" />

  <include name="**/html/**" />

  <include name="**/js/**" />

  <include name="**/images/**" />

  <include name="**/template/**" />

  </fileset>

  </copy>

</target>

</project>

 

  该build.xml主要实现了

 

  1. 删除编译目录
  2. 编译项目
  3. 部署项目

  其中环境变量要根据不同机器配置相对应路径。类似于公司的项目,要首先观察下项目的目录结构,把供编译使用的jar包存放路径找到,配置到classpath参数之中。接着建立buildfile目录,加入部署项目时用到的数据库连接文件(一般我们从svn获取的代码中的database.xml不是服务器的测试环境的链接,通过替换数据库链接文件,可以让各环境连接不同的数据库)。在根据项目实际情况,调整build.xml定制特殊功能。

 

6.jenkins配置

  建立jenkins+ant+svn持续构建环境主要要实现一个这样的流程

 

  1. 通过svn下载项目最新代码
  2. 关闭tomcat
  3. 调用ant脚本执行部署
  4. 启动tomcat

  通过让jenkins自动的执行这些步骤就能完成持续集成的工作。配置如下。

 

  1. 配置系统管理,配置服务器环境变量

1

 

  1. 访问jenkins,新建一个项目

2

 

  1. 配置svn

3

 

  1. 配置shell和ant

4

 

  1. 配置完成后点击项目的立刻构建按钮,就能达到持续集成的目的。

5

 

  通过规范化svn备注提交,可以达到更新说明的目的

 

6

 

 

 

 

  通过查看控制台输出,可以监控安装部署情况。

7

 

  1. 建立安全策略,建立账号防止多人访问误点。

8

  注意事项

1. jenkins中配置自动更新部署项目时,如果采取用execute shell启动/关闭tomcat,会发现可以进行关闭tomcat,但是无法启动tomcat,虽然构建会显示执行成功,但是查看进程,tomcat是没有启动的。这是因为Jenkins默认会在Build结束后Kill掉所有的衍生进程。需要进行以下配置,才能避免此类情况发生:

  重设环境变量build_id

 

  execute shell输入框中加入BUILD_ID=DONTKILLME,即可防止jenkins杀死启动的tomcat进程

 

 

9

  在启动jenkins 的时候禁止jenkins杀死衍生进程

 

  修改/etc/sysconfig/jenkins配置,在JENKINS_JAVA_OPTIONS中加入-Dhudson.util.ProcessTree.disable=true。需要重启jenkins生效

 

  此方法配置一次后,所有的job都无需设置BUILD_ID,就能够防止jenkins杀死启动的tomcat