Ant 整合Jenkins自动构建

来源:互联网 发布:php权限管理系统demo 编辑:程序博客网 时间:2024/04/29 03:51
 

Jenkins安装

下载jenkins.war包,运行java -jar jenkins.war,即可访问http://localhost:8080/访问jenkins。

或者将jenkins.war包放在Tomcat的Webapp下,启动Tomcat,访问http://localhost:8080/jenkins/。

本例产用后者。

1. 在首页选择系统管理,再右侧页面中选择管理插件。

在可选插件中选择要安装的插件,下表为本次测试中已安装的插件,有些为默认已安装的插件。

插件

名称
版本 启用 Pinnedmailer1.4truefalseexternal-monitor-job1.1truefalseldap1.1truefalsepam-auth1.0truefalsejavadoc1.0truefalsemaven-plugin1.499truefalseant1.1truefalseanalysis-core1.48truefalsecheckstyle3.32truefalsecvs1.6truefalsedeploy1.9truefalsejquery1.7.2-1truefalsejunit-attachments1.3truefalsessh-slaves0.22truefalsesubversion1.39truefalsetranslation1.8truefalseemail-ext2.25truefalse

2.进入jenkins首页,选择新建JOB,填写一个JOB名称,选择“构建一个自由风格的软件项目”。

然后进入配置页面,也可以首页选择项目,然后选择配置进入此页面。

本例的配置如下:

1) 源码管理选择Subversion

Repository Url:https://localhost/svn/Diary/trunk/Diary

2) 构建触发器

选择Poll SCM

日程表:* * * * * (表示每分钟都比较,有更改就构建)

3) 构建

增加构建步骤:Invoke Ant

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

4) 构建后操作

a. Publish Checkstyle analysis results

Checkstyle results:output/diary/checkstyle/checkstyle_report.xml

b. Publish JUnit test result report

