您的位置:首页 > 其它

持续集成学习笔记-入门篇(5)持续集成自动化(二):具体实现方式一

2012-08-30 09:54 525 查看
持续集成自动化的第一种实现方式思路:以maven默认生成的项目为核心,直接用于项目开发和CI构建。

由于笔者条件所限,所有的操作、运行均在本机执行。

一、基本步骤

1、准备阶段

1.1.
通过Maven(根据默认目录结构规则)生成项目,并用于构建(工作空间)

1.2.
修改POM.xml文件

1.3.
通过SVN生成空的、新的版本控制仓库

1.4.
向SVN 提交(import) Maven中的源代码目录和相关文件,形成开发用的源代码仓库

1.5.
通过Jenkins整合源代码仓库和Maven构建

2、使用阶段

2.1.
下载仓库里的源代码

2.2.
提交更新后的源代码

2.3.
自动进行构建工作

3、说明

准备阶段工作是实现持续集成自动化的重点阶段。

笔者使用的工具为SVN+Maven+Jenkins+Eclipse,主要实现了在本机上的持续集成自动化工作。也可供在C/S或R/S架构下进行持续集成自动化工作参考。

通过上述步骤,最后生成一个仓库,两个工作空间/目录

l 一个仓库:SVN源代码仓库

l 两个工作空间/目录:(这两个工作空间是需要分开的)

² 构建空间:用于构建用的CI项目文件夹

² 开发空间:程序员下载SVN仓库源代码后形成的开发文件夹

二、具体实现

1、准备阶段

1.1.
通过Maven(根据默认目录结构规则)生成项目,并用于构建(Workspace)

有两种常见的方法可以建立Maven项目,一种是通过命令行,一种是通过Eclispe(事先一定要安装好maven插件)。这里采用后一种方法。前一种方法可以查阅《学习笔记(4)》推荐的Maven参考文档。

(1)、启动Eclipse,打开file->new,选中Moven project。然后点击next,进入下一界面



(2)、可以使用默认的项目目录所在位置,也可以自己设定。这里默认。然后点击next,进入下一界面。



(3)、在Filter中键入“java”后,系统会自动寻找相关的archetype(记着要连上网,不然可啥也找不到)。如下图,笔者选择的是artigfact
id=java-1.6-archetype。然后点击next,进入下一界面。



(4)、需要设置本工程的Group Id和Artifact Id,笔者都设为DEMO。然后点击Finish。



(5)、最后形成的maven项目目录结构如下



1.2.
修改POM.xml文件

通过上一个步骤,会自动生成POM.xml文件。由于本示例采用Maven的默认目录架构,而且只是实现编译和单元测试等常规工作,因此不需要对POM.xml改动。

在实际工作中,可以根据需要加入其他的依赖、插件等内容,并进行相关配置。这方面的操作方式,可以参看《学习笔记(4)》推荐的Maven中文参考文档:《Maven权威指南中文版》中的第四章《定制一个Maven项目》。

自动生成的POM.xml内容如下:

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

<project xmlns="http://maven.apache.org/POM/4.0.0"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>www</groupId>

<artifactId>www</artifactId>

<version>0.0.1-SNAPSHOT</version>

<packaging>jar</packaging>

<name>www</name>

<url>http://maven.apache.org</url>

<properties>

<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

</properties>

<build>

<plugins>

<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-compiler-plugin</artifactId>

<version>2.3.2</version>

<configuration>

<source>1.6</source>

<target>1.6</target>

</configuration>

</plugin>

</plugins>

</build>

<dependencies>

<dependency>

<groupId>junit</groupId>

<artifactId>junit</artifactId>

<version>4.8.1</version>

<scope>test</scope>

</dependency>

<dependency>

<groupId>org.mockito</groupId>

<artifactId>mockito-all</artifactId>

<version>1.8.5</version>

<scope>test</scope>

</dependency>

<dependency>

<groupId>org.hamcrest</groupId>

<artifactId>hamcrest-integration</artifactId>

<version>1.2.1</version>

</dependency>

<dependency>

<groupId>net.avh4.util</groupId>

<artifactId>imagecomparison</artifactId>

<version>0.0.2</version>

<scope>test</scope>

</dependency>

</dependencies>

</project>

1.3.
通过SVN生成空的、新的版本控制仓库

(1)、建立一个空文件夹。笔者是在C盘下建立了一个DEMO的空文件夹。

(2)、进入这个空文件夹,单击鼠标右键,弹出浮动菜单。选择TortoiseSVN->Create repository here



(3)、在文件夹中会自动生成相关仓库目录和文件。此时要在弹出的Repository created窗口中选中Create folder structure,则可自动生成trunk、branches、tags等几个目录。当然也可以手动生成(通过Ropo-browser)。



对于初学者来说,如果想当然地、直接在本文件夹中搜索trunk、branches、tags这几个目录,或者想找到项目开发的源代码文件在哪里,那是永远也找不到的。因为SVN把这些信息都放到db下的相关数据库文件里了。要想看到这些目录信息和源代码文件,需要通过TortoiseSVN->Ropo-browser打开。



打开Ropo-browser后,我们可以看到真正的仓库目录结构和相关文件了。



究竟trunk、branches、tags三个目录应该放置何类源代码,众说纷纭。笔者采用最常见的观点意见:

²
Trunk:用于开发主线用的源代码仓库

²
Branches:用于开发支线用的源代码仓库

²
Tags:用于发布(release)的源代码仓库

实际上,你可以任意规定、生成目录,以用于不同用途。上述三个目录只不过是约定俗成的结果,这样与其他人沟通会比较容易理解一些而已。

1.4.
向SVN
提交(import) Maven的源代码目录和相关文件,作为开发用的源代码仓库


现在,SVN中的Trunk仓库实际上是空的。要想真正用于开发,首先要把开发用的源代码目录和相关文件传到Trunk仓库里。

有两种方法,一是通过TortoiseSVN->Import进行处理,一种是通过Eclipse。笔者两种都试了一下,发现后一种用起来比较舒服(虽然操作步骤多了一些),所以这里只说明后一种的操作步骤。注意的是:在本文中,是从Maven的CI工作空间中提交相关的源代码目录和文件(在第二种持续集成自动化实现思路中,则是直接从Eclipse自己生成的工程项目中提交)

其中,1-5步建立Maven项目与SVN仓库的联系,6-7步才是真正提交过程。

(1)、在DEMO工程上单击鼠标右键,选择Team->Share Project。



(2)、选择“SVN”,点击Next。



(3)、选择“创建新的资源库位置”,点击Next。



(4)、在URL中输入“file:///C:/DEMO”,即我们上一步建立的空的、新的SVN仓库目录所在地,点击Next。



(5)、选择“使用指定的模块名”,并键入”Trunk”,点击finish。



此时,回到初始界面,就会发现在工程文件名DEMO后面加上了[TRUNK]字样



(6)、再一次,在DEMO工程上单击鼠标右键,选择Team->提交



(7)、在这里,我们只提交DEMO/src目录、其下的子目录和文件,其它目录和文件我们不选择,毕竟开发时是用不到的。点击OK。然后开始自动上传相关文件。



回到我们设立的SVN仓库目录下,通过Ropo-browser,我们可以在trunk目录下看到已经上传好的目录和文件了



1.5.
通过Jenkins整合源代码仓库和Maven构建工程

通过前四步的准备,激动人心的重头戏来了,呵呵。

(1)、首先,启动tomcat服务(有N种方法,自己琢磨吧),在浏览器中键入http://127.0.0.1:8080/jenkins/,启动jenkins。然后点击“新job”。



(2)、进入任务名称和类型设定界面。任务名称我们填入“DEMOtest”,选择“构建一个自由风格的软件项目”,然后点击OK



(3)进入job配置(configuration)页面,进行具体的配置工作

1)
首先,设置CI工作空间。点击“高级项目选项”的“高级…”键后,选择“使用自定义的工作空间”。这个工作空间实际上就是当时我们生成Maven项目时所在文件夹(Eclipse默认的工作空间文件夹一般在C:\Users\username\
workspace下。其中username是指本机用户名,不同机子的用户名是不同的,自己注意)。在“目录”中键入C:\Users\username\workspace\DEMO



2)
其次,进行源码管理。这里我们选择Subversion。在Repository URL中键入仓库文件夹所在“file:///C:/DEMO/trunk”。记着,这里要键入trunk,因为现在只有在那个目录下才有源代码。



如果你愿意,还可以通过配置POM.xml中的Maven SCM Plugin实现对SVN仓库的checkout。
3)
然后,设置构建触发器。这里我们选择“Build periodically”,以保证周期性的集成。采用crontab格,在日程表中键入“0 18 * * *”,这五个数/字符之间用空格隔开,

五个数的含义:从左到右分别为分钟、小时、日、月、星期。这里的具体设置表示每天下午6点(24小时制下的18点)进行一次构建。这个触发器的设置保证了每天可以自动进行集成(前提是Jenkins服务一直在运行)。



4)
再然后,就需要设置具体的构建命令了。点击“增加构建步骤”,选择“Invoke top-level Maven targets”



在出现的界面中,点击“高级”按钮,



然后进行具体配置。其中,POM下目录为C:\Users\username\workspace\DEMO\pom.xml。或者直接写pom.xml也可,因为这个pom.xml是放在自定义工作空间下的,Jenkins会去自动找的。Goals下为
clean install。记着,不要按照命令行习惯在具体的命令前加mvn。



此时,基本的job配置就完成了。

5)
如果想实现自动部署,就让我们再进一步吧。在“构建后操作中”,单击“Add post-build action”,选择“Deploy war/ear to a container”。记住,需要事先通过Jenkins下载deploy插件,不然不会有Deploy选项的。



由于本文示例是一个普通的java工程,生成后的打包文件是.jar,不便演示。所以这一步笔者假设我们的工程是一个web项目,那么生成后的打包文件就是.war格式了。以下设置会自动将.war包部署至Tomcat服务器下的webapp目录下。