Test report XMLs:output/diary/test/data/*.xml

保留长的标准输出/错误 勾选

c. Publish Javadoc

Javadoc directory:output/diary/docs

d.Deploy war/ear to a container

WAR/EAR files:output/diary/diary-1.0.0.war

Container:Tomcat 6.x

Manager user name:admin

Manager password:*****

Tomcat URL:http://localhost:8080

(此处要配置Tomcat的角色和用户:

在Tomcat的安装目录下,找到conf/tomcat-users.xml,修改内容如下:

<role rolename="tomcat"/>

<role rolename="role1"/>

<role rolename="manager"/>

<role rolename="admin"/>

<user username="admin" password="admin" roles="admin,manager"/>

<user username="tomcat" password="tomcat" roles="tomcat"/>

<user username="both" password="tomcat" roles="tomcat,role1"/>

<user username="role1" password="tomcat" roles="role1"/>

)

e. Editable Email Notification

Project Recipient List:要发送的邮件,可多个用逗号隔开

(此处要配置邮件服务,选择系统管理->系统设置:

Jenkins Location

Jenkins URL:http://localhost:8080/jenkins/

配置邮件通知

也可以Extended E-mail Notification中选择Override Global Settings覆盖的邮件通知。

在测试过程中,邮件通知中没有“发送者的邮箱地址”这一项,导致邮件一直不能发送,选择了Extended E-mail Notification中的Override Global Settings,在这里填写信息才将邮件发送成功。

)

附:

build.xml,增加War包:

001<?xml version="1.0" encoding="UTF-8"?>
002<project name="diary" default="total">
003 
004    <tstamp>
005        <<a href="http://www.07net01.com/program/" target="_blank"><u>for</u></a>mat property="build.latest.dir" pattern="yyyyMMddHHmmss"/>
006        <<a href="http://www.07net01.com/program/" target="_blank"><u>for</u></a>mat property="build.latest.date" pattern="yyyy-MM-dd"/>
007        <format property="build.latest.time" pattern="HH:mm:ss"/>
008    </tstamp>
009 
010    <property name="src.dir" location="src"/>
011     
012    <property name="web.dir" location="WebContent"/>
013     
014    <property name="we<a href="http://www.07net01.com/linux/" target="_blank"><u>bin</u></a>f.dir" location="${web.dir}/WEB-INF"/>
015 
016    <property name="lib.dir" location="${we<a href="http://www.07net01.com/linux/" target="_blank"><u>bin</u></a>f.dir}/lib"/>
017     
018    <property name="build.dir" location="build/classes"/>
019 
020    <!-- Output -->
021    <property name="build.output" location="output"/>
022 
023    <property name="build.output.dir" location="${build.output}/diary"/>
024 
025    <!-- JavaDoc -->
026    <property name="build.output.doc.dir" location="${build.output.dir}/docs"/>
027 
028    <!-- Test -->
029    <property name="test.dir" location="test"/>
030 
031    <property name="build.output.test.dir" location="${build.output.dir}/test"/>
032 
033    <property name="build.output.test.data.dir" location="${build.output.test.dir}/data"/>
034 
035    <!-- CheckStyle -->
036    <property name="build.output.checkstyle.dir" location="${build.output.dir}/checkstyle"/>
037 
038    <property name="checkstyle.xml" location="${build.output.checkstyle.dir}/checkstyle_checks.xml"/>
039     
040    <property name="checkstyle.xsl" location="${build.output.checkstyle.dir}/checkstyle-frames.xsl"/>
041 
042    <!-- Log -->
043    <property name="build.output.log" location="${build.output}/output.log"/>
044 
045    <property name="build.output.log.verbose" location="${build.output}/output_verbose.log"/>
046 
047    <property name="build.output.log.datetime" value="http://xuxujing.iteye.com/blog/[${build.latest.date} ${build.latest.time}]"/>
048 
049    <!-- Jar -->
050    <property file="${src.dir}/base.properties"/>
051 
052    <property name="build.output.requires.dir" location="${build.output.dir}/requires"/>
053 
054    <fileset id="compile.jar" dir="${lib.dir}">
055        <include name="commons-lang-2.4.jar"/>
056    </fileset>
057 
058    <!-- 类路径 -->
059    <path id="compile.classpath">
060        <fileset refid="compile.jar"/>
061    </path>
062 
063    <path id="test.classpath">
064        <path refid="compile.classpath"/>
065        <pathelement location="${lib.dir}/junit-4.10.jar"/>
066        <pathelement location="${build.dir}"/>
067    </path>
068 
069    <path id="checkstyle.classpath">
070        <pathelement location="${lib.dir}/checkstyle-5.6-all.jar"/>
071    </path>
072     
073     
074    <!-- 记录日志,日志保存到文件中 -->
075    <record name="${build.output.log}" append="no"/>
076 
077    <record name="${build.output.log.verbose}" append="no" loglevel="verbose"/>
078 
079    <target name="total" depends="zip,war" description="构建完成">
080        <echo>${build.output.log.datetime}构建完成!</echo>
081    </target>
082     
083    <target name="war" depends="createjar,javadoc" description="生成War">
084        <war destfile="${build.output.dir}/${project.name}-${project.version}.war" webxml="${webinf.dir}/web.xml" duplicate="fail">
085          <fileset file="${web.dir}/*.jsp"/>
086          <lib dir="${lib.dir}">
087            <include name="commons-lang-2.4.jar"/>
088          </lib>
089          <classes dir="${build.dir}">
090            <include name="diary/**/*"/>
091            <include name="${build.dir}/test.property"/>
092          </classes>
093        </war>
094        <echo>${build.output.log.datetime}生成War完成!</echo>
095    </target>
096 
097    <target name="zip" depends="createjar,javadoc" description="生成Zip">
098        <zip destfile="${build.output.dir}/${project.name}-core-${project.version}.zip" duplicate="preserve">
099             <zipfileset dir="${build.output.dir}/docs" prefix="docs"/>
100             <zipfileset dir="${build.output.dir}/requires" prefix="requires"/>
101             <zipfileset file="${build.output.dir}/*.jar"/>
102        </zip>
103        <echo>${build.output.log.datetime}生成Zip完成!</echo>
104    </target>
105 
106    <target name="createjar" depends="test" description="生成Jar">
107        <manifest file="${build.output.dir}/MANIFEST.MF" encoding="utf-8">
108            <attribute name="Built-By" value="http://xuxujing.iteye.com/blog/${user.name}"/>
109            <section name="${project.name}">
110                <attribute name="Implementation-Title" value="http://xuxujing.iteye.com/blog/${project.name}"/>
111                <attribute name="Implementation-Version" value="http://xuxujing.iteye.com/blog/${project.version}"/>
112            </section>
113        </manifest>
114        <jar destfile="${build.output.dir}/${project.name}-core-${project.version}.jar" duplicate="preserve" compress="false" manifestencoding="utf-8" manifest="${build.output.dir}/MANIFEST.MF">
115            <fileset dir="${build.dir}">
116                <exclude name="test/**/*"/>
117                <exclude name="test"/>
118                <exclude name="checkstyle_checks.xml"/>
119                <exclude name="checkstyle-frames.xsl"/>
120                <exclude name="checkstyletask.properties"/>
121                <exclude name="sun_checks.xml"/>
122                <exclude name="checkstyle_checks.xml"/>
123                <exclude name="base.properties"/>
124            </fileset>
125        </jar>
126        <copy todir="${build.output.requires.dir}">
127            <fileset refid="compile.jar"/>
128        </copy>
129        <echo>${build.output.log.datetime}生成Jar完成!</echo>
130    </target>
131 
132    <target name="javadoc" depends="test" description="生成JavaDoc"
133        <javadoc 
134            sourcepath="${src.dir}" 
135            destdir="${build.output.doc.dir}" 
136            packagenames="diary.*" 
137            use="true" 
138            version="true" 
139            windowtitle="${project.name}" 
140            failonerror="true"
141            <classpath refid="compile.classpath"/> 
142        </javadoc>
143        <echo>${build.output.log.datetime}生成JavaDoc完成,详情可查看${build.output.doc.dir}/index.html!</echo>
144    </target>
145 
146    <target name="test" depends="compilesrc,compiletest" description="批量测试,并生成html"
147        <junit printsummary="false" haltonfailure="false" errorProperty="test.failed" failureProperty="test.failed"
148            <classpath refid="test.classpath"/> 
149            <formatter type="brief" usefile="false"/> 
150            <formatter type="xml"/> 
151            <!-- 在testcase定义的情况下,单独测试testcase -->
152            <test name="${testcase}" todir="${build.output.test.data.dir}" if="testcase"/> 
153            <!-- 批量测试 -->
154            <batchtest todir="${build.output.test.data.dir}" unless="testcase"
155                <fileset dir="${build.dir}"
156                    <include name="**/*Test.class"/> 
157                </fileset> 
158            </batchtest> 
159        </junit> 
160        <junitreport todir="${build.output.test.data.dir}"
161            <fileset dir="${build.output.test.data.dir}"
162                <include name="TEST-*.xml"/> 
163            </fileset> 
164            <report format="frames" todir="${build.output.test.dir}"/> 
165        </junitreport> 
166        <fail if="test.failed"
167            ${build.output.log.datetime}批量测试,并生成html失败,详细可查看${build.output.test.dir}/index.html 
168        </fail> 
169        <echo>${build.output.log.datetime}批量测试,并生成html完成,详细可查看${build.output.test.dir}/index.html!</echo
170    </target>
171 
172    <target name="compiletest" depends="copytest,compilesrc" description="<a href="http://www.07net01.com/linux/" target="_blank"><u>编译</u></a>测试<a href="http://www.07net01.com/program/" target="_blank"><u>代码</u></a>文件">
173        <javac srcdir="${test.dir}" destdir="${build.dir}" includeAntRuntime="false" encoding="UTF-8">
174            <include name="**/*.java"/>
175            <classpath refid="test.classpath"/>
176        </javac>
177        <echo>${build.output.log.datetime}<a href="http://www.07net01.com/linux/" target="_blank"><u>编译</u></a>测试<a href="http://www.07net01.com/program/" target="_blank"><u>代码</u></a>文件完成!</echo>
178    </target>
179 
180    <target name="copytest" depends="init" description="复制测试代码资源文件到编译目录">
181        <fileset dir="${test.dir}">
182            <exclude name="**/*.java"/>
183        </fileset>
184        <echo>${build.output.log.datetime}复制测试代码资源文件到编译目录完成!</echo>
185    </target>
186 
187    <target name="compilesrc" depends="checkstyle,copysrc" description="编译源代码文件">
188        <javac srcdir="${src.dir}" destdir="${build.dir}" includeAntRuntime="false" encoding="UTF-8">
189            <include name="**/*.java"/>
190            <classpath refid="compile.classpath"/>
191        </javac>
192        <echo>${build.output.log.datetime}编译源代码文件完成!</echo>
193    </target>
194 
195    <target name="copysrc" depends="init" description="复制源代码资源文件到编译目录">
196        <copy todir="${build.dir}" includeemptydirs="false">
197            <fileset dir="${src.dir}">
198                <exclude name="**/*.java"/>
199            </fileset>
200        </copy>
201        <echo>${build.output.log.datetime}复制源代码资源文件到编译目录完成!</echo>
202    </target>
203 
204    <target name="checkstyle" depends="init" description="用Checkstyle校验源代码">
205        <taskdef name="checkstyle"  classname="com.puppycrawl.tools.checkstyle.CheckStyleTask" classpathref="http://xuxujing.iteye.com/blog/checkstyle.classpath"/>
206        <checkstyle   
207            failOnViolation="false"     
208            failureProperty="checkstyle.failed"    
209            config="${src.dir}/sun_checks.xml">    
210            <fileset dir="${src.dir}" includes="**/*.java"/>     
211            <formatter type="plain"/>     
212            <formatter type="xml" toFile="${build.output.checkstyle.dir}/checkstyle_report.xml"/>     
213        </checkstyle>
214        <xslt style="${checkstyle.xsl}"     
215            in="${build.output.checkstyle.dir}/checkstyle_report.xml"     
216            out="${build.output.checkstyle.dir}/checkstyle_report.html">   
217        </xslt>
218        <echo>${build.output.log.datetime}用Checkstyle校验源代码完成,详细信息查看${build.output.checkstyle.dir}/checkstyle_report.html!</echo>
219    </target>
220 
221    <target name="init" depends="clean,cleanoutput" description="创建输出目录">
222        <mkdir dir="${build.dir}"/>
223        <mkdir dir="${build.output.dir}"/>
224        <mkdir dir="${build.output.doc.dir}"/>
225        <mkdir dir="${build.output.test.dir}"/>
226        <mkdir dir="${build.output.test.data.dir}"/>
227        <mkdir dir="${build.output.checkstyle.dir}"/>
228        <copy todir="${build.output.checkstyle.dir}" overwrite="true">
229            <fileset dir="${src.dir}">
230                <include name="checkstyle-frames.xsl"/>
231                <include name="checkstyle_checks.xml"/>
232            </fileset>
233            <filterset>
234                <filter token="output.dir" value="http://xuxujing.iteye.com/blog/${build.output.checkstyle.dir}"/>
235            </filterset>
236        </copy>
237        <echo>${build.output.log.datetime}输出目录创建完成!</echo>
238    </target>
239 
240    <target name="clean" description="清理编译目录">
241        <delete includeemptydirs="true">
242            <fileset dir="${build.dir}">
243                <include name="**/*"/>
244            </fileset>
245        </delete>
246        <echo>${build.output.log.datetime}编译目录清理完成!</echo>
247    </target>
248 
249    <target name="cleanoutput" description="清理输出目录">     
250        <delete includeemptydirs="true">
251            <fileset dir="${build.output}">
252                <exclude name="output*.log"/>
253            </fileset>
254        </delete>
255        <echo>${build.output.log.datetime}输出目录清理完成!</echo>
256    </target>
257     
258</project>