war/ear files键入“target/DEMO.war”。这里我们假设,构建后生成的.war文件名称为DEMO.war,且自动生成于C:\Users\username\workspace\DEMO\target目录下。要是图省事,也可以直接键入“**/*.war”,Jenkins会自动寻找.war文件

Container选择TOMcat7.X。事先需要设置tomcat的manager-script用户和密码。方法:进入tomcat的安装目录/conf下,找到tomcat-users.xml,打开,增加下列内容:

<role rolename="manager-script"/>

<user username="tomcat" password="tomcat" roles="manager-script"/>

设置好后,在Manager user name和Manager password中分别填入“tomcat”、“tomcat”。如果没有设置这些用户信息,在自动构建部署时则会提示你一大堆的错误信息,呵呵。

Tomcat URL为“http://127.0.0.1:8080”或者“http://localhost:8080”,地址字符串最后千万不要加"/",不然找不到正确的manager目录哦。

至此,整个具体的配置工作大功告成。可以看出,这个构建工作实现了如下几项重要的自动化工作:

Ÿ 自动监测构建(持续集成)触发条件

Ÿ 自动从SVN源代码仓库取出最新的源代码

Ÿ 自动对java源代码进行编译、测试、安装打包

Ÿ 自动进行部署(本地、远程均可)工作

(4)关于Jenkins的开机自动启动

有的人可能会想:万一服务器或本机需要重启,要想实现Jenkins的自动构建工作,还得手工启动Tomcat服务,太麻烦了。其实,如果想要开机就自动启动Jenkins是不难的,最简单的方法就是安装Jenkins的native版本,而不是用.war文件。比如,使用windows版本,安装后会自动生成一个windows服务的。这样,机子重启后,Jenkins也会随之启动。



这种情况下,通过浏览器登录Jenkins时,需要通过8090端口:http://127.0.0.1:8090进入Jenkins工作界面。

2、使用阶段

2.1.
下载仓库里的源代码


如果只是一个人做开发的话,自然可以不分别建立CI工作空间和开发工作空间,而是直接用同一个CI工作空间就可以了。但问题是,总会有新成员加入的。这个时候,你总得让这位新同事拥有自己的独立开发空间吧,呵呵。

另外,即便是自己一个人开发,将两者分开,也有利于开发和管理。所以最好单独建立一个开发用的工作空间。

其中,步骤1-9为第一次下载时需要进行的工作,而以后更新源代码则只用到步骤10。

(1)、启动Eclipse,打开file->new->other,选中“从SVN检出项目”。然后点击next,进入下一界面



(2)、因为是在本机进行试验,所以选择“使用现有的资源库位置”,找到file:///C:/DEMO后,点击Next。



如果是其他PC进行下载,则需要选择“创建新的资源库位置”,其后输入SVN仓库所在服务器的IP地址,即“http://X.X.X.X/ DEMO”的格式。再点击Next。





(3)、选择“Trunk”文件夹,点击Next。



(4)这里,检出方式选择“作为新项目检出”,点击finish。



(5)出现New Project界面。这里,笔者选择了project类型(不是Java Project)。之所以如此,主要是为了保证自己的开发目录结构与源代码仓库中的目录结构一致。你当然可以选择Java
Project类型,但是生成后,Eclipse会自动默认各目录都是Package,比较麻烦。



(6)设置好工程名称和目录位置后点击Next。



(7)这个界面下什么都不用选择,直接点击Finish。



(8)生成后的工程项目目录与源代码仓库中的一模一样



(9)这种情况下当然可以直接开发使用了。但为了后续更便利的开发,还需要增加点东西。因为这不是Eclipse默认的Java Project工程类型,所以在添加package后,不会出现如下的package标记



而是直接给出目录。



为了符合开发习惯,我们需要修改.Project文件,并增加一个.classpath文件。
通过Eclipse生成一个java project工程后,将其目录下的.classpath文件复制到我们的工程目录下(C:\develop),并用其.Project文件并替换C:\develop下的.Project文件。
通过Eclipse对这个文件做一些简单的调整,主要是把classpathentry下的 path设为我们工程的源代码所在目录src/main/java,.Project文件中的name替换为mydemo1。





Refresh一下Eclipse,再看一下mydemo1工程,就会自动变为java project风格,而目录结构也没有变化。此时可以就可以进行正常的开发了,而package什么的也可以正常显示了。



当然,如果愿意的话,可以事先把修改好的.classpath文件和.Project文件上传至SVN源代码仓库,然后可以其他人可以直接下载。但建议不要这样做,因为你不知道自动构建时.classpath文件和.Project是不是会被用到,为避免麻烦,还是自己调整吧。
(10)、以上的步骤1-9只有第一次更新时才需要,而以后从SVN仓库更新源代码则真的很简单。在mydemo001工程上单击鼠标右键,选择Team->更新,则可以直接下载SVN中的最新源代码了。



2.2.
提交更新后的源代码


这一步其实和1.4中的步骤6和步骤7的操作方式一模一样,笔者就不再重复了。

2.3.
自动进行构建工作


当提交完源代码后,就可以静待下午6点钟下班时间的到来了。如果你比较心急,想直接看看构建结果,可以点击“立即构建”。



通过控制台输出界面,我们可以观察到每一次构建的全过程和结果。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