输出:

构建出错后的输出,会发送邮件到指定邮箱:

01控制台输出
02 
03Started by user anonymous
04Building in workspace C:\Users\xujing\.jenkins\jobs\Diary\workspace
05Updating https://localhost/svn/Diary/trunk/Diary
06At revision 20
07no change for https://localhost/svn/Diary/trunk/Diary since the previous build
08No emails were triggered.
09[workspace] $ cmd.exe /C '"ant.bat && exit %%ERRORLEVEL%%"'
10Buildfile: C:\Users\xujing\.jenkins\jobs\Diary\workspace\build.xml
11 
12clean:
13     [echo] [2013-01-21 15:50:49] 编译目录清理完成!
14 
15cleanoutput:
16     [echo] [2013-01-21 15:50:49] 输出目录清理完成!
17 
18init:
19    [mkdir] Created dir: C:\Users\xujing\.jenkins\jobs\Diary\workspace\output\diary
20    [mkdir] Created dir: C:\Users\xujing\.jenkins\jobs\Diary\workspace\output\diary\docs
21    [mkdir] Created dir: C:\Users\xujing\.jenkins\jobs\Diary\workspace\output\diary\test
22    [mkdir] Created dir: C:\Users\xujing\.jenkins\jobs\Diary\workspace\output\diary\test\data
23    [mkdir] Created dir: C:\Users\xujing\.jenkins\jobs\Diary\workspace\output\diary\checkstyle
24     [copy] Copying 2 files to C:\Users\xujing\.jenkins\jobs\Diary\workspace\output\diary\checkstyle
25     [echo] [2013-01-21 15:50:49] 输出目录创建完成!
26 
27checkstyle:
28[checkstyle] Running Checkstyle 5.6 name="code">控制台输出
29 
30Started by user anonymous
31Building in workspace C:\Users\xujing\.jenkins\jobs\Diary\workspace
32Updating https://localhost/svn/Diary/trunk/Diary
33At revision 21
34no change for https://localhost/svn/Diary/trunk/Diary since the previous build
35No emails were triggered.
36[workspace] $ cmd.exe /C '"ant.bat && exit %%ERRORLEVEL%%"'
37Buildfile: C:\Users\xujing\.jenkins\jobs\Diary\workspace\build.xml
38 
39clean:
40     [echo] [2013-01-21 16:21:25] 编译目录清理完成!
41 
42cleanoutput:
43     [echo] [2013-01-21 16:21:25] 输出目录清理完成!
44 
45init:
46    [mkdir] Created dir: C:\Users\xujing\.jenkins\jobs\Diary\workspace\output\diary
47    [mkdir] Created dir: C:\Users\xujing\.jenkins\jobs\Diary\workspace\output\diary\docs
48    [mkdir] Created dir: C:\Users\xujing\.jenkins\jobs\Diary\workspace\output\diary\test
49    [mkdir] Created dir: C:\Users\xujing\.jenkins\jobs\Diary\workspace\output\diary\test\data
50    [mkdir] Created dir: C:\Users\xujing\.jenkins\jobs\Diary\workspace\output\diary\checkstyle
51     [copy] Copying 2 files to C:\Users\xujing\.jenkins\jobs\Diary\workspace\output\diary\checkstyle
52     [echo] [2013-01-21 16:21:25] 输出目录创建完成!
53 
54checkstyle:
55[checkstyle] Running Checkstyle 5.6>
56     
57       
58        <ul>
59          <li>Diary.zip (3.1 MB)</li>
60           
61          <li>下载次数: 0</li>
62        </ul>
63       
64     
65     
66   
67 
68 
69 
70   
71   
72   
73<center><div style="margin:10px 0 25px 0">
74<script type="text/javascript">
75/*500*200,创建于2013-4-2 07net01 文章内部下*/
76var cpro_id = "u1251111";
77</script>
78<script src="http://cpro.baidustatic.com/cpro/ui/c.js" type="text/javascript"></script><script type="text/javascript" charset="utf-8" src="http://pos.baidu.com/ecom?di=u1251111&dcb=BAIDU_CPRO_SETJSONADSLOT&dtm=BAIDU_CPRO_SETJSONADSLOT&dai=3&jn=3&ltu=http%3A%2F%2Fwww.07net01.com%2Flinux%2FAnt_zhengheJenkinszidonggoujian_57351_1358757090.html&liu=http%3A%2F%2Fwww.07net01.com%2Flinux%2FAnt_zhengheJenkinszidonggoujian_57351_1358757090.html&ltr=&ps=13016x477&psr=1280x1024&par=1280x964&pcs=1263x879&pss=1263x13045&pis=1263x879&cfv=11&ccd=32&col=zh-CN&cec=GBK&tpr=1375323854180&kl=&dis=16"></script><div style="display:none">-</div> <iframeid="cproIframe3" src="http://cpro.baidu.com/cpro/ui/uijs.php?rs=0&tu=u1251111&tn=text_default_500_200&n=bbc12000_cpr&adn=4&rsi1=200&rsi0=500&rad=&rss0=%23FFFFFF&rss1=%23FFFFFF&conOP=0&rss2=%230000ff&rss3=%23444444&rss4=%23008000&rss5=&rss6=%23e10900&rsi5=1&ts=1&at=97&ch=0&cad=1&aurl=&rss7=&cpa=1&fv=11&cn=0&if=16&word=http%3A%2F%2Fwww.07net01.com%2Flinux%2FAnt_zhengheJenkinszidonggoujian_57351_1358757090.html&refer=&ready=1&jk=9aa0b9cc58595182&jn=3&lmt=1369030066&csp=1280,1024&csn=1280,964&ccd=32&chi=19&cja=true&cpl=36&cmi=52&cce=true&csl=zh-CN&did=3&rt=8&dt=1375323855&pn=32:4|baiduTlinkInlay:text_default_960_90|103:103&ev=67108864&c01=0&prt=1375323854180&i3=f&anatp=0&stid=0&lunum=6&scale=&skin=" width="500" height="200" align="center,center" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" allowtransparency="true"></iframe>
79 </div></center>
80<p>编译:<a href="http://www.07net01.com/linux/Ant_zhengheJenkinszidonggoujian_57351_1358757090.html">Ant 整合Jenkins自动构建</a></p> <p>地址:<a style="font-size:12px;font-family:'宋体'" href="http://www.07net01.com/linux/Ant_zhengheJenkinszidonggoujian_57351_1358757090.html">http://www.07net01.com/linux/Ant_zhengheJenkinszidonggoujian_57351_1358757090.html</a></p><p></p>
 
0 0
原创粉丝点击