﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-qileilove-文章分类-持续集成</title><link>http://www.blogjava.net/qileilove/category/54130.html</link><description>不想做屌丝的码农，不是好项目经理！屌丝生涯从此开始！</description><language>zh-cn</language><lastBuildDate>Tue, 01 Apr 2014 14:31:20 GMT</lastBuildDate><pubDate>Tue, 01 Apr 2014 14:31:20 GMT</pubDate><ttl>60</ttl><item><title>Maven - 继承和聚合</title><link>http://www.blogjava.net/qileilove/articles/411802.html</link><dc:creator>顺其自然EVO</dc:creator><author>顺其自然EVO</author><pubDate>Tue, 01 Apr 2014 07:20:00 GMT</pubDate><guid>http://www.blogjava.net/qileilove/articles/411802.html</guid><wfw:comment>http://www.blogjava.net/qileilove/comments/411802.html</wfw:comment><comments>http://www.blogjava.net/qileilove/articles/411802.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qileilove/comments/commentRss/411802.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qileilove/services/trackbacks/411802.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: *聚合(多模块)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在一个项目中 往往有多个模块组成&nbsp; 例如有项目demo&nbsp; 下面有a, b两个模块&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb...&nbsp;&nbsp;<a href='http://www.blogjava.net/qileilove/articles/411802.html'>阅读全文</a><img src ="http://www.blogjava.net/qileilove/aggbug/411802.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qileilove/" target="_blank">顺其自然EVO</a> 2014-04-01 15:20 <a href="http://www.blogjava.net/qileilove/articles/411802.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>NetBeans Maven插件简单使用 </title><link>http://www.blogjava.net/qileilove/articles/411037.html</link><dc:creator>顺其自然EVO</dc:creator><author>顺其自然EVO</author><pubDate>Fri, 14 Mar 2014 06:03:00 GMT</pubDate><guid>http://www.blogjava.net/qileilove/articles/411037.html</guid><wfw:comment>http://www.blogjava.net/qileilove/comments/411037.html</wfw:comment><comments>http://www.blogjava.net/qileilove/articles/411037.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qileilove/comments/commentRss/411037.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qileilove/services/trackbacks/411037.html</trackback:ping><description><![CDATA[<h2>3.7 NetBeans Maven插件简单使用&nbsp;</h2><div style="margin: 0px; color: #333333; font-family: Verdana, sans-serif, 宋体; font-size: 13px; line-height: 22.5px; background-color: #ffffff;"><p style="padding: 0px; margin: 8px 0px; letter-spacing: 0.5px; font-size: 12.5px;"><span style="padding: 0px; margin: 0px;">NetBeans</span>的<span style="padding: 0px; margin: 0px;">Maven</span>插件也十分简单易用，我们可以轻松地在<span style="padding: 0px; margin: 0px;">NetBeans</span>中导入现有的<span style="padding: 0px; margin: 0px;">Maven</span>项目，或者使用<span style="padding: 0px; margin: 0px;">Archetype</span>创建<span style="padding: 0px; margin: 0px;">Maven</span>项目，我们也能够在<span style="padding: 0px; margin: 0px;">NetBeans</span>中直接运行<span style="padding: 0px; margin: 0px;">mvn</span>命令。</p><h2><span style="padding: 0px; margin: 0px;">3.7.1&nbsp;</span>打开<span style="padding: 0px; margin: 0px;">Maven</span>项目</h2><p style="padding: 0px; margin: 8px 0px; letter-spacing: 0.5px; font-size: 12.5px;">与其说<span style="padding: 0px; margin: 0px; font-weight: 600;">打开</span><span style="padding: 0px; margin: 0px;">Maven</span>项目，不如称之为<span style="padding: 0px; margin: 0px; font-weight: 600;">导入</span>更为合适，因为这个项目不需要是<span style="padding: 0px; margin: 0px;">NetBeans</span>创建的<span style="padding: 0px; margin: 0px;">Maven</span>项目，不过这里我们还是遵照<span style="padding: 0px; margin: 0px;">NetBeans</span>菜单中使用的名称。</p><p style="padding: 0px; margin: 8px 0px; letter-spacing: 0.5px; font-size: 12.5px;">选择菜单栏中的<span style="padding: 0px; margin: 0px; font-weight: 600;">文件</span>，然后选择<span style="padding: 0px; margin: 0px; font-weight: 600;">打开项目</span>，直接定位到<span style="padding: 0px; margin: 0px;">Hello World</span>项目的根目录，<span style="padding: 0px; margin: 0px;">NetBeans</span>会十分智能地识别出<span style="padding: 0px; margin: 0px;">Maven</span>项目，如图<span style="padding: 0px; margin: 0px;">3-6</span>所示：</p><p style="padding: 0px; margin: 8px 0px; letter-spacing: 0.5px; font-size: 12.5px;"><br style="padding: 0px; margin: 0px;" /><a href="http://static.oschina.net/uploads/img/201305/10104518_2QHm.jpg" target="_blank" style="padding: 0px; margin: 0px; color: #ff8373; outline: 0px; font-size: 12px;"><img src="http://static.oschina.net/uploads/img/201305/10104518_2QHm.jpg" style="padding: 5px; margin: 10px 0px; border: 1px solid #dddddd; max-width: 640px; background-color: #f4f7f9; cursor: pointer; background-position: initial initial; background-repeat: initial initial;"  alt="" /></a></p><p style="padding: 0px; margin: 8px 0px; letter-spacing: 0.5px; font-size: 12.5px;">图<span style="padding: 0px; margin: 0px;">3-6&nbsp;</span>在<span style="padding: 0px; margin: 0px;">NetBeans</span>中导入<span style="padding: 0px; margin: 0px;">Maven</span>项目</p><p style="padding: 0px; margin: 8px 0px; letter-spacing: 0.5px; font-size: 12.5px;"><span style="padding: 0px; margin: 0px;">Maven</span>项目的图标有别于一般的文件夹，点击<span style="padding: 0px; margin: 0px; font-weight: 600;">打开项目</span>后，<span style="padding: 0px; margin: 0px;">Hello World</span>项目就会被导入到<span style="padding: 0px; margin: 0px;">NetBeans</span>中，在<span style="padding: 0px; margin: 0px; font-weight: 600;">项目</span>视图中可以看到如图<span style="padding: 0px; margin: 0px;">3-7</span>所示的项目结构：</p><p style="padding: 0px; margin: 8px 0px; letter-spacing: 0.5px; font-size: 12.5px;"><br style="padding: 0px; margin: 0px;" /><a href="http://static.oschina.net/uploads/img/201305/10104518_YhjV.jpg" target="_blank" style="padding: 0px; margin: 0px; color: #ff8373; outline: 0px; font-size: 12px;"><img src="http://static.oschina.net/uploads/img/201305/10104518_YhjV.jpg" style="padding: 5px; margin: 10px 0px; border: 1px solid #dddddd; max-width: 640px; background-color: #f4f7f9; cursor: pointer; background-position: initial initial; background-repeat: initial initial;"  alt="" /></a></p><p style="padding: 0px; margin: 8px 0px; letter-spacing: 0.5px; font-size: 12.5px;">&nbsp;图<span style="padding: 0px; margin: 0px;">3-7 NetBeans</span>中导入的<span style="padding: 0px; margin: 0px;">Maven</span>项目结构</p><p style="padding: 0px; margin: 8px 0px; letter-spacing: 0.5px; font-size: 12.5px;"><span style="padding: 0px; margin: 0px;">NetBeans</span>中项目主代码目录的名称为<span style="padding: 0px; margin: 0px; font-weight: 600;">源包</span>，测试代码目录成了<span style="padding: 0px; margin: 0px; font-weight: 600;">测试包</span>，编译范围依赖为<span style="padding: 0px; margin: 0px; font-weight: 600;">库</span>，测试范围依赖为<span style="padding: 0px; margin: 0px; font-weight: 600;">测试库</span>，这里我们也能看到<span style="padding: 0px; margin: 0px;">pom.xml</span>，<span style="padding: 0px; margin: 0px;">NetBeans</span>甚至还帮我们引用了<span style="padding: 0px; margin: 0px;">settings.xml</span>。</p><h2><span style="padding: 0px; margin: 0px;">3.7.2&nbsp;</span>创建<span style="padding: 0px; margin: 0px;">Maven</span>项目</h2><p style="padding: 0px; margin: 8px 0px; letter-spacing: 0.5px; font-size: 12.5px;">在<span style="padding: 0px; margin: 0px;">NetBeans</span>中创建<span style="padding: 0px; margin: 0px;">Maven</span>项目同样十分轻松，在菜单栏中选择<span style="padding: 0px; margin: 0px; font-weight: 600;">文件</span>，然后<span style="padding: 0px; margin: 0px; font-weight: 600;">新建项目</span>，在弹出的对话框中，选择项目类别为<span style="padding: 0px; margin: 0px; font-weight: 600;">Maven</span>，项目为<span style="padding: 0px; margin: 0px; font-weight: 600;">Maven</span><span style="padding: 0px; margin: 0px; font-weight: 600;">项目</span>，点击&#8220;下一步&#8221;之后，对话框会提示我们选择<span style="padding: 0px; margin: 0px;">Maven</span>原型（即<span style="padding: 0px; margin: 0px;">Maven Archtype</span>），我们选择<span style="padding: 0px; margin: 0px; font-weight: 600;">Maven</span><span style="padding: 0px; margin: 0px; font-weight: 600;">快速启动原型（<span style="padding: 0px; margin: 0px;">1.0</span></span><span style="padding: 0px; margin: 0px; font-weight: 600;">）</span>，（即前文提到的<span style="padding: 0px; margin: 0px;">maven-archetype-quickstart</span>），点击&#8220;下一步&#8221;之后，输入项目的基本信息，这些信息在之前讨论<span style="padding: 0px; margin: 0px;">archetype</span>及在<span style="padding: 0px; margin: 0px;">m2eclipse</span>中创建<span style="padding: 0px; margin: 0px;">Maven</span>项目的时候都仔细解释过，不再详述，如图<span style="padding: 0px; margin: 0px;">3-8</span>所示：</p><p style="padding: 0px; margin: 8px 0px; letter-spacing: 0.5px; font-size: 12.5px;"><br style="padding: 0px; margin: 0px;" /><a href="http://static.oschina.net/uploads/img/201305/10104518_XOCR.jpg" target="_blank" style="padding: 0px; margin: 0px; color: #ff8373; outline: 0px; font-size: 12px;"><img title="点击查看原始大小图片" src="http://static.oschina.net/uploads/img/201305/10104518_XOCR.jpg" height="354" width="650" style="padding: 5px; margin: 10px 0px; border: 1px solid #dddddd; max-width: 640px; background-color: #f4f7f9; cursor: pointer; background-position: initial initial; background-repeat: initial initial;"  alt="" /></a></p><p style="padding: 0px; margin: 8px 0px; letter-spacing: 0.5px; font-size: 12.5px;">&nbsp;图<span style="padding: 0px; margin: 0px;">3-8&nbsp;</span>在<span style="padding: 0px; margin: 0px;">NetBeans</span>中使用<span style="padding: 0px; margin: 0px;">Archetype</span>创建<span style="padding: 0px; margin: 0px;">Maven</span>项目</p><p style="padding: 0px; margin: 8px 0px; letter-spacing: 0.5px; font-size: 12.5px;">点击完成之后，一个新的<span style="padding: 0px; margin: 0px;">Maven</span>项目就创建好了。</p><h2><span style="padding: 0px; margin: 0px;">3.7.3&nbsp;</span>运行<span style="padding: 0px; margin: 0px;">mvn</span>命令</h2><p style="padding: 0px; margin: 8px 0px; letter-spacing: 0.5px; font-size: 12.5px;"><span style="padding: 0px; margin: 0px;">NetBeans</span>在默认情况下提供两种<span style="padding: 0px; margin: 0px;">Maven</span>运行方式，点击菜单栏中的<span style="padding: 0px; margin: 0px; font-weight: 600;">运行</span>，我们可以看到<span style="padding: 0px; margin: 0px; font-weight: 600;">生成项目</span>和<span style="padding: 0px; margin: 0px; font-weight: 600;">清理并生成项目</span>两个选项，我们可以尝试&#8220;点击运行<span style="padding: 0px; margin: 0px;">Maven</span>构建&#8221;，根据<span style="padding: 0px; margin: 0px;">NetBeans</span>控制台的输出，我们就能发现它们实际上对应了<span style="padding: 0px; margin: 0px; font-weight: 600;">mvn install</span>和<span style="padding: 0px; margin: 0px; font-weight: 600;">mvn clean install</span>两个命令。</p><p style="padding: 0px; margin: 8px 0px; letter-spacing: 0.5px; font-size: 12.5px;">在实际开发过程中，我们往往不会满足于这两种简单的方式，比如，有时候我们只想执行项目的测试，而不需要打包，这时我们就希望能够执行<span style="padding: 0px; margin: 0px; font-weight: 600;">mvn clean test</span>命令，所幸的是<span style="padding: 0px; margin: 0px;">NetBeans Maven</span>插件完全支持自定义的<span style="padding: 0px; margin: 0px;">mvn</span>命令配置。</p><p style="padding: 0px; margin: 8px 0px; letter-spacing: 0.5px; font-size: 12.5px;">在菜单栏中选择<span style="padding: 0px; margin: 0px; font-weight: 600;">工具</span>，接着选择<span style="padding: 0px; margin: 0px; font-weight: 600;">选项</span>，在对话框中，最上面一栏选择<span style="padding: 0px; margin: 0px; font-weight: 600;">其他</span>，下面选择<span style="padding: 0px; margin: 0px; font-weight: 600;">Maven</span>标签栏，在这里我们可以对<span style="padding: 0px; margin: 0px;">NetBeans Maven</span>插件进行全局的配置（还记得第<span style="padding: 0px; margin: 0px;">2</span>章中我们如何配置<span style="padding: 0px; margin: 0px;">NetBeans</span>使用外部<span style="padding: 0px; margin: 0px;">Maven</span>么？）。现在，选择倒数第三行的<span style="padding: 0px; margin: 0px; font-weight: 600;">编辑全局定制目标定义</span><span style="padding: 0px; margin: 0px; font-weight: 600;">&#8230;</span>，我们添加一个名为<span style="padding: 0px; margin: 0px; font-weight: 600;">Maven Test</span>的操作，执行目标为<span style="padding: 0px; margin: 0px;">clean test</span>，暂时不考虑其他配置选项，如图<span style="padding: 0px; margin: 0px;">3-9</span>所示：</p><p style="padding: 0px; margin: 8px 0px; letter-spacing: 0.5px; font-size: 12.5px;">&nbsp;</p><p style="padding: 0px; margin: 8px 0px; letter-spacing: 0.5px; font-size: 12.5px;"><a href="http://static.oschina.net/uploads/img/201305/10104518_sjU0.jpg" target="_blank" style="padding: 0px; margin: 0px; color: #ff8373; outline: 0px; font-size: 12px;"><img title="点击查看原始大小图片" src="http://static.oschina.net/uploads/img/201305/10104518_sjU0.jpg" height="467" width="650" style="padding: 5px; margin: 10px 0px; border: 1px solid #dddddd; max-width: 640px; background-color: #f4f7f9; cursor: pointer; background-position: initial initial; background-repeat: initial initial;"  alt="" /></a></p><p style="padding: 0px; margin: 8px 0px; letter-spacing: 0.5px; font-size: 12.5px;">图<span style="padding: 0px; margin: 0px;">3-9&nbsp;</span>在<span style="padding: 0px; margin: 0px;">NetBeans</span>中自定义<span style="padding: 0px; margin: 0px;">mvn</span>命令</p><p style="padding: 0px; margin: 8px 0px; letter-spacing: 0.5px; font-size: 12.5px;">点击&#8220;缺省保存该配置&#8221;，在<span style="padding: 0px; margin: 0px;">Maven</span>项目上右击，选择<span style="padding: 0px; margin: 0px; font-weight: 600;">定制</span>，就能看到刚才配置好的<span style="padding: 0px; margin: 0px;">Maven</span>运行操作，选择<span style="padding: 0px; margin: 0px; font-weight: 600;">Maven Test</span>之后，终端将执行<span style="padding: 0px; margin: 0px;">mvn clean test</span>。值得一提的是，我们也可以在项目上右击，选择<span style="padding: 0px; margin: 0px; font-weight: 600;">定制</span>，再选择<span style="padding: 0px; margin: 0px; font-weight: 600;">目标</span><span style="padding: 0px; margin: 0px; font-weight: 600;">&#8230;</span>再输入想要执行的<span style="padding: 0px; margin: 0px;">Maven</span>目标（如<span style="padding: 0px; margin: 0px;">clean package)</span>，点击确定之后<span style="padding: 0px; margin: 0px;">NetBeans</span>就会执行相应的<span style="padding: 0px; margin: 0px;">Maven</span>命令。这种方式十分便捷，但这是临时的，该配置不会被保存，也不会有历史记录。</p></div><h2>3.8 小结&nbsp;</h2><div style="margin: 0px; color: #333333; font-family: Verdana, sans-serif, 宋体; font-size: 13px; line-height: 22.5px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; font-size: medium;">本章以尽可能简单且详细的方式叙述了一个Hello World项目，重点解释了POM的基本内容、Maven项目的基本结构、以及构建项目基本的Maven命令。在此基础上，还介绍了如何使用 Archetype快速创建项目骨架。最后讲述的是如何在Eclipse和NetBeans中导入、创建及构建Maven项目。</span></div><img src ="http://www.blogjava.net/qileilove/aggbug/411037.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qileilove/" target="_blank">顺其自然EVO</a> 2014-03-14 14:03 <a href="http://www.blogjava.net/qileilove/articles/411037.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>m2eclipse简单使用,创建Maven项目 ,运行mvn命令  </title><link>http://www.blogjava.net/qileilove/articles/410980.html</link><dc:creator>顺其自然EVO</dc:creator><author>顺其自然EVO</author><pubDate>Thu, 13 Mar 2014 06:25:00 GMT</pubDate><guid>http://www.blogjava.net/qileilove/articles/410980.html</guid><wfw:comment>http://www.blogjava.net/qileilove/comments/410980.html</wfw:comment><comments>http://www.blogjava.net/qileilove/articles/410980.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qileilove/comments/commentRss/410980.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qileilove/services/trackbacks/410980.html</trackback:ping><description><![CDATA[<u style="line-height: 28px; color: #333333; font-family: 'Hiragino Sans GB W3', 'Hiragino Sans GB', Arial, Helvetica, simsun, u5b8bu4f53; background-color: #ccced0;">. m2eclipse简单使用,创建Maven项目 ,运行mvn命令 (摘)</u><div style="line-height: 28px; color: #333333; font-family: 'Hiragino Sans GB W3', 'Hiragino Sans GB', Arial, Helvetica, simsun, u5b8bu4f53; background-color: #ccced0;"><span style="line-height: 84px; font-size: 48px;">m2eclipse简单使用</span></div><div id="article_content" style="line-height: 28px; color: #333333; font-family: 'Hiragino Sans GB W3', 'Hiragino Sans GB', Arial, Helvetica, simsun, u5b8bu4f53; background-color: #ccced0;"><p align="left" style="margin: 0px 0px 10px; padding: 0px;">前面介绍了如何安装m2eclipse，现在，我们使用m2ecilpse导入Hello World项目。选择菜单项<strong>File</strong>，然后选择<strong>Import</strong>，我们会看到一个Import对话框，在该对话框中选择General目录下的<strong>Maven Projects</strong>，然后点击<strong>Next</strong>，就会出现<strong>Import Projects</strong>对话框，在该对话框中点击<strong>Browse&#8230;</strong>选择Hello World的根目录（即包含pom.xml文件的那个目录），这时对话框中的<strong>Projects:</strong>部分就会显示该目录包含的Maven项目.</p><p align="left" style="margin: 0px 0px 10px; padding: 0px;"><img alt="" src="http://hi.csdn.net/attachment/201111/1/0_1320119976KKeX.gif" style="border: 0px; max-width: 100%;" /><br /></p><p align="left" style="margin: 0px 0px 10px; padding: 0px;">点击Finish之后，m2ecilpse就会将该项目导入到当前的workspace中，导入完成之后，我们就可以在Package Explorer视图中看到项目.</p><p align="left" style="margin: 0px 0px 10px; padding: 0px;"><img alt="" src="http://hi.csdn.net/attachment/201111/1/0_13201200232W25.gif" style="border: 0px; max-width: 100%;" /><br /></p><p align="left" style="margin: 0px 0px 10px; padding: 0px;"></p><p align="left" style="margin: 0px 0px 10px; padding: 0px;">我们看到主代码目录<em>src/main/java</em>和测试代码目录<em>src/test/java</em>成了Eclipse中的资源目录，包和类的结构也十分清晰，当然pom.xml永远在项目的根目录下，而从这个视图中我们甚至还能看到项目的依赖junit-4.7.jar，其实际的位置指向了Maven本地仓库（这里我自定义了Maven本地仓库地址为<em>D:\java\repository</em>，后续章节会介绍如何自定义本地仓库位置）。</p><p align="left" style="margin: 0px 0px 10px; padding: 0px;"><br /></p><p align="left" style="margin: 0px 0px 10px; padding: 0px;"><span style="line-height: 84px; font-size: 48px;">创建Maven项目&nbsp;</span></p><p align="left" style="margin: 0px 0px 10px; padding: 0px;"><span style="line-height: 21px; font-size: 10px;">创建一个Maven项目也十分简单，选择菜单项<strong>File -&gt; New -&gt; Other</strong>，在弹出的对话框中选择Maven下的<strong>Maven Project</strong>，然后点击<strong>Next &gt;</strong>，在弹出的<strong>New Maven Project</strong>对话框中，我们使用默认的选项（不要选择Createa simple project选项，那样我们就能使用Maven Archetype），点击<strong>Next &gt;</strong>，此时m2eclipse会提示我们选择一个Archetype，我们选择<strong>maven-archetype-quickstart</strong>，再点击<strong>Next &gt;</strong>。由于m2eclipse实际上是在使用maven-archetype-plugin插件创建项目，因此这个步骤与上一节我们使用archetype创建项目骨架类似，输入groupId,、artifactId、version、package（暂时我们不考虑Properties），</span><br /></p><p align="left" style="margin: 0px 0px 10px; padding: 0px;"><span style="line-height: 21px; font-size: 10px;"><img alt="" src="http://hi.csdn.net/attachment/201111/1/0_1320123763XIIc.gif" style="border: 0px; max-width: 100%;" /><br /></span></p><p align="left" style="margin: 0px 0px 10px; padding: 0px;"></p><p align="left" style="line-height: 21px; margin: 0px 0px 10px; padding: 0px; font-size: 10px;">注意，为了不和前面已导入的Hello World项目产生冲突和混淆，我们使用不同的artifactId和package。OK，点击Finish，Maven项目就创建完成了，其结构与前一个已导入的Hello World项目基本一致。</p><p align="left" style="margin: 0px 0px 10px; padding: 0px;"><span style="line-height: 84px; font-size: 48px;">3 运行mvn命令</span></p><p align="left" style="line-height: 21px; margin: 0px 0px 10px; padding: 0px; font-size: 10px;">我们需要在命令行输入如mvn clean install之类的命令来执行maven构建，m2eclipse中也有对应的功能，在Maven项目或者pom.xml上右击，再选择Run As，就能看到如下的常见Maven命令，如图所示：</p><p align="left" style="line-height: 21px; margin: 0px 0px 10px; padding: 0px; font-size: 10px;"><img alt="" src="http://hi.csdn.net/attachment/201111/1/0_1320123892HEo1.gif" style="border: 0px; max-width: 100%;" /></p><p align="left" style="line-height: 21px; margin: 0px 0px 10px; padding: 0px; font-size: 10px;">选择想要执行的Maven命令就能执行相应的构建，同时我们也能在Eclipse的console中看到构建输出。这里常见的一个问题是，默认选项中没有我们想要执行的Maven命令怎么办？比如，默认带有mvn test，但我们想执行mvn clean test，很简单，选择<strong>Maven buid&#8230;&nbsp;</strong>以自定义Maven运行命令，在弹出对话框中的<strong>Goals</strong>一项中输入我们想要执行的命令，如clean test，设置一下Name，点击<strong>Run</strong>即可。并且，下一次我们选择<strong>Maven build</strong>，或者使用快捷键Alt + Shift + X, M快速执行Maven构建的时候，上次的配置直接就能在历史记录中找到。图3-5就是自定义Maven运行命令的界面：<br /></p><p align="left" style="line-height: 21px; margin: 0px 0px 10px; padding: 0px; font-size: 10px;"><br /></p><p align="left" style="line-height: 21px; margin: 0px 0px 10px; padding: 0px; font-size: 10px;"><img alt="" src="http://hi.csdn.net/attachment/201111/1/0_1320123967M8q9.gif" style="border: 0px; max-width: 100%;" />在Eclipse中自定义mvn命令</p><p align="left" style="line-height: 21px; margin: 0px 0px 10px; padding: 0px; font-size: 10px;"><br /></p><p align="left" style="line-height: 21px; margin: 0px 0px 10px; padding: 0px; font-size: 10px;"></p><p align="left" style="margin: 0px 0px 10px; padding: 0px;"><strong>&nbsp;小结</strong><a rel="nofollow" href="http://www.javaeye.com/wiki/hzbook/2872-Maven-in-action#top" style="color: #58992a; text-decoration: none;"></a></p><p align="left" style="margin: 0px 0px 10px; padding: 0px;">本章以尽可能简单且详细的方式叙述了一个Hello World项目，重点解释了POM的基本内容、Maven项目的基本结构、以及构建项目基本的Maven命令。在此基础上，还介绍了如何使用Archetype快速创建项目骨架。最后讲述的是如何在Eclipse和NetBeans中导入、创建及构建Maven项目。</p></div><img src ="http://www.blogjava.net/qileilove/aggbug/410980.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qileilove/" target="_blank">顺其自然EVO</a> 2014-03-13 14:25 <a href="http://www.blogjava.net/qileilove/articles/410980.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个用于网站自动化测试的生态系统实现</title><link>http://www.blogjava.net/qileilove/articles/410974.html</link><dc:creator>顺其自然EVO</dc:creator><author>顺其自然EVO</author><pubDate>Thu, 13 Mar 2014 05:01:00 GMT</pubDate><guid>http://www.blogjava.net/qileilove/articles/410974.html</guid><wfw:comment>http://www.blogjava.net/qileilove/comments/410974.html</wfw:comment><comments>http://www.blogjava.net/qileilove/articles/410974.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qileilove/comments/commentRss/410974.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qileilove/services/trackbacks/410974.html</trackback:ping><description><![CDATA[<h2><a id="viewpost1_TitleUrl" href="http://www.blogjava.net/qileilove/archive/2014/03/13/410968.html" style="color: #0066aa; text-decoration: none;">一个用于网站自动化测试的生态系统实现</a></h2><div style="font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; background-color: #ffffff;">　　这是我在从事网站<a target="_self" style="word-break: break-all; color: #202859; line-height: normal !important;"><u style="word-break: break-all;"><strong style="word-break: break-all;">自动化测试</strong></u></a>的<a target="_self" style="word-break: break-all; color: #202859; line-height: normal !important;"><u style="word-break: break-all;"><strong style="word-break: break-all;">工作</strong></u></a>当中构建出的一个&#8220;生态系统&#8221;。&#8220;生态系统&#8221;这个概念是我从公司的前辈身上学到的，他一直以来都认为自动化测试人员不应仅仅局限于编写测试代码，还应该让整个自动化测试的过程（测试代码的持续集成、分发、执行等）都自动化，形成一个&#8220;系统&#8221;，这个系统的自动化程度越高，自动化测试人员就越省力。</div><div style="font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; background-color: #ffffff;">　　<strong style="word-break: break-all; line-height: normal !important;">一、概念</strong></div><div style="font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; background-color: #ffffff;">　　这里我画了一张示意图：</div><div style="font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; background-color: #ffffff;"><a href="http://www.51testing.com/batch.download.php?aid=44896" target="_blank" style="color: #202859; text-decoration: none; word-break: break-all; line-height: normal !important;"><img src="http://www.51testing.com/attachments/2014/03/14982672_201403101350321E3JG.jpg" border="0" alt="" style="word-break: break-all; list-style: none outside none; margin: 0px; padding: 0px; border: none; max-width: 500px;" /></a></div><div style="font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; background-color: #ffffff;">　　之所以称之为&#8220;生态系统&#8221;，是因为建成之后需要的人为干涉很少，其余的时间都是系统内部循环运作。作为自动化测试人员的你只需要提交代码，之后便可以在AutomationDashboard上看到运行的结果了，其余的事情都由系统内部消化。当然，结果的分析还是需要人来完成，机器还没有聪明到可以灵活分析出各种各样让case fail掉的原因。</div><div style="font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; background-color: #ffffff;">　　我们可以把整个系统看作一个黑盒子，那么上面的图可以变成：</div><div style="font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; background-color: #ffffff;"><a href="http://www.51testing.com/batch.download.php?aid=44897" target="_blank" style="color: #202859; text-decoration: none; word-break: break-all; line-height: normal !important;"><img src="http://www.51testing.com/attachments/2014/03/14982672_201403101350322xbVu.jpg" border="0" alt="" style="word-break: break-all; list-style: none outside none; margin: 0px; padding: 0px; border: none; max-width: 500px;" /></a></div><div style="font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; background-color: #ffffff;">　　实际上这里画的人不仅限于自动化测试人员，也可以是：</div><div style="font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; background-color: #ffffff;">　　（1）产品的管理者，比如产品经理需要从自动化回归测试知道这次release有无推迟风险；</div><div style="font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; background-color: #ffffff;">　　（2）团队的管理者，比如开发经理、QA经理需要从自动化的daily/weekly regression知道最近的代码质量如何；</div><div style="font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; background-color: #ffffff;">　　（3）开发人员，他们也许会想通过quick regression（提交的产品代码被部署到测试环境之后运行的测试）知道自己刚提交的代码有没有破坏系统的基本功能；</div><div style="font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; background-color: #ffffff;">　　（4）其他帮忙做自动化测试的开发人员、刚刚开始<a target="_self" style="word-break: break-all; color: #202859; line-height: normal !important;"><u style="word-break: break-all;"><strong style="word-break: break-all;">学习</strong></u></a>编写自动化测试代码的手动测试人员，他们不必关心生态系统的内部实现。</div><div style="font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; background-color: #ffffff;"><div style="word-break: break-all; margin: 10px 0px; line-height: normal !important;">　<strong style="word-break: break-all;">　二、实现</strong></div><div style="word-break: break-all; margin: 10px 0px; line-height: normal !important;">　　说完概念，接下来该说说具体实现了。我这里讲的是我认为最适合我所测试的产品的实现，工具不止一种，方式不止一种。Jenkins可以用TeamCity或其它CI替换，git也可以是svn或tfs，AutomationDahsboard可以用.NET、SpringMVC、ROR等等实现，运行测试的slave可以是Windows/Linux/Mac（土豪！），总之选择一种最适合你所测试的产品的实现。还有一点就是自动化测试代码是用关键字驱动思想实现的，这是另外一个话题了，有时间另外写篇文。</div><div style="word-break: break-all; margin: 10px 0px; line-height: normal !important;">　　<strong style="word-break: break-all;">好，进入正题。依次说说系统的每个重要组成部分吧：</strong></div><div style="word-break: break-all; margin: 10px 0px; line-height: normal !important;">　　1、SCM（Source Code Management）。我选的是git，可以是git服务器（公司自己搭建了一个git&nbsp;<a target="_self" style="word-break: break-all; color: #202859;"><u style="word-break: break-all;"><strong style="word-break: break-all;">server</strong></u></a>），也可以是一个bare repo（http://www.saintsjd.com/2011/01/what-is-a-bare-git-repository/） 。</div><div style="word-break: break-all; margin: 10px 0px; line-height: normal !important;">　　2、CI（continuous integration）。我选的是部署方便、插件丰富的Jenkins。</div><div style="word-break: break-all; margin: 10px 0px; line-height: normal !important;">　　<strong style="word-break: break-all;">它的职责是：</strong></div><div style="word-break: break-all; margin: 10px 0px; line-height: normal !important;">　　（1）从git上取出代码，build（.NET对应msbuild，如果是ruby则不用build了，直接部署即可）；</div><div style="word-break: break-all; margin: 10px 0px; line-height: normal !important;">　　（2）把build好的*.dll部署（这里即是拷贝）到所有的slave上；</div><div style="word-break: break-all; margin: 10px 0px; line-height: normal !important;">　　（3）启动或停止所有slave上的AutomationService（后面还会讲到AutomationService），从而控制测试的执行。<span style="font-size: 11.818181991577148px; line-height: 21.60000228881836px;">我在Jenkins的这些个job配置起来还是比较繁琐的，要细讲又可以另外写一篇文了。这里就特别提到两个很实用的插件吧：</span></div><div style="word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; font-size: 11.818181991577148px;">　　（1）Parameterized Trigger Plugin（https://wiki.jenkins-ci.org/display/JENKINS/Parameterized+Trigger+Plugin）：可以在一个build step中触发其它project的build。</div><div style="word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; font-size: 11.818181991577148px;"><a href="http://www.51testing.com/batch.download.php?aid=44898" target="_blank" style="color: #202859; text-decoration: none; word-break: break-all; line-height: normal !important;"><img src="http://www.51testing.com/attachments/2014/03/14982672_201403101350323MpQL.jpg" border="0" alt="" style="word-break: break-all; list-style: none outside none; margin: 0px; padding: 0px; border: none; max-width: 500px;" /></a></div><div style="word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; font-size: 11.818181991577148px;">　　它最有用的就是这个&#8220;Block until the triggered projects finish their builds&#8221;选项，勾上的话Jenkins就能在所有trigger的project完成build之后（而非仅仅trigger其它project的build，不等它们完成就继续下一个build step）再继续下一个build step，做到真正的依次执行每个build step。</div><div style="word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; font-size: 11.818181991577148px;"><a href="http://www.51testing.com/batch.download.php?aid=44899" target="_blank" style="color: #202859; text-decoration: none; word-break: break-all; line-height: normal !important;"><img src="http://www.51testing.com/attachments/2014/03/14982672_201403101350324cdMj.jpg" border="0" alt="" style="word-break: break-all; list-style: none outside none; margin: 0px; padding: 0px; border: none; max-width: 500px;" /></a></div><div style="word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; font-size: 11.818181991577148px;">　　（2）NodeLabel Parameter Plugin（https://wiki.jenkins-ci.org/display/JENKINS/NodeLabel+Parameter+Plugin）：在所有&#8220;Possible nodes&#8221;标有指定标签（&#8220;Label&#8221;）的Jenkins节点（就是Jenkins master或Jenkins slave）上触发指定project（被触发的project是参数化的）。</div><div style="word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; font-size: 11.818181991577148px;">　　比如我有一个project叫&#8220;StartClassicROLATServiceOnAllNodes&#8221;，它有一个build step是这样设定的：</div><div style="word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; font-size: 11.818181991577148px;"><a href="http://www.51testing.com/batch.download.php?aid=44900" target="_blank" style="color: #202859; text-decoration: none; word-break: break-all; line-height: normal !important;"><img src="http://www.51testing.com/attachments/2014/03/14982672_201403101350325p0dk.jpg" border="0" alt="" style="word-break: break-all; list-style: none outside none; margin: 0px; padding: 0px; border: none; max-width: 500px;" /></a></div><div style="word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; font-size: 11.818181991577148px;">　　再来看看&#8220;StartClassicROLATServiceOnASingleNode&#8221;这个project的设定：</div><div style="word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; font-size: 11.818181991577148px;"><a href="http://www.51testing.com/batch.download.php?aid=44901" target="_blank" style="color: #202859; text-decoration: none; word-break: break-all; line-height: normal !important;"><img src="http://www.51testing.com/attachments/2014/03/14982672_2014031013503261mEf.jpg" border="0" alt="" style="word-break: break-all; list-style: none outside none; margin: 0px; padding: 0px; border: none; max-width: 500px;" /></a></div><div style="word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; font-size: 11.818181991577148px;">　　这个project有一个Node类型的参数，参数名&#8220;NodeX&#8221;与之前Label Factory中的&#8220;NodeX&#8221;对应，&#8220;Possible nodes&#8221;选的是&#8220;ALL&#8221;，那么列出的所有node（master、10.107.122.152、10.107.122.153、10.107.122.154）都在判断范围之内（判断其是否有&#8220;Node&#8221;标签，有则执行project）。</div><div style="word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; font-size: 11.818181991577148px;">　　另外，列出的所有node我都为其加了一个&#8220;Node&#8221;标签。</div><div style="word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; font-size: 11.818181991577148px;"><a href="http://www.51testing.com/batch.download.php?aid=44902" target="_blank" style="color: #202859; text-decoration: none; word-break: break-all; line-height: normal !important;"><img src="http://www.51testing.com/attachments/2014/03/14982672_201403101350327qC46.jpg" border="0" alt="" style="word-break: break-all; list-style: none outside none; margin: 0px; padding: 0px; border: none; max-width: 500px;" /></a></div><div style="word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; font-size: 11.818181991577148px;">　　这样，当我trigger &#8220;StartClassicROLATServiceOnAllNodes&#8221;之后，就会在master、10.107.122.152、10.107.122.153、10.107.122.154这4个node上同时执行&#8220;StartClassicROLATServiceOnASingleNode&#8221;。<br /><div style="word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; font-size: 11.818181991577148px;"><strong style="word-break: break-all; line-height: normal !important;">　3、AutomationDashboard，这里姑且译作&#8220;自动化测试控制面板&#8221;吧。</strong>实际上它应该和Jenkins一起并称控制面板，不过因为Jenkins有API可以调用，所以想做的画两者也是可以统一成一个web界面的。这个dashboard完全是用.NET+IIS+SQLServer一点点从数据库设计构建、数据访问层、业务层、表现层做起来的，要细讲&#8230;&#8230;额&#8230;&#8230;又会是另外一篇文了（Oh man, not again!）。反正我觉得，虽然我是做自动化测试工作的，但不应该把自己局限于测试。为了更好地进行自动化测试，开发网站、安装配置虚拟机以及其它要用到的工具，都应该抽时间去学习、掌握。</div><div style="word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; font-size: 11.818181991577148px;">　　好，来说说这个dashboard。这里只讲两个主要组成部分，一个网站（以下简称dashboard）、一个Windows Service（以下简称ATService）和一个console application（以下称ConsoleRunner）：</div><div style="word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; font-size: 11.818181991577148px;">　　<strong style="word-break: break-all; line-height: normal !important;">（1）dashboard，它的主要功能：</strong></div><div style="word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; font-size: 11.818181991577148px;">　　a、展示测试的运行状况：有多少正在运行/执行完毕，分别在哪台slave上执行等等。</div><div style="word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; font-size: 11.818181991577148px;">　　b、通过call Jenkins的API来trigger Jenkins的job，间接控制测试的执行。</div><div style="word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; font-size: 11.818181991577148px;">　　c、展示测试的结果：发生错误的是哪个case、出错时间、错误信息、代码回溯（stack trace）、甚至可以包含一张出错时的截图。</div><div style="word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; font-size: 11.818181991577148px;">　　主要界面如下：</div><div style="word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; font-size: 11.818181991577148px;">　　a、Summary，顾名思义是汇总信息，case有多少pass多少fail、case按分类每一类有多少等等。（其实这里我少做了一张很重要的图，就是coverage饼状图）</div><div style="word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; font-size: 11.818181991577148px;"><a href="http://www.51testing.com/batch.download.php?aid=44903" target="_blank" style="color: #202859; text-decoration: none; word-break: break-all; line-height: normal !important;"><img src="http://www.51testing.com/attachments/2014/03/14982672_20140310135032827KJ.jpg" border="0" alt="" style="word-break: break-all; list-style: none outside none; margin: 0px; padding: 0px; border: none; max-width: 500px;" /></a></div><div style="word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; font-size: 11.818181991577148px;">　　b、Queue，测试队列，包含当前正在运行的、运行完的、等待运行的test fixture或test case（依据测试工具的不同，NUnit、JUnit、RSpec等，fixture的叫法可能不同，总之就是包含多个test case的集合）。可以启动、停止、终止（终止之后可以清空）测试执行或清空当前队列。</div><div style="word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; font-size: 11.818181991577148px;"><a href="http://www.51testing.com/batch.download.php?aid=44904" target="_blank" style="color: #202859; text-decoration: none; word-break: break-all; line-height: normal !important;"><img src="http://www.51testing.com/attachments/2014/03/14982672_201403101350329deYC.jpg" border="0" alt="" style="word-break: break-all; list-style: none outside none; margin: 0px; padding: 0px; border: none; max-width: 500px;" /></a></div><div style="word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; font-size: 11.818181991577148px;">　　c、TestCase，生态系统中的所有测试用例会展示在这里，可以看到它们最后一次执行的时间和状态（pass/fail），点击某条case可以跳转到该条case的所有test result。可以按状态（pass/fail/other）筛选用例，可以勾选部分用例重新执行、或重新执行所有fail的case。&#8220;Reload Test Cases&#8221;主要是考虑到*.dll文件中的test case可能会在某次部署之后发生变化，需要重新加载。不过后来我修改了Jenkins里的job在每次部署之后都自动重新加载，所以这个按钮其实没什么用了。</div><div style="word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; font-size: 11.818181991577148px;"><a href="http://www.51testing.com/batch.download.php?aid=44905" target="_blank" style="color: #202859; text-decoration: none; word-break: break-all; line-height: normal !important;"><img src="http://www.51testing.com/attachments/2014/03/14982672_201403101350321010y4.jpg" border="0" alt="" style="word-break: break-all; list-style: none outside none; margin: 0px; padding: 0px; border: none; max-width: 500px;" /></a></div><div style="word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; font-size: 11.818181991577148px;">　　d、TestSuite，包含多个fixture的集合是一个suite。勾选多个suite点击&#8220;Run Suite&#8221;即可把这些suite中包含的fixture添加到Queue。</div><div style="word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; font-size: 11.818181991577148px;"><a href="http://www.51testing.com/batch.download.php?aid=44906" target="_blank" style="color: #202859; text-decoration: none; word-break: break-all; line-height: normal !important;"><img src="http://www.51testing.com/attachments/2014/03/14982672_20140310135032111vpi.jpg" border="0" alt="" style="word-break: break-all; list-style: none outside none; margin: 0px; padding: 0px; border: none; max-width: 500px;" /></a></div><div style="word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; font-size: 11.818181991577148px;">　　这里的suite是对NUnit中的Category的一个补充，点击&#8220;New Suite&#8221;你可以任意选择fixture来组成自己想要的suite：</div><div style="word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; font-size: 11.818181991577148px;"><a href="http://www.51testing.com/batch.download.php?aid=44907" target="_blank" style="color: #202859; text-decoration: none; word-break: break-all; line-height: normal !important;"><img src="http://www.51testing.com/attachments/2014/03/14982672_2014031013503212Z8mE.jpg" border="0" alt="" style="word-break: break-all; list-style: none outside none; margin: 0px; padding: 0px; border: none; max-width: 500px;" /></a></div><div style="word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; font-size: 11.818181991577148px;">　　e、TestResult，展示所有test case的运行结果，可以按test case id进行筛选，点击TC#这一列的id就只显示这条case的结果。</div><div style="word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; font-size: 11.818181991577148px;"><a href="http://www.51testing.com/batch.download.php?aid=44908" target="_blank" style="color: #202859; text-decoration: none; word-break: break-all; line-height: normal !important;"><img src="http://www.51testing.com/attachments/2014/03/14982672_20140310135032132kv4.jpg" border="0" alt="" style="word-break: break-all; list-style: none outside none; margin: 0px; padding: 0px; border: none; max-width: 500px;" /></a></div><div style="word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; font-size: 11.818181991577148px;">　　点右边的蓝色&#8220;i&#8221;图标可以跳到这条结果的详细页面，截图功能暂未启用，根据RunnerMessage和RunnerStackTrace可以知道报错的代码位置，进而尝试重现问题。</div><div style="word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; font-size: 11.818181991577148px;"><span style="line-height: normal !important;"><a href="http://www.51testing.com/batch.download.php?aid=44909" target="_blank" style="color: #202859; text-decoration: none; word-break: break-all;"><img src="http://www.51testing.com/attachments/2014/03/14982672_2014031013503214aCLS.jpg" border="0" alt="" style="word-break: break-all; list-style: none outside none; margin: 0px; padding: 0px; border: none; max-width: 500px;" /></a></span><div style="word-break: break-all; margin: 10px 0px; font-size: 11.818181991577148px; line-height: normal !important;"><a href="http://www.51testing.com/batch.download.php?aid=44909" target="_blank" style="color: #202859; text-decoration: none; word-break: break-all;">　（2）ATService。这个Windows Service（slave都是Windows，稍后会讲）被安装到了每个slave上，用以向dashboard询问&#8220;现在有没有分配给我的test fixture/case？&#8221;，如果有且当前slave空闲的话就抓过来运行，运行完毕汇报结果。</a></div><div style="word-break: break-all; margin: 10px 0px; font-size: 11.818181991577148px; line-height: normal !important;"><a href="http://www.51testing.com/batch.download.php?aid=44909" target="_blank" style="color: #202859; text-decoration: none; word-break: break-all;">　　还记得Queue（队列）吧？无论你在TestCase还是TestSuite页面挑选了test case/suite想要运行，都只是把它们添加到队列当中（准确地说就是往Queue这张数据库表中INSERT记录），而不会给它们分配slave。只有当Jenkins启动了slave上的ATService之后，ATService才会去Queue表中自己抓取（就是打上标记说这条fixture/case已经有主了，其它slave就不会再去抓）还没有运行过且没有分配有slave的test fixture/case。</a></div><div style="word-break: break-all; margin: 10px 0px; font-size: 11.818181991577148px; line-height: normal !important;"><a href="http://www.51testing.com/batch.download.php?aid=44909" target="_blank" style="color: #202859; text-decoration: none; word-break: break-all;">　　（3）ConsoleRunner，最开始的那个图中没有画出来。这个console程序主要供Jenkins调用。Jenkins不是可以让job定时运行么？正好，定时调用这个console application，传几个参数，就可以在指定时间往Queue里填充fixture/case，然后再启动ATService开始执行测试。这样就能实现quick/daily/weekly/full regression的无人值守运行了。</a></div><div style="word-break: break-all; margin: 10px 0px; font-size: 11.818181991577148px; line-height: normal !important;"><a href="http://www.51testing.com/batch.download.php?aid=44909" target="_blank" style="color: #202859; text-decoration: none; word-break: break-all;">　<strong style="word-break: break-all;">　4、Slave</strong></a></div><div style="word-break: break-all; margin: 10px 0px; font-size: 11.818181991577148px; line-height: normal !important;"><a href="http://www.51testing.com/batch.download.php?aid=44909" target="_blank" style="color: #202859; text-decoration: none; word-break: break-all;">　　我选择在Windows上运行测试：</a></div><div style="word-break: break-all; margin: 10px 0px; font-size: 11.818181991577148px; line-height: normal !important;"><a href="http://www.51testing.com/batch.download.php?aid=44909" target="_blank" style="color: #202859; text-decoration: none; word-break: break-all;">　　（1）公司IT一般只提供Windows操作系统的虚拟机</a></div><div style="word-break: break-all; margin: 10px 0px; font-size: 11.818181991577148px; line-height: normal !important;"><a href="http://www.51testing.com/batch.download.php?aid=44909" target="_blank" style="color: #202859; text-decoration: none; word-break: break-all;">　　（2）产品在Windows上的用户占绝大多数（其实这个有点废话，桌面操作系统Windows依然是世界王者。诚然，我自己业余时用Linux做开发，Mac在国内外也是相当流行的，但GoogleAnalytics显示的统计结果就是大部分访问都来自Windows。什么，你说iOS/Android？额&#8230;&#8230;移动端现在仍然是产品的短板&#8230;&#8230;）</a></div><div style="word-break: break-all; margin: 10px 0px; font-size: 11.818181991577148px; line-height: normal !important;"><a href="http://www.51testing.com/batch.download.php?aid=44909" target="_blank" style="color: #202859; text-decoration: none; word-break: break-all;">　　如果选择Linux的话要注意下selenium webdriver的native event设定（http://code.google.com/p/selenium/wiki/AdvancedUserInteractions#Native_events_versus_synthetic_events）。</a></div><div style="word-break: break-all; margin: 10px 0px; font-size: 11.818181991577148px; line-height: normal !important;"><a href="http://www.51testing.com/batch.download.php?aid=44909" target="_blank" style="color: #202859; text-decoration: none; word-break: break-all;">　　关于浏览器，Firefox、Chrome、IE皆可，webdriver的浏览器兼容性已经很不错了。浏览器兼容性是个有点头疼的问题，想支持很多浏览器的话有时会增加很多开发、测试成本，我一般在Firefox上跑就足够了。什么？数字？马桶？企鹅？您想多了，selenium官方不支持。</a></div><div style="word-break: break-all; margin: 10px 0px; font-size: 11.818181991577148px; line-height: normal !important;"><a href="http://www.51testing.com/batch.download.php?aid=44909" target="_blank" style="color: #202859; text-decoration: none; word-break: break-all;">　　你能找到多少台slave来执行测试？多多益善哦！找不到那么多实体机就自己配虚拟机吧，分布式运行可以给你的自动化测试生态系统装上火箭！在更短的时间内运行完更多测试，从而更快地从测试中获得反馈！</a></div><div style="word-break: break-all; margin: 10px 0px; font-size: 11.818181991577148px; line-height: normal !important;"><a href="http://www.51testing.com/batch.download.php?aid=44909" target="_blank" style="color: #202859; text-decoration: none; word-break: break-all;">　　嗯，差不多就这么多了。还有很多细节就留在之后的文中再说了。自我感觉这个生态系统还是有很多可以完善、增加的功能，而且这个实现方式、运作机制可能也并非适用于你所测试的产品，不过现在对于我测的产品来说是够用的了。</a></div><div style="word-break: break-all; margin: 10px 0px; font-size: 11.818181991577148px; line-height: normal !important;"><a href="http://www.51testing.com/batch.download.php?aid=44909" target="_blank" style="color: #202859; text-decoration: none; word-break: break-all;">　　不管怎样实现，我想表达的核心观点是：</a></div><div style="word-break: break-all; margin: 10px 0px; font-size: 11.818181991577148px; line-height: normal !important;"><a href="http://www.51testing.com/batch.download.php?aid=44909" target="_blank" style="color: #202859; text-decoration: none; word-break: break-all;">　　做自动化测试不要局限于自动化测试代码的编写，我们要自动化的不仅仅是manual test case，还应包括整个automation test的process！测试代码持续集成、部署（分发）、执行、结果展示，自动化的环节越多、越彻底，为你节约的时间就越多，你可以用这些节约的时间做更有意义的事情。人类发明计算机，用代码编写程序，其实就是一种自动化的过程。以前要靠手工劳动完成的现在都交给电脑做了&#8212;&#8212;服务器不正是勤勤恳恳地重复执行着我们写好的程序么？构建自动化测试生态系统是同样的道理，因为机器能比人更可靠地完成重复劳动。</a></div><div style="word-break: break-all; margin: 10px 0px; font-size: 11.818181991577148px; line-height: normal !important;"><a href="http://www.51testing.com/batch.download.php?aid=44909" target="_blank" style="color: #202859; text-decoration: none; word-break: break-all;">　　如果你还在手动拷贝*.dll，还需要打开NUnit手动执行测试，还在1台机器上运行测试，那么，现在就是该提高生产力的时候了！</a></div><div></div></div></div></div><img src ="http://www.blogjava.net/qileilove/aggbug/410974.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qileilove/" target="_blank">顺其自然EVO</a> 2014-03-13 13:01 <a href="http://www.blogjava.net/qileilove/articles/410974.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用Archetype生成项目骨架</title><link>http://www.blogjava.net/qileilove/articles/410930.html</link><dc:creator>顺其自然EVO</dc:creator><author>顺其自然EVO</author><pubDate>Wed, 12 Mar 2014 03:35:00 GMT</pubDate><guid>http://www.blogjava.net/qileilove/articles/410930.html</guid><wfw:comment>http://www.blogjava.net/qileilove/comments/410930.html</wfw:comment><comments>http://www.blogjava.net/qileilove/articles/410930.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qileilove/comments/commentRss/410930.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qileilove/services/trackbacks/410930.html</trackback:ping><description><![CDATA[<p style="margin: 10px 0px; padding: 0px; color: #333333; background-color: #f8f8f8; text-indent: 28px; font-family: 宋体; font-size: 14px; line-height: 28px;"><strong>3.5 使用Archetype生成项目骨架</strong></p><p style="margin: 10px 0px; padding: 0px; color: #333333; background-color: #f8f8f8; text-indent: 28px; font-family: 宋体; font-size: 14px; line-height: 28px;">Hello World项目中有一些Maven的约定：在项目的根目录中放置pom.xml，在src/main/java目录中放置项目的主代码，在src/test/java中放置项目的测试代码。之所以一步一步地展示这些步骤，是为了能让可能是Maven初学者的你得到最实际的感受。我们称这些基本的目录结构和pom.xml文件内容称为项目的骨架，当第一次创建项目骨架的时候，你还会饶有兴趣地去体会这些默认约定背后的思想，第二次，第三次，你也许还会满意自己的熟练程度，但第四、第五次做同样的事情，你可能就会恼火了。为此Maven提供了Archetype以帮助我们快速勾勒出项目骨架。</p><p style="margin: 10px 0px; padding: 0px; color: #333333; background-color: #f8f8f8; text-indent: 28px; font-family: 宋体; font-size: 14px; line-height: 28px;">还是以Hello World为例，我们使用maven archetype来创建该项目的骨架，离开当前的Maven项目目录。</p><p style="margin: 10px 0px; padding: 0px; color: #333333; background-color: #f8f8f8; text-indent: 28px; font-family: 宋体; font-size: 14px; line-height: 28px;">如果是Maven 3，简单地运行：</p><pre style="margin-top: 0px; padding: 0px; color: #333333; font-family: 'Courier New', monospace; font-size: 12px; width: 591.015625px; overflow: auto; background-color: #e6e6e6; line-height: 28px;"><ol style="margin-left: 55px; padding: 5px 0px; color: #5c5c5c; list-style-position: initial; list-style-image: initial; word-wrap: break-word; word-break: normal; border: none; background-color: #f7f7f7; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 1px !important;"><li style="margin: 0px !important; padding: 0px 3px 0px 10px !important; color: inherit; list-style: decimal outside none; word-wrap: break-word; word-break: normal; border: none; background-image: url(http://images.51cto.com/images/art1105/images/0.gif); background-attachment: scroll; background-color: transparent; line-height: 18px; background-position: -498px -70px; background-repeat: no-repeat repeat;"><span style="margin: 0px; padding: 0px; border: none; color: black; background-color: inherit;">mvn&nbsp;archetype:generate&nbsp;</span></li></ol></pre><p style="margin: 10px 0px; padding: 0px; color: #333333; background-color: #f8f8f8; text-indent: 28px; font-family: 宋体; font-size: 14px; line-height: 28px;">如果是Maven 2，最好运行如下命令：</p><pre style="margin-top: 0px; padding: 0px; color: #333333; font-family: 'Courier New', monospace; font-size: 12px; width: 591.015625px; overflow: auto; background-color: #e6e6e6; line-height: 28px;"><ol style="margin-left: 55px; padding: 5px 0px; color: #5c5c5c; list-style-position: initial; list-style-image: initial; word-wrap: break-word; word-break: normal; border: none; background-color: #f7f7f7; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 1px !important;"><li style="margin: 0px !important; padding: 0px 3px 0px 10px !important; color: inherit; list-style: decimal outside none; word-wrap: break-word; word-break: normal; border: none; background-image: url(http://images.51cto.com/images/art1105/images/0.gif); background-attachment: scroll; background-color: transparent; line-height: 18px; background-position: -498px -70px; background-repeat: no-repeat repeat;"><span style="margin: 0px; padding: 0px; border: none; color: black; background-color: inherit;">mvn&nbsp;org.apache.maven.plugins:mavenarchetype<br style="clear: both; width: 0px; height: 0px;" />plugin:2.0alpha5:generate &nbsp;</span></li></ol></pre><p style="margin: 10px 0px; padding: 0px; color: #333333; background-color: #f8f8f8; text-indent: 28px; font-family: 宋体; font-size: 14px; line-height: 28px;">很多资料会让你直接使用更为简单的 mvn archetype:generate 命令，但在Maven 2中这是不安全的，因为该命令没有指定Archetype插件的版本，于是Maven会自动去下载最新的版本，进而可能得到不稳定的SNAPSHOT版本，导致运行失败。然而在Maven 3中，即使用户没有指定版本，Maven也只会解析最新的稳定版本，因此这是安全的。具体内容见7.7节。</p><p style="margin: 10px 0px; padding: 0px; color: #333333; background-color: #f8f8f8; text-indent: 28px; font-family: 宋体; font-size: 14px; line-height: 28px;">我们实际上是在运行插件mavenarchetypeplugin，注意冒号的分隔，其格式为 groupId:artifactId:version:goal，org.apache.maven.plugins 是maven官方插件的groupId，mavenarchetypeplugin 是Archetype插件的artifactId，2.0alpha5 是目前该插件最新的稳定版，generate是要使用的插件目标。</p><p style="margin: 10px 0px; padding: 0px; color: #333333; background-color: #f8f8f8; text-indent: 28px; font-family: 宋体; font-size: 14px; line-height: 28px;">紧接着会看到一段长长的输出，有很多可用的Archetype供选择，包括著名的Appfuse项目的Archetype、JPA项目的Archetype等。每一个Archetype前面都会对应有一个编号，同时命令行会提示一个默认的编号，其对应的Archetype为mavenarchetypequickstart，直接回车以选择该Archetype，紧接着Maven会提示输入要创建项目的groupId、artifactId、version以及包名package。如下输入并确认：</p><p style="margin: 10px 0px; padding: 0px; color: #333333; background-color: #f8f8f8; text-indent: 28px; font-family: 宋体; font-size: 14px; line-height: 28px;"></p><span style="color: #333333; font-family: 宋体; font-size: 14px; line-height: 28px; background-color: #f8f8f8;"><span style="width: 635px; line-height: 18px; margin-bottom: 10px; padding-top: 7px; padding-bottom: 4px;"><span style="width: 635px; margin-bottom: 10px; padding-top: 7px; padding-bottom: 4px;"><span style="width: 635px; margin-bottom: 10px; padding-top: 7px; padding-bottom: 4px;"><span style="width: 635px; margin-bottom: 10px; padding-top: 7px; padding-bottom: 4px;"><span style="width: 635px; margin-bottom: 10px; padding-top: 7px; padding-bottom: 4px;"><span style="width: 635px; margin-bottom: 10px; padding-top: 7px; padding-bottom: 4px;"><pre style="margin-top: 0px; padding: 0px; font-family: 'Courier New', monospace; font-size: 12px; width: 591.015625px; overflow: auto; background-color: #e6e6e6;"><ol style="margin-left: 55px; padding: 5px 0px; color: #5c5c5c; list-style-position: initial; list-style-image: initial; word-wrap: break-word; word-break: normal; border: none; background-color: #f7f7f7; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 1px !important;"><li style="padding: 0px 10px; color: inherit; list-style: decimal inside none; word-wrap: break-word; word-break: normal; border: none; background-image: url(http://images.51cto.com/images/art1105/images/0.gif); background-attachment: scroll; background-color: #f8f8f8; height: 20px; float: left; margin: 0px !important; background-position: -498px -70px; background-repeat: no-repeat repeat;"><span style="margin: 0px; padding: 0px; border: none; color: black; background-color: inherit;"><span style="margin: 0px; padding: 0px; border: none; background-color: inherit;">Define&nbsp;value&nbsp;for&nbsp;groupId:&nbsp;:&nbsp;com.juvenxu.mvnbook &nbsp;</span></span></li><li style="padding: 0px 10px; list-style: decimal inside none; word-wrap: break-word; word-break: normal; border: none; background-image: url(http://images.51cto.com/images/art1105/images/0.gif); background-attachment: scroll; background-color: #f8f8f8; height: 20px; float: left; margin: 0px !important; background-position: -498px -70px; background-repeat: no-repeat repeat;"><span style="margin: 0px; padding: 0px; border: none; color: black; background-color: inherit;">Define&nbsp;value&nbsp;for&nbsp;artifactId:&nbsp;:&nbsp;helloworld &nbsp;</span></li><li style="padding: 0px 10px; color: inherit; list-style: decimal inside none; word-wrap: break-word; word-break: normal; border: none; background-image: url(http://images.51cto.com/images/art1105/images/0.gif); background-attachment: scroll; background-color: #f8f8f8; height: 20px; float: left; margin: 0px !important; background-position: -498px -70px; background-repeat: no-repeat repeat;"><span style="margin: 0px; padding: 0px; border: none; color: black; background-color: inherit;">Define&nbsp;value&nbsp;for&nbsp;version:&nbsp;&nbsp;1.0SNAPSHOT:&nbsp;: &nbsp;</span></li><li style="padding: 0px 10px; list-style: decimal inside none; word-wrap: break-word; word-break: normal; border: none; background-image: url(http://images.51cto.com/images/art1105/images/0.gif); background-attachment: scroll; background-color: #f8f8f8; height: 20px; float: left; margin: 0px !important; background-position: -498px -70px; background-repeat: no-repeat repeat;"><span style="margin: 0px; padding: 0px; border: none; color: black; background-color: inherit;">Define&nbsp;value&nbsp;for&nbsp;package:&nbsp;&nbsp;com.juvenxu.mvnbook:&nbsp;:&nbsp;<br style="clear: both; width: 0px; height: 0px;" />com.juvenxu.mvnbook.helloworld &nbsp;</span></li><li style="padding: 0px 10px; color: inherit; list-style: decimal inside none; word-wrap: break-word; word-break: normal; border: none; background-image: url(http://images.51cto.com/images/art1105/images/0.gif); background-attachment: scroll; background-color: #f8f8f8; height: 20px; float: left; margin: 0px !important; background-position: -498px -70px; background-repeat: no-repeat repeat;"><span style="margin: 0px; padding: 0px; border: none; color: black; background-color: inherit;">Confirm&nbsp;properties&nbsp;configuration: &nbsp;</span></li><li style="padding: 0px 10px; list-style: decimal inside none; word-wrap: break-word; word-break: normal; border: none; background-image: url(http://images.51cto.com/images/art1105/images/0.gif); background-attachment: scroll; background-color: #f8f8f8; height: 20px; float: left; margin: 0px !important; background-position: -498px -70px; background-repeat: no-repeat repeat;"><span style="margin: 0px; padding: 0px; border: none; color: black; background-color: inherit;">groupId:&nbsp;com.juvenxu.mvnbook &nbsp;</span></li><li style="padding: 0px 10px; color: inherit; list-style: decimal inside none; word-wrap: break-word; word-break: normal; border: none; background-image: url(http://images.51cto.com/images/art1105/images/0.gif); background-attachment: scroll; background-color: #f8f8f8; height: 20px; float: left; margin: 0px !important; background-position: -498px -70px; background-repeat: no-repeat repeat;"><span style="margin: 0px; padding: 0px; border: none; color: black; background-color: inherit;">artifactId:&nbsp;helloworld &nbsp;</span></li><li style="padding: 0px 10px; list-style: decimal inside none; word-wrap: break-word; word-break: normal; border: none; background-image: url(http://images.51cto.com/images/art1105/images/0.gif); background-attachment: scroll; background-color: #f8f8f8; height: 20px; float: left; margin: 0px !important; background-position: -498px -70px; background-repeat: no-repeat repeat;"><span style="margin: 0px; padding: 0px; border: none; color: black; background-color: inherit;">version:&nbsp;1.0SNAPSHOT &nbsp;</span></li><li style="padding: 0px 10px; color: inherit; list-style: decimal inside none; word-wrap: break-word; word-break: normal; border: none; background-image: url(http://images.51cto.com/images/art1105/images/0.gif); background-attachment: scroll; background-color: #f8f8f8; height: 20px; float: left; margin: 0px !important; background-position: -498px -70px; background-repeat: no-repeat repeat;"><span style="margin: 0px; padding: 0px; border: none; color: black; background-color: inherit;">package:&nbsp;com.juvenxu.mvnbook.helloworld&nbsp;</span></li><li style="padding: 0px 10px; color: inherit; list-style: decimal inside none; word-wrap: break-word; word-break: normal; border: none; background-image: url(http://images.51cto.com/images/art1105/images/0.gif); background-attachment: scroll; background-color: #f8f8f8; height: 20px; float: left; margin: 0px !important; background-position: -498px -70px; background-repeat: no-repeat repeat;"><span style="margin: 0px; padding: 0px; border: none; color: black; background-color: inherit;">Y: : YArchetype</span></li></ol></pre><p style="margin: 10px 0px; padding: 0px; background-color: transparent; text-indent: 28px;">插件将根据我们提供的信息创建项目骨架。在当前目录下，Archetype插件会创建一个名为helloworld（我们定义的artifactId）的子目录，从中可以看到项目的基本结构：基本的pom.xml已经被创建，里面包含了必要的信息以及一个junit依赖；主代码目录src/main/java已经被创建，在该目录下还有一个Java类com.juvenxu.mvnbook.helloworld.App，注意这里使用到了刚才定义的包名，而这个类也仅仅只有一个简单的输出Hello World!的main方法；测试代码目录src/test/java也被创建好了，并且包含了一个测试用例com.juvenxu.mvnbook.helloworld.AppTest。</p><p style="margin: 10px 0px; padding: 0px; background-color: transparent; text-indent: 28px;">Archetype可以帮助我们迅速地构建起项目的骨架，在前面的例子中，我们完全可以在Archetype生成的骨架的基础上开发Hello World项目以节省大量时间。</p><p style="margin: 10px 0px; padding: 0px; background-color: transparent; text-indent: 28px;">此外，这里仅仅是看到了一个最简单的Archetype，如果有很多项目拥有类似的自定义项目结构以及配置文件，则完全可以一劳永逸地开发自己的Archetype，然后在这些项目中使用自定义的Archetype来快速生成项目骨架。本书后面的章节会详细阐述如何开发Maven Archetype。<br /><br /></p><h3 style="font-size: 1.2em; line-height: 1.5em; margin: 0px 0px 0.5em; padding: 0px; color: #000000; font-family: Helvetica, Tahoma, Arial, sans-serif; background-color: #ffffff;">Maven2创建Java项目<p style="margin: 0px; padding: 0px; font-size: 14px; line-height: 25.200000762939453px;">1、打开命令行窗口，显示在保存项目的位置；</p><p style="margin: 0px; padding: 0px; font-size: 14px; line-height: 25.200000762939453px;">2、创建JAVA项目</p><p style="margin: 0px; padding: 0px; font-size: 14px; line-height: 25.200000762939453px;">&nbsp;&nbsp;&nbsp;&nbsp; 命令：<span style="color: #ff0000;">mvn&nbsp;archetype:generate</span></p><p style="margin: 0px; padding: 0px; font-size: 14px; line-height: 25.200000762939453px;">* 输入需要创建的项目,这里创建普通java项目,按照选择输入15,默认就可以了;&nbsp;<br />*&nbsp;<strong>Define value for groupId</strong>&nbsp;:输入组织ID;&nbsp;<br />*&nbsp;<strong>Define value for groupId</strong>&nbsp;:输入项目名称;&nbsp;<br />*&nbsp;<strong>Define value for version</strong>&nbsp;:输入版本号,可以直接回车,默认是1.0-SNAPSHOT;&nbsp;<br />*&nbsp;<strong>Define value for package</strong>&nbsp;:java的包名,如com.shichao;&nbsp;<br />完成以上输入后,命令行显示以上信息,输入<strong>y</strong>&nbsp;即完成创建.</p><p style="margin: 0px; padding: 0px; font-size: 14px; line-height: 25.200000762939453px;">3、将maven项目转化为eclipse项目</p><p style="margin: 0px; padding: 0px; font-size: 14px; line-height: 25.200000762939453px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff0000;">mvn&nbsp;eclipse:eclipse</span></p><p style="margin: 0px; padding: 0px; font-size: 14px; line-height: 25.200000762939453px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maven将生成eclipse需要的配置文件,形成eclipse项目(如.project文件);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 打开eclipse,菜单选择:file&gt;import&gt;general&gt;existing projects into workspace,在对话框中选中目录,导入即可;</p><p style="margin: 0px; padding: 0px; font-size: 14px; line-height: 25.200000762939453px;">4、清除eclipse项目相关配置</p><p style="margin: 0px; padding: 0px; font-size: 14px; line-height: 25.200000762939453px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff0000;">mvn&nbsp;eclipse:clean</span></p><p style="margin: 0px; padding: 0px; font-size: 14px; line-height: 25.200000762939453px;">&nbsp;&nbsp;&nbsp;&nbsp; maven将清除项目中eclipse配置文件</p><p style="margin: 0px; padding: 0px; font-size: 14px; line-height: 25.200000762939453px;">&nbsp;</p></h3><h3>Maven2创建WEB项目</h3><h3 style="font-size: 1.2em; line-height: 1.5em; margin: 0px 0px 0.5em; padding: 0px; color: #000000; font-family: Helvetica, Tahoma, Arial, sans-serif; background-color: #ffffff;"><p style="margin: 0px; padding: 0px; font-size: 14px; line-height: 25.200000762939453px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在maven的工作空间（这里的工作空间即将要存放所创建的Web项目文件夹的文件夹。如E:\maven)中执行如下的命令：</p><p style="margin: 0px; padding: 0px; font-size: 14px; line-height: 25.200000762939453px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff0000;">mvn archetype:create -DgroupId=com.javaeye.webfoo -DartifactId=webfoo -DarchetypeArtifactId=maven-archetype-webapp</span></p><p style="margin: 0px; padding: 0px; font-size: 14px; line-height: 25.200000762939453px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 再将项目导入eclipse即可！</p><div></div></h3><p style="margin: 10px 0px; padding: 0px; background-color: transparent; text-indent: 28px;"></p></span></span></span></span></span></span></span><img src ="http://www.blogjava.net/qileilove/aggbug/410930.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qileilove/" target="_blank">顺其自然EVO</a> 2014-03-12 11:35 <a href="http://www.blogjava.net/qileilove/articles/410930.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于 Jenkins 快速搭建持续集成环境</title><link>http://www.blogjava.net/qileilove/articles/410928.html</link><dc:creator>顺其自然EVO</dc:creator><author>顺其自然EVO</author><pubDate>Wed, 12 Mar 2014 03:24:00 GMT</pubDate><guid>http://www.blogjava.net/qileilove/articles/410928.html</guid><wfw:comment>http://www.blogjava.net/qileilove/comments/410928.html</wfw:comment><comments>http://www.blogjava.net/qileilove/articles/410928.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qileilove/comments/commentRss/410928.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qileilove/services/trackbacks/410928.html</trackback:ping><description><![CDATA[<h2>持续集成概述</h2><h3>什么是持续集成</h3><p style="margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding: 6px 0px; border: 0px; outline: 0px; vertical-align: baseline; font-family: Arial, sans-serif; color: #222222; line-height: 1.5em; background-color: #ffffff; margin-top: -2px !important; font-size: 1.166em !important;">随着软件开发复杂度的不断提高，团队开发成员间如何更好地协同工作以确保软件开发的质量已经慢慢成为开发过程中不可回避的问题。尤其是近些年来，敏捷（Agile） 在软件工程领域越来越红火，如何能再不断变化的需求中快速适应和保证软件的质量也显得尤其的重要。</p><p style="margin: 0px; padding: 6px 0px; border: 0px; outline: 0px; vertical-align: baseline; font-family: Arial, sans-serif; color: #222222; line-height: 1.5em; background-color: #ffffff; font-size: 1.166em !important;">持续集成正是针对这一类问题的一种软件开发实践。它倡导团队开发成员必须经常集成他们的工作，甚至每天都可能发生多次集成。而每次的集成都是通过自动化的构建来验证，包括自动编译、发布和测试，从而尽快地发现集成错误，让团队能够更快的开发内聚的软件。</p><p style="margin: 0px; padding: 6px 0px; border: 0px; outline: 0px; vertical-align: baseline; font-family: Arial, sans-serif; color: #222222; line-height: 1.5em; background-color: #ffffff; font-size: 1.166em !important;">持续集成的核心价值在于：</p><ol type="1" style="border: 0px; outline: 0px; font-size: 1.166em; vertical-align: baseline; margin: 0px; padding: 0px 0px 0px 20px; color: #333333; line-height: 1.5em; font-family: Arial, sans-serif; background-color: #ffffff; list-style-position: initial !important; list-style-image: initial !important;"><li style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-size: inherit; vertical-align: baseline;">持续集成中的任何一个环节都是自动完成的，无需太多的人工干预，有利于减少重复过程以节省时间、费用和工作量；</li><li style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-size: inherit; vertical-align: baseline;">持续集成保障了每个时间点上团队成员提交的代码是能成功集成的。换言之，任何时间点都能第一时间发现软件的集成问题，使任意时间发布可部署的软件成为了可能；</li><li style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-size: inherit; vertical-align: baseline;">持续集成还能利于软件本身的发展趋势，这点在需求不明确或是频繁性变更的情景中尤其重要，持续集成的质量能帮助团队进行有效决策，同时建立团队对开发产品的信心。</li></ol><h3>持续集成的原则</h3><p style="margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding: 6px 0px; border: 0px; outline: 0px; vertical-align: baseline; font-family: Arial, sans-serif; color: #222222; line-height: 1.5em; background-color: #ffffff; margin-top: -2px !important; font-size: 1.166em !important;">业界普遍认同的持续集成的原则包括：</p><p style="margin: 0px; padding: 6px 0px; border: 0px; outline: 0px; vertical-align: baseline; font-family: Arial, sans-serif; color: #222222; line-height: 1.5em; background-color: #ffffff; font-size: 1.166em !important;">1）需要版本控制软件保障团队成员提交的代码不会导致集成失败。常用的版本控制软件有 IBM Rational ClearCase、CVS、Subversion 等；</p><p style="margin: 0px; padding: 6px 0px; border: 0px; outline: 0px; vertical-align: baseline; font-family: Arial, sans-serif; color: #222222; line-height: 1.5em; background-color: #ffffff; font-size: 1.166em !important;">2）开发人员必须及时向版本控制库中提交代码，也必须经常性地从版本控制库中更新代码到本地；</p><p style="margin: 0px; padding: 6px 0px; border: 0px; outline: 0px; vertical-align: baseline; font-family: Arial, sans-serif; color: #222222; line-height: 1.5em; background-color: #ffffff; font-size: 1.166em !important;">3）需要有专门的集成服务器来执行集成构建。根据项目的具体实际，集成构建可以被软件的修改来直接触发，也可以定时启动，如每半个小时构建一次；</p><p style="margin: 0px; padding: 6px 0px; border: 0px; outline: 0px; vertical-align: baseline; font-family: Arial, sans-serif; color: #222222; line-height: 1.5em; background-color: #ffffff; font-size: 1.166em !important;">4）必须保证构建的成功。如果构建失败，修复构建过程中的错误是优先级最高的工作。一旦修复，需要手动启动一次构建。</p><h3>持续集成系统的组成</h3><p style="margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding: 6px 0px; border: 0px; outline: 0px; vertical-align: baseline; font-family: Arial, sans-serif; color: #222222; line-height: 1.5em; background-color: #ffffff; margin-top: -2px !important; font-size: 1.166em !important;">由此可见，一个完整的构建系统必须包括：</p><ol type="1" style="border: 0px; outline: 0px; font-size: 1.166em; vertical-align: baseline; margin: 0px; padding: 0px 0px 0px 20px; color: #333333; line-height: 1.5em; font-family: Arial, sans-serif; background-color: #ffffff; list-style-position: initial !important; list-style-image: initial !important;"><li style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-size: inherit; vertical-align: baseline;">一个自动构建过程，包括自动编译、分发、部署和测试等。</li><li style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-size: inherit; vertical-align: baseline;">一个代码存储库，即需要版本控制软件来保障代码的可维护性，同时作为构建过程的素材库。</li><li style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-size: inherit; vertical-align: baseline;">一个持续集成服务器。本文中介绍的 Jenkins 就是一个配置简单和使用方便的持续集成服务器。</li></ol><div style="margin: 10px 0px; border: 0px; outline: 0px; font-size: 12.727272033691406px; vertical-align: baseline; font-family: Arial, sans-serif; background-color: #cccccc; height: 1px; clear: both; line-height: 13.96363639831543px;"></div><p ibm-back-to-top"="" style="margin: 0px; padding: 6px 0px; border: 0px; outline: 0px; vertical-align: baseline; font-family: Arial, sans-serif; color: #222222; clear: both; text-align: right; height: 21.81818199157715px; line-height: 1.5em; background-color: #ffffff; font-size: 1.166em !important;"><a href="http://www.ibm.com/developerworks/cn/java/j-lo-jenkins/#ibm-pcon" style="margin: 0px; padding: 0px 0px 0px 16px; border-width: 0px; border-bottom-style: none; outline: 0px; font-size: inherit; vertical-align: baseline; color: #745285; opacity: 0.8; display: inline; text-decoration: none; line-height: 1.065em; font-weight: bold; background-image: url(http://1.www.s81c.com/i/v17/icons/ibm_sprite_arrow_blue_ON.png) !important; background-position: 0px -401px; background-repeat: no-repeat no-repeat;">回页首</a></p><h2>Jenkins 简介</h2><p style="margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding: 6px 0px; border: 0px; outline: 0px; vertical-align: baseline; font-family: Arial, sans-serif; color: #222222; line-height: 1.5em; background-color: #ffffff; font-size: 1.166em !important;">Jenkins 是一个开源项目，提供了一种易于使用的持续集成系统，使开发者从繁杂的集成中解脱出来，专注于更为重要的业务逻辑实现上。同时 Jenkins 能实施监控集成中存在的错误，提供详细的日志文件和提醒功能，还能用图表的形式形象地展示项目构建的趋势和稳定性。下面将介绍 Jenkins 的基本功能。</p><p style="margin: 0px; padding: 6px 0px; border: 0px; outline: 0px; vertical-align: baseline; font-family: Arial, sans-serif; color: #222222; line-height: 1.5em; background-color: #ffffff; font-size: 1.166em !important;">Jenkins 的安装非常简单，只需要从 Jenkins 的主页上下载最新的 jenkins.war 文件然后运行 java -jar jenkins.war。同时，还可以点击 Jenkins 页面上的 launch 按钮完成下载和运行 Jenkins。</p><h5>图 1. Jenkins Launch 按钮</h5><img alt="图 1. Jenkins Launch 按钮" src="http://www.ibm.com/developerworks/cn/java/j-lo-jenkins/image003.jpg" width="515" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-size: 12.727272033691406px; vertical-align: baseline; font-family: Arial, sans-serif; line-height: 13.96363639831543px; background-color: #ffffff;" /><p style="margin: 0px; padding: 6px 0px; border: 0px; outline: 0px; vertical-align: baseline; font-family: Arial, sans-serif; color: #222222; line-height: 1.5em; background-color: #ffffff; font-size: 1.166em !important;">启动 Jenkins 后，会有一个后台进程在命令行模式下运行。此时在浏览器地址栏中打开 http://localhost:8080 就可以看到 Jenkins 的页面了。Jenkins 的可贵之处在于具有非常高的可用性，从它的界面中能很轻松地完成各种配置，更多的配置和使用信息，可以在 Jenkins 的官方网站上查询。</p><h5>图 2. 命令行模式下运行 Jenkins</h5><img alt="图 2. 命令行模式下运行 Jenkins" src="http://www.ibm.com/developerworks/cn/java/j-lo-jenkins/image005.jpg" width="559" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-size: 12.727272033691406px; vertical-align: baseline; font-family: Arial, sans-serif; line-height: 13.96363639831543px; background-color: #ffffff;" /><h5>图 3. Jenkins 主界面</h5><img alt="图 3. Jenkins 主界面" src="http://www.ibm.com/developerworks/cn/java/j-lo-jenkins/image007.jpg" width="539" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-size: 12.727272033691406px; vertical-align: baseline; font-family: Arial, sans-serif; line-height: 13.96363639831543px; background-color: #ffffff;" /><p style="margin: 0px; padding: 6px 0px; border: 0px; outline: 0px; vertical-align: baseline; font-family: Arial, sans-serif; color: #222222; line-height: 1.5em; background-color: #ffffff; font-size: 1.166em !important;">非常有趣的是，Jenkins 还提供了非常丰富的插件支持，这使得 Jenkins 变得越来越强大。我们可以方便的安装各种第三方插件，从而方便快捷的集成第三方的应用。比如 Jenkins 提供了对于 IBM Rational ClearCase 的插件支持。</p><h5>图 4. Jenkins 可以集成 ClearCase 插件</h5><img alt="图 4. Jenkins 可以集成 ClearCase 插件" src="http://www.ibm.com/developerworks/cn/java/j-lo-jenkins/image009.jpg" width="525" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-size: 12.727272033691406px; vertical-align: baseline; font-family: Arial, sans-serif; line-height: 13.96363639831543px; background-color: #ffffff;" /><p style="margin: 0px; padding: 6px 0px; border: 0px; outline: 0px; vertical-align: baseline; font-family: Arial, sans-serif; color: #222222; line-height: 1.5em; background-color: #ffffff; font-size: 1.166em !important;">此外，Jenkins 提供了丰富的管理和配置的功能，包括系统配置、管理插件、查看系统信息、系统日志、节点管理、Jenkins 命令行窗口、信息统计等功能。试试看，您就会发现 Jenkins 非常好上手使用。</p><h5>图 5. Jenkins 提供了丰富的管理功能</h5><img alt="图 5. Jenkins 提供了丰富的管理功能" src="http://www.ibm.com/developerworks/cn/java/j-lo-jenkins/image011.jpg" width="542" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-size: 12.727272033691406px; vertical-align: baseline; font-family: Arial, sans-serif; line-height: 13.96363639831543px; background-color: #ffffff;" /><div style="margin: 10px 0px; border: 0px; outline: 0px; font-size: 12.727272033691406px; vertical-align: baseline; font-family: Arial, sans-serif; background-color: #cccccc; height: 1px; clear: both; line-height: 13.96363639831543px;"></div><p ibm-back-to-top"="" style="margin: 0px; padding: 6px 0px; border: 0px; outline: 0px; vertical-align: baseline; font-family: Arial, sans-serif; color: #222222; clear: both; text-align: right; height: 21.81818199157715px; line-height: 1.5em; background-color: #ffffff; font-size: 1.166em !important;"><a href="http://www.ibm.com/developerworks/cn/java/j-lo-jenkins/#ibm-pcon" style="margin: 0px; padding: 0px 0px 0px 16px; border-width: 0px; border-bottom-style: none; outline: 0px; font-size: inherit; vertical-align: baseline; color: #745285; opacity: 0.8; display: inline; text-decoration: none; line-height: 1.065em; font-weight: bold; background-image: url(http://1.www.s81c.com/i/v17/icons/ibm_sprite_arrow_blue_ON.png) !important; background-position: 0px -401px; background-repeat: no-repeat no-repeat;">回页首</a></p><h2>基于 Jenkins 快速搭建持续集成环境</h2><p style="margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding: 6px 0px; border: 0px; outline: 0px; vertical-align: baseline; font-family: Arial, sans-serif; color: #222222; line-height: 1.5em; background-color: #ffffff; font-size: 1.166em !important;">正如前文中所描述的那样，一个持续集成环境需要包括三个方面要素：代码存储库、构建过程和持续集成服务器。对 Jenkins 有了初步了解后，我们通过一个实例来集中展示如何快速搭建一个简单的基于 Jenkins 的持续集成环境。</p><p style="margin: 0px; padding: 6px 0px; border: 0px; outline: 0px; vertical-align: baseline; font-family: Arial, sans-serif; color: #222222; line-height: 1.5em; background-color: #ffffff; font-size: 1.166em !important;">假设我们使用的代码存储库是 IBM Rational ClearCase。Jenkins 提供了对 ClearCase 的插件支持，它能方便地让我们连接到 Base ClearCase 或者 UCM ClearCase，使其成为 Jenkins Project 的代码控制器。另外，这个插件是基于 cleartool 命令的，所以必须在 Jenkins 的持续集成服务器上安装 ClearCase 的客户端程序。</p><p style="margin: 0px; padding: 6px 0px; border: 0px; outline: 0px; vertical-align: baseline; font-family: Arial, sans-serif; color: #222222; line-height: 1.5em; background-color: #ffffff; font-size: 1.166em !important;">在 Jenkins 的插件管理界面中选择 ClearCase Plugin，点击页面下方的 Install 按钮。</p><h5>图 6. 选择 ClearCase 插件</h5><img alt="图 6. 选择 ClearCase 插件" src="http://www.ibm.com/developerworks/cn/java/j-lo-jenkins/image013.jpg" width="558" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-size: 12.727272033691406px; vertical-align: baseline; font-family: Arial, sans-serif; line-height: 13.96363639831543px; background-color: #ffffff;" /><p style="margin: 0px; padding: 6px 0px; border: 0px; outline: 0px; vertical-align: baseline; font-family: Arial, sans-serif; color: #222222; line-height: 1.5em; background-color: #ffffff; font-size: 1.166em !important;">在打开的页面中提示安装完成后，Jenkins 需要重新启动来激活这个插件。重新执行 java -jar Jenkins.war 后，在 Jenkins 的页面中，我们就能看到 ClearCase plugin 已经被安装到 Jenkins 了。</p><h5>图 7. ClearCase 插件安装成功</h5><img alt="图 7. ClearCase 插件安装成功" src="http://www.ibm.com/developerworks/cn/java/j-lo-jenkins/image015.jpg" width="563" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-size: 12.727272033691406px; vertical-align: baseline; font-family: Arial, sans-serif; line-height: 13.96363639831543px; background-color: #ffffff;" /><p style="margin: 0px; padding: 6px 0px; border: 0px; outline: 0px; vertical-align: baseline; font-family: Arial, sans-serif; color: #222222; line-height: 1.5em; background-color: #ffffff; font-size: 1.166em !important;">类似 IBM Rational ClearCase，SVN（subversion）是目前比较流行的版本管理工具。很多开源软件都是用 SVN 作为代码版本管理软件。为了让实例更具有代表性，本文中我们使用 SVN 作为代码存储器。</p><p style="margin: 0px; padding: 6px 0px; border: 0px; outline: 0px; vertical-align: baseline; font-family: Arial, sans-serif; color: #222222; line-height: 1.5em; background-color: #ffffff; font-size: 1.166em !important;">接下来，我们开始新建一个 Jenkins 项目， 由于我们需要连接 SVN 的代码存储器， 我们选择 Build a free-style software project。</p><h5>图 8. 新建 JenkinsTest Job</h5><img alt="图 8. 新建 JenkinsTest Job" src="http://www.ibm.com/developerworks/cn/java/j-lo-jenkins/image017.jpg" width="575" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-size: 12.727272033691406px; vertical-align: baseline; font-family: Arial, sans-serif; line-height: 13.96363639831543px; background-color: #ffffff;" /><p style="margin: 0px; padding: 6px 0px; border: 0px; outline: 0px; vertical-align: baseline; font-family: Arial, sans-serif; color: #222222; line-height: 1.5em; background-color: #ffffff; font-size: 1.166em !important;">然后我们就可以很方便的配置这个 JenkinsTest 项目了。Jenkins 很人性化的一点是在每个配置项的右侧都有一个帮助的图标，点击这个图标，Jenkins 会告诉您如何配置这个配置项。</p><h5>图 9. 配置 JenkinsTest</h5><img alt="图 9. 配置 JenkinsTest" src="http://www.ibm.com/developerworks/cn/java/j-lo-jenkins/image019.jpg" width="559" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-size: 12.727272033691406px; vertical-align: baseline; font-family: Arial, sans-serif; line-height: 13.96363639831543px; background-color: #ffffff;" /><p style="margin: 0px; padding: 6px 0px; border: 0px; outline: 0px; vertical-align: baseline; font-family: Arial, sans-serif; color: #222222; line-height: 1.5em; background-color: #ffffff; font-size: 1.166em !important;">根据实际的 SVN 服务器服务器信息配置 Source Code Management，这能让 Jenkins 知道如何从哪里获取最新的代码。本例中假设 Repository 就在本地。</p><h5>图 10. 配置连接到 SVN 服务器</h5><img alt="图 10. 配置连接到 SVN 服务器" src="http://www.ibm.com/developerworks/cn/java/j-lo-jenkins/image021.jpg" width="551" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-size: 12.727272033691406px; vertical-align: baseline; font-family: Arial, sans-serif; line-height: 13.96363639831543px; background-color: #ffffff;" /><p style="margin: 0px; padding: 6px 0px; border: 0px; outline: 0px; vertical-align: baseline; font-family: Arial, sans-serif; color: #222222; line-height: 1.5em; background-color: #ffffff; font-size: 1.166em !important;">根据开发需要，假设每一个小时我们需要重新构建一次。选择 Build periodically，在 Schedule 中填写 0 * * * *。</p><p style="margin: 0px; padding: 6px 0px; border: 0px; outline: 0px; vertical-align: baseline; font-family: Arial, sans-serif; color: #222222; line-height: 1.5em; background-color: #ffffff; font-size: 1.166em !important;">第一个参数代表的是分钟 minute，取值 0~59；</p><p style="margin: 0px; padding: 6px 0px; border: 0px; outline: 0px; vertical-align: baseline; font-family: Arial, sans-serif; color: #222222; line-height: 1.5em; background-color: #ffffff; font-size: 1.166em !important;">第二个参数代表的是小时 hour，取值 0~23；</p><p style="margin: 0px; padding: 6px 0px; border: 0px; outline: 0px; vertical-align: baseline; font-family: Arial, sans-serif; color: #222222; line-height: 1.5em; background-color: #ffffff; font-size: 1.166em !important;">第三个参数代表的是天 day，取值 1~31；</p><p style="margin: 0px; padding: 6px 0px; border: 0px; outline: 0px; vertical-align: baseline; font-family: Arial, sans-serif; color: #222222; line-height: 1.5em; background-color: #ffffff; font-size: 1.166em !important;">第四个参数代表的是月 month，取值 1~12；</p><p style="margin: 0px; padding: 6px 0px; border: 0px; outline: 0px; vertical-align: baseline; font-family: Arial, sans-serif; color: #222222; line-height: 1.5em; background-color: #ffffff; font-size: 1.166em !important;">最后一个参数代表的是星期 week，取值 0~7，0 和 7 都是表示星期天。</p><p style="margin: 0px; padding: 6px 0px; border: 0px; outline: 0px; vertical-align: baseline; font-family: Arial, sans-serif; color: #222222; line-height: 1.5em; background-color: #ffffff; font-size: 1.166em !important;">所以 0 * * * * 表示的就是每个小时的第 0 分钟执行一次构建。</p><h5>图 11. 选择如何触发构建</h5><img alt="图 11. 选择如何触发构建" src="http://www.ibm.com/developerworks/cn/java/j-lo-jenkins/image023.jpg" width="512" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-size: 12.727272033691406px; vertical-align: baseline; font-family: Arial, sans-serif; line-height: 13.96363639831543px; background-color: #ffffff;" /><p style="margin: 0px; padding: 6px 0px; border: 0px; outline: 0px; vertical-align: baseline; font-family: Arial, sans-serif; color: #222222; line-height: 1.5em; background-color: #ffffff; font-size: 1.166em !important;">接下来就是要添加 build 的步骤了。Jenkins 提供了四个选项供我们选择，可以根据需要执行或调用外部命令和脚本。</p><h5>图 12. 四种 build step 供选择</h5><img alt="图 12. 四种 build step 供选择" src="http://www.ibm.com/developerworks/cn/java/j-lo-jenkins/image025.jpg" width="513" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-size: 12.727272033691406px; vertical-align: baseline; font-family: Arial, sans-serif; line-height: 13.96363639831543px; background-color: #ffffff;" /><p style="margin: 0px; padding: 6px 0px; border: 0px; outline: 0px; vertical-align: baseline; font-family: Arial, sans-serif; color: #222222; line-height: 1.5em; background-color: #ffffff; font-size: 1.166em !important;">在本例中，我们通过调用和执行 Windows batch command，将 SVN repository 中 Java 代码编译并生成 Jar 文件。也可以根据项目的实际编写自己的 shell 脚本配置在这里。</p><h5>图 13. 配置 Execute Windows batch command</h5><img alt="图 13. 配置 Execute Windows batch command" src="http://www.ibm.com/developerworks/cn/java/j-lo-jenkins/image027.jpg" width="564" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-size: 12.727272033691406px; vertical-align: baseline; font-family: Arial, sans-serif; line-height: 13.96363639831543px; background-color: #ffffff;" /><p style="margin: 0px; padding: 6px 0px; border: 0px; outline: 0px; vertical-align: baseline; font-family: Arial, sans-serif; color: #222222; line-height: 1.5em; background-color: #ffffff; font-size: 1.166em !important;">选择和配置其他的选项，比如邮件提醒，然后点击 save 保存。</p><h5>图 14. 配置邮件提醒</h5><img alt="图 14. 配置邮件提醒" src="http://www.ibm.com/developerworks/cn/java/j-lo-jenkins/image029.jpg" width="567" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-size: 12.727272033691406px; vertical-align: baseline; font-family: Arial, sans-serif; line-height: 13.96363639831543px; background-color: #ffffff;" /><p style="margin: 0px; padding: 6px 0px; border: 0px; outline: 0px; vertical-align: baseline; font-family: Arial, sans-serif; color: #222222; line-height: 1.5em; background-color: #ffffff; font-size: 1.166em !important;">接下来的每小时的第 0 分钟，JenkinsTest Job 就会被构建。我们可以在 Jenkins 中观察构建的进度和最终的状态&#8212;&#8212;成功或者失败。太阳代表之前的构建没有任何失败，蓝色的小球代表构建成功。</p><h5>图 15. JenkinsTest 开始构建</h5><img alt="图 15. JenkinsTest 开始构建" src="http://www.ibm.com/developerworks/cn/java/j-lo-jenkins/image031.jpg" width="572" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-size: 12.727272033691406px; vertical-align: baseline; font-family: Arial, sans-serif; line-height: 13.96363639831543px; background-color: #ffffff;" /><p style="margin: 0px; padding: 6px 0px; border: 0px; outline: 0px; vertical-align: baseline; font-family: Arial, sans-serif; color: #222222; line-height: 1.5em; background-color: #ffffff; font-size: 1.166em !important;">同时我们可以点击 JenkinsTest 查看单次构建的 Console 的输出结果。从中我们能看到构建的第一步是从 SVN 服务器上 check out 代码，然后调用我们先前配置的 Windows batch command。</p><h5>图 16. JenkinsTest 构建的 console 输出</h5><img alt="图 16. JenkinsTest 构建的 console 输出" src="http://www.ibm.com/developerworks/cn/java/j-lo-jenkins/image033.jpg" width="568" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-size: 12.727272033691406px; vertical-align: baseline; font-family: Arial, sans-serif; line-height: 13.96363639831543px; background-color: #ffffff;" /><p style="margin: 0px; padding: 6px 0px; border: 0px; outline: 0px; vertical-align: baseline; font-family: Arial, sans-serif; color: #222222; line-height: 1.5em; background-color: #ffffff; font-size: 1.166em !important;">最后，我们可以看到 build 的最后结果 Success，表明本次构建成功。</p><h5>图 17. 构建成功的 Console 输出</h5><img alt="图 17. 构建成功的 Console 输出" src="http://www.ibm.com/developerworks/cn/java/j-lo-jenkins/image035.jpg" width="565" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-size: 12.727272033691406px; vertical-align: baseline; font-family: Arial, sans-serif; line-height: 13.96363639831543px; background-color: #ffffff;" /><p style="margin: 0px; padding: 6px 0px; border: 0px; outline: 0px; vertical-align: baseline; font-family: Arial, sans-serif; color: #222222; line-height: 1.5em; background-color: #ffffff; font-size: 1.166em !important;">接下来我们再次新建一个 Jenkins 的 Job，用于将生成的 build 分发到不同的节点上。这次 build triggers 我们选择 Build after other projects are built，让这个 Job 在 JenkinsTest 成功 build 后触发。这样一来就能达到我们自动 build 和自动分发的功能。</p><h5>图 18. 新建 Distribute job</h5><img alt="图 18. 新建 Distribute job" src="http://www.ibm.com/developerworks/cn/java/j-lo-jenkins/image037.jpg" width="534" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-size: 12.727272033691406px; vertical-align: baseline; font-family: Arial, sans-serif; line-height: 13.96363639831543px; background-color: #ffffff;" /><p style="margin: 0px; padding: 6px 0px; border: 0px; outline: 0px; vertical-align: baseline; font-family: Arial, sans-serif; color: #222222; line-height: 1.5em; background-color: #ffffff; font-size: 1.166em !important;">不同的是，这次我们选择调用 Ant 脚本来完成分发的工作。只需要将 Ant 脚本的 XML 的文件配置在 Targets 中供 Jenkins 调用。</p><h5>图 19. Distribute 调用外部 Ant 脚本</h5><img alt="图 19. Distribute 调用外部 Ant 脚本" src="http://www.ibm.com/developerworks/cn/java/j-lo-jenkins/image039.jpg" width="516" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-size: 12.727272033691406px; vertical-align: baseline; font-family: Arial, sans-serif; line-height: 13.96363639831543px; background-color: #ffffff;" /><p style="margin: 0px; padding: 6px 0px; border: 0px; outline: 0px; vertical-align: baseline; font-family: Arial, sans-serif; color: #222222; line-height: 1.5em; background-color: #ffffff; font-size: 1.166em !important;">然后我们就可以在 Jenkins 中观察构建的状态了。一旦构建失败我们能看到相应的警示图标，同时，如果配置了邮件提醒，相关人员也会受到邮件。记住我们先前所提醒的那样，分析和处理构建的失败是优先级最高的工作。接下来，我们还可以加入更多的 Jenkins 项目来实现自动化测试等功能，让持续集成更方便有效地服务于项目开发。</p><h5>图 20. 查看持续集成状态</h5><img alt="图 20. 查看持续集成状态" src="http://www.ibm.com/developerworks/cn/java/j-lo-jenkins/image041.jpg" width="559" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-size: 12.727272033691406px; vertical-align: baseline; font-family: Arial, sans-serif; line-height: 13.96363639831543px; background-color: #ffffff;" /><div style="margin: 10px 0px; border: 0px; outline: 0px; font-size: 12.727272033691406px; vertical-align: baseline; font-family: Arial, sans-serif; background-color: #cccccc; height: 1px; clear: both; line-height: 13.96363639831543px;"></div><p ibm-back-to-top"="" style="margin: 0px; padding: 6px 0px; border: 0px; outline: 0px; vertical-align: baseline; font-family: Arial, sans-serif; color: #222222; clear: both; text-align: right; height: 21.81818199157715px; line-height: 1.5em; background-color: #ffffff; font-size: 1.166em !important;"><a href="http://www.ibm.com/developerworks/cn/java/j-lo-jenkins/#ibm-pcon" style="margin: 0px; padding: 0px 0px 0px 16px; border-width: 0px; border-bottom-style: none; outline: 0px; font-size: inherit; vertical-align: baseline; color: #745285; opacity: 0.8; display: inline; text-decoration: none; line-height: 1.065em; font-weight: bold; background-image: url(http://1.www.s81c.com/i/v17/icons/ibm_sprite_arrow_blue_ON.png) !important; background-position: 0px -401px; background-repeat: no-repeat no-repeat;">回页首</a></p><h2>结束语</h2><p style="margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding: 6px 0px; border: 0px; outline: 0px; vertical-align: baseline; font-family: Arial, sans-serif; color: #222222; line-height: 1.5em; background-color: #ffffff; font-size: 1.166em !important;">本文简单介绍了持续集成的概念并着重介绍了如何基于 Jenkins 快速构建持续集成环境。通过具体实例的描述，相信读者对 Jenkins 的基本功能和实现方法有个更清楚地认识和理解。其实，Jenkins 的功能远不至文中所述的这些，Jenkins 还有详尽的日志处理和持续集成构建状态的分析等功能。希望在进一步的学习和应用中与大家分享。</p><img src ="http://www.blogjava.net/qileilove/aggbug/410928.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qileilove/" target="_blank">顺其自然EVO</a> 2014-03-12 11:24 <a href="http://www.blogjava.net/qileilove/articles/410928.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>1. MAVEN + SVN + HUDSON + SONAR集成测试环境搭建、</title><link>http://www.blogjava.net/qileilove/articles/410916.html</link><dc:creator>顺其自然EVO</dc:creator><author>顺其自然EVO</author><pubDate>Wed, 12 Mar 2014 02:48:00 GMT</pubDate><guid>http://www.blogjava.net/qileilove/articles/410916.html</guid><wfw:comment>http://www.blogjava.net/qileilove/comments/410916.html</wfw:comment><comments>http://www.blogjava.net/qileilove/articles/410916.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qileilove/comments/commentRss/410916.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qileilove/services/trackbacks/410916.html</trackback:ping><description><![CDATA[<div style="font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; background-color: #ffffff;"><strong style="word-break: break-all; line-height: normal !important;">1. MAVEN + SVN + HUDSON + SONAR集成测试环境搭建、</strong></div><div style="font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; background-color: #ffffff;">　　<strong style="word-break: break-all; line-height: normal !important;">1.1 软件准备</strong></div><div style="font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; background-color: #ffffff;">　　Hudson、Jenkins、Sonar</div><div style="font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; background-color: #ffffff;">　　<strong style="word-break: break-all; line-height: normal !important;">1.2 软件安装</strong></div><div style="font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; background-color: #ffffff;">　　说明：本例均使用将应用程序部署至<a target="_self" style="word-break: break-all; color: #202859; line-height: normal !important;"><u style="word-break: break-all;"><strong style="word-break: break-all;">web</strong></u></a>容器下，Hudson和Sonar有其他部署启动方式，如有需要请自行使用，本文不做赘述。</div><div style="font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; background-color: #ffffff;">　　1.2.1 安装hudson</div><div style="font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; background-color: #ffffff;">　　1)将下载到的hudson.war文件部署至web容器中，启动web容器。</div><div style="font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; background-color: #ffffff;">　　2)访问地址http://localhost:8080/hudson，显示如下：</div><div style="font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; background-color: #ffffff;">　　(8080是容器默认端口，hudson是项目名称)</div><div style="font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; background-color: #ffffff;">　　1.2.2 安装sonar</div><div style="font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; background-color: #ffffff;">　　说明：以下内容是快速安装的示例。</div><div style="font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; background-color: #ffffff;">　　1)解压sonar.zip，进入war文件夹下，运行build-war文件，会生成sonar.war文件</div><div style="font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; background-color: #ffffff;">　　2)将sonar.war文件部署至web容器下，启动容器</div><div style="font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; background-color: #ffffff;">　　3)访问地址http://localhost:8080/sonar/，显示如下：</div><div style="font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; background-color: #ffffff;">　　4)(8080是容器默认端口，sonar是项目名称)</div><div style="font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; background-color: #ffffff;">　<strong style="word-break: break-all; line-height: normal !important;">　1.3 软件配置</strong></div><div style="font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; background-color: #ffffff;">　　1.3.1 配置sonar</div><div style="font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; background-color: #ffffff;">　　1)创建<a target="_self" style="word-break: break-all; color: #202859; line-height: normal !important;"><u style="word-break: break-all;"><strong style="word-break: break-all;">数据库</strong></u></a></div><div style="font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; background-color: #ffffff;">　　a)Sonar需要数据库的支持，其本身自带Derby同时支持MySQL5.x，<a target="_self" style="word-break: break-all; color: #202859; line-height: normal !important;"><u style="word-break: break-all;"><strong style="word-break: break-all;">Oracle</strong></u></a>&nbsp;10g XE,Postgresql和MS SqlServer 2005，推荐使用<a target="_self" style="word-break: break-all; color: #202859; line-height: normal !important;"><u style="word-break: break-all;"><strong style="word-break: break-all;">MySQL</strong></u></a>。</div><div style="font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; background-color: #ffffff;">　　b)创建数据库：MySQL中创建用户sonar，同时创建数据库sonar，未用户sonar赋予权限。</div><div style="font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; background-color: #ffffff;">　　说明：表和索引活在sonar激活后自动创建。</div><div style="font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; background-color: #ffffff;">　　2)配置数据库，编辑conf/sonar.properties</div><div style="font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; background-color: #ffffff;"><table align="center" style="word-break: break-all; border-style: solid; border-color: #999999; width: 612.7272338867188px; background-color: #dddddd; font-size: 12px;"><tbody style="word-break: break-all;"><tr style="word-break: break-all;"><td style="font-size: 12px; word-break: break-all;"><div style="word-break: break-all; margin: 10px 0px;">sonar.jdbc.username: sonar</div><div style="word-break: break-all; margin: 10px 0px;">sonar.jdbc.password: sonar</div><div style="word-break: break-all; margin: 10px 0px;">sonar.jdbc.url: &nbsp; &nbsp; jdbc:mysql://localhost:3306/sonar?useUnicode=true&amp;characterEncoding=utf8&amp;rewriteBatchedStatements=true</div><div style="word-break: break-all; margin: 10px 0px;">sonar.jdbc.driverClassName:com.mysql.jdbc.Driver</div></td></tr></tbody></table></div><div style="font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; background-color: #ffffff;">　　说明：更改数据库配置，请注意extensions/jdbc-driver/mysql/目录下是否有对应的驱动</div><div style="font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; background-color: #ffffff;">　　1.3.2 配置hudson</div><div style="font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; background-color: #ffffff;">　　请保证Hudson已经安装以下插件：</div><div style="font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; background-color: #ffffff;">　　进入Manage Hudson -&gt;Config System进行配置，显示如下：</div><div style="font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; background-color: #ffffff;">　　1)系统信息配置：</div><div style="font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; background-color: #ffffff;">　　Home directory：hudson目录</div><div style="font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; background-color: #ffffff;">　　System Message：hudson系统说明信息</div><div style="font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; background-color: #ffffff;">　　# of executors：同时可执行最大数</div><div style="font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; background-color: #ffffff;">　　Quiet period：构建工程之前的等候时间，单位是s，此项较重要可以保证构建工程时项目的完整性</div><div style="font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; background-color: #ffffff;">　　SCM checkout retry count：检出失败重试次数<span style="font-size: 11.818181991577148px; line-height: 21.60000228881836px; font-family: verdana, 'courier new';">2)安全信息配置：</span></div><div style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px;">　　3)JDK配置：</div><div style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px;">　　如果系统配置已为JDK配置了环境变量，则此处可以不做设置</div><div style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px;">　　4)Maven配置：</div><div style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px;">　　Name：为你的maven指定名称</div><div style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px;">　　MAVEN_HOME：指定maven安装路径</div><div style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px;">　　5)SVN配置：</div><div style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px;">　　Exclusion revprop name：指定项目SVN路径</div><div style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px;">　　<strong style="word-break: break-all; line-height: normal !important;">1.4 环境集成</strong></div><div style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px;">　　1.4.1 Maven与Sonar集成</div><div style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px;">　　编辑$MAVEN_HOME/conf或者~/.m2下的setting.xml文件，添加如下内容：</div><div style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px;"><table align="center" style="word-break: break-all; border-style: solid; border-color: #999999; width: 612.7272338867188px; background-color: #dddddd; font-size: 12px;"><tbody style="word-break: break-all;"><tr style="word-break: break-all;"><td style="font-size: 12px; word-break: break-all;"><div style="word-break: break-all; margin: 10px 0px;">&lt;!--sonar --&gt;</div><div style="word-break: break-all; margin: 10px 0px;">&lt;profile&gt;</div><div style="word-break: break-all; margin: 10px 0px;">&lt;id&gt;sonar&lt;/id&gt;</div><div style="word-break: break-all; margin: 10px 0px;">&lt;activation&gt;</div><div style="word-break: break-all; margin: 10px 0px;">&lt;activeByDefault&gt;true&lt;/activeByDefault&gt;</div><div style="word-break: break-all; margin: 10px 0px;">&lt;/activation&gt;</div><div style="word-break: break-all; margin: 10px 0px;">&lt;properties&gt;</div><div style="word-break: break-all; margin: 10px 0px;">&lt;!-- mysql--&gt;</div><div style="word-break: break-all; margin: 10px 0px;">&lt;sonar.jdbc.url&gt; jdbc:mysql://localhost:3306/sonar?useUnicode=true&amp;characterEncoding=utf8&amp;rewriteBatchedStatements=true</div><div style="word-break: break-all; margin: 10px 0px;">&lt;/sonar.jdbc.url&gt;</div><div style="word-break: break-all; margin: 10px 0px;">&lt;sonar.jdbc.driver&gt; com.mysql.jdbc.Driver&lt;/sonar.jdbc.driver&gt;</div><div style="word-break: break-all; margin: 10px 0px;">&lt;sonar.jdbc.username&gt;sonar&lt;/sonar.jdbc.username&gt;</div><div style="word-break: break-all; margin: 10px 0px;">&lt;sonar.jdbc.password&gt;sonar&lt;/sonar.jdbc.password&gt;</div><div style="word-break: break-all; margin: 10px 0px;">&lt;!--remote host--&gt;</div><div style="word-break: break-all; margin: 10px 0px;">&lt;sonar.host.url&gt;http://localhost:8080/sonar&lt;/sonar.host.url&gt;</div><div style="word-break: break-all; margin: 10px 0px;">&lt;/properties&gt;</div><div style="word-break: break-all; margin: 10px 0px;">&lt;/profile&gt;</div></td></tr></tbody></table></div><div style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px;">　　说明： 因为sonar是通过Maven2插件来分析源代码并把结果注入到数据库的，所以必须在Maven的配置里设置数据库的属性。</div><div style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px;">　　1.4.2 hudson与sonar集成</div><div style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px;">　　1)安装sonar插件</div><div style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px;">　　2)配置Sonar参数（服务地址和数据库地址）</div><div style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px;">　　<strong style="word-break: break-all; line-height: normal !important;">1.5 创建和配置job</strong></div><div style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px;">　　1.5.1 创建JOB，点击New Job，显示如下：</div><div style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px;">　　1.5.2 点击OK，显示如下：</div><div style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px;">　　1)工程概要配置：</div><div style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px;">　　2)工程高级配置：</div><div style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px;">　　3)源码管理：</div><div style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px;">　　高级配置：</div><div style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px;">　　4)构建</div><div style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px;">　　2.Eclipse中IDE环境下集成测试</div><div style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px;">　　说明：在IDE环境下集成测试非常方便，可以使用的组件有dashboard、cobertura、findbugs</div><div style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px;">　　2.1 &nbsp; Findbugs：根据既定规则检查代码bug</div><div style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px;">　　1)修改工程的pom.xml文件，添加findbugs-maven-plugin插件</div><div style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px;"><table align="center" style="word-break: break-all; border-style: solid; border-color: #999999; width: 612.7272338867188px; background-color: #dddddd; font-size: 12px;"><tbody style="word-break: break-all;"><tr style="word-break: break-all;"><td style="font-size: 12px; word-break: break-all;"><div style="word-break: break-all; margin: 10px 0px;">&lt;plugin&gt;</div><div style="word-break: break-all; margin: 10px 0px;">&lt;groupId&gt;org.codehaus.mojo&lt;/groupId&gt;</div><div style="word-break: break-all; margin: 10px 0px;">&lt;artifactId&gt;findbugs-maven-plugin&lt;/artifactId&gt;</div><div style="word-break: break-all; margin: 10px 0px;">&lt;version&gt;2.5.1&lt;/version&gt;</div><div style="word-break: break-all; margin: 10px 0px;">&lt;configuration&gt;</div><div style="word-break: break-all; margin: 10px 0px;">&lt;threshold&gt;High&lt;/threshold&gt;</div><div style="word-break: break-all; margin: 10px 0px;">&lt;effort&gt;Default&lt;/effort&gt;</div><div style="word-break: break-all; margin: 10px 0px;">&lt;findbugsXmlOutput&gt;true&lt;/findbugsXmlOutput&gt;</div><div style="word-break: break-all; margin: 10px 0px;">&lt;!-- findbugs xml输出路径--&gt; &nbsp; &nbsp; &nbsp; &nbsp;&lt;findbugsXmlOutputDirectory&gt;target/site&lt;/findbugsXmlOutputDirectory&gt;</div><div style="word-break: break-all; margin: 10px 0px;">&lt;/configuration&gt;</div><div style="word-break: break-all; margin: 10px 0px;">&lt;/plugin&gt;</div></td></tr></tbody></table></div><div style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px;">　　2)输入命令：</div><div style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px;">　　mvn findbugs:findbugs</div><div style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px;">　　3)结果会生成在target/目录下findbugsXml.xml文件中</div><div style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px;">　　2.2 Cobertura：测试覆盖率插件</div><div style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px;">　　1)修改工程的pom.xml文件，添加cobertura-maven-plugin插件</div><div style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px;"><table align="center" style="word-break: break-all; border-style: solid; border-color: #999999; width: 612.7272338867188px; background-color: #dddddd; font-size: 12px;"><tbody style="word-break: break-all;"><tr style="word-break: break-all;"><td style="font-size: 12px; word-break: break-all;"><div style="word-break: break-all; margin: 10px 0px;">&lt;plugin&gt;</div><div style="word-break: break-all; margin: 10px 0px;">&lt;groupId&gt;org.codehaus.mojo&lt;/groupId&gt;</div><div style="word-break: break-all; margin: 10px 0px;">&lt;artifactId&gt;cobertura-maven-plugin&lt;/artifactId&gt;</div><div style="word-break: break-all; margin: 10px 0px;">&lt;version&gt;2.5.1&lt;/version&gt;</div><div style="word-break: break-all; margin: 10px 0px;">&lt;/plugin&gt;</div></td></tr></tbody></table></div><div style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px;">　　2)输入命令：</div><div style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px;">　　mvn cobertura:cobertura</div><div style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px;">　　3)结果生成在target/site/cobertura目录下</div><div style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px;">　　2.3 &nbsp; Dashboard：图表显示测试结果</div><div style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px;">　　1)修改工程的pom.xml文件，添加dashboard-maven-plugin插件</div><div style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px;"><table align="center" style="word-break: break-all; border-style: solid; border-color: #999999; width: 612.7272338867188px; background-color: #dddddd; font-size: 12px;"><tbody style="word-break: break-all;"><tr style="word-break: break-all;"><td style="font-size: 12px; word-break: break-all;"><div style="word-break: break-all; margin: 10px 0px;">&lt;plugin&gt;</div><div style="word-break: break-all; margin: 10px 0px;">&lt;groupId&gt;org.codehaus.mojo&lt;/groupId&gt;</div><div style="word-break: break-all; margin: 10px 0px;">&lt;artifactId&gt;dashboard-maven-plugin&lt;/artifactId&gt;</div><div style="word-break: break-all; margin: 10px 0px;">&lt;version&gt;1.0.0-beta-1&lt;/version&gt;</div><div style="word-break: break-all; margin: 10px 0px;">&lt;/plugin&gt;</div></td></tr></tbody></table></div><div style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px;">　　2)输入命令：</div><div style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px;"><table align="center" style="word-break: break-all; border-style: solid; border-color: #999999; width: 612.7272338867188px; background-color: #dddddd; font-size: 12px;"><tbody style="word-break: break-all;"><tr style="word-break: break-all;"><td style="font-size: 12px; word-break: break-all;"><div style="word-break: break-all; margin: 10px 0px;">mvn site</div><div style="word-break: break-all; margin: 10px 0px;">mvn dashboard:dashboard</div></td></tr></tbody></table></div><div style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px;">　　3)在项目targe/site目录下打开dashboard页面查看结果</div><div style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px;">　　如果安装了dashboard插件，可以在dashaboard文件中查看所有测试结果信息。</div><div style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 11.818181991577148px; word-break: break-all; line-height: 21.60000228881836px; margin: 10px 0px;"></div><img src ="http://www.blogjava.net/qileilove/aggbug/410916.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qileilove/" target="_blank">顺其自然EVO</a> 2014-03-12 10:48 <a href="http://www.blogjava.net/qileilove/articles/410916.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jenkins之构建后操作</title><link>http://www.blogjava.net/qileilove/articles/410388.html</link><dc:creator>顺其自然EVO</dc:creator><author>顺其自然EVO</author><pubDate>Thu, 27 Feb 2014 07:26:00 GMT</pubDate><guid>http://www.blogjava.net/qileilove/articles/410388.html</guid><wfw:comment>http://www.blogjava.net/qileilove/comments/410388.html</wfw:comment><comments>http://www.blogjava.net/qileilove/articles/410388.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qileilove/comments/commentRss/410388.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qileilove/services/trackbacks/410388.html</trackback:ping><description><![CDATA[<br /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/jks1.jpg" width="1367" height="571" alt="" /><br /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/jks2.jpg" width="1367" height="571" alt="" /><br /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/jks3.jpg" width="1367" height="571" alt="" /><br /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/jks5.jpg" width="1367" height="571" alt="" /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/jks5.jpg" width="1367" height="571" alt="" /><br /><br /><br /><br /><br /><br /><br /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/jk6.jpg" width="1367" height="571" alt="" /><br /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/jks7.jpg" width="1367" height="571" alt="" /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/jks8.jpg" width="1367" height="571" alt="" /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/jks9.jpg" width="1367" height="571" alt="" /><br /><img src ="http://www.blogjava.net/qileilove/aggbug/410388.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qileilove/" target="_blank">顺其自然EVO</a> 2014-02-27 15:26 <a href="http://www.blogjava.net/qileilove/articles/410388.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jenkins配置详解之bulid构建项配置</title><link>http://www.blogjava.net/qileilove/articles/410331.html</link><dc:creator>顺其自然EVO</dc:creator><author>顺其自然EVO</author><pubDate>Wed, 26 Feb 2014 06:20:00 GMT</pubDate><guid>http://www.blogjava.net/qileilove/articles/410331.html</guid><wfw:comment>http://www.blogjava.net/qileilove/comments/410331.html</wfw:comment><comments>http://www.blogjava.net/qileilove/articles/410331.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qileilove/comments/commentRss/410331.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qileilove/services/trackbacks/410331.html</trackback:ping><description><![CDATA[<br /><br /><br /><br /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/jk1.jpg" width="1367" height="571" alt="" /><br /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/jk2.jpg" width="1367" height="571" alt="" /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/jm3.jpg" width="1367" height="740" alt="" /><br /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/jk4.jpg" width="1367" height="571" alt="" /><br /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/jk5.jpg" width="1367" height="571" alt="" /><br /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/jk6.jpg" width="1367" height="571" alt="" /><br /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/jk7.jpg" width="1367" height="571" alt="" /><br /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/jk8.jpg" width="1367" height="571" alt="" /><br /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/jk9.jpg" width="1367" height="571" alt="" /><br /><br /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/jk10.jpg" width="1367" height="571" alt="" /><br /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/jk11.jpg" width="1367" height="571" alt="" /><br /><br /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/jk12.jpg" width="1367" height="571" alt="" /><br /><br /><br /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/jk13.jpg" width="1367" height="571" alt="" /><br /><br /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/jk14.jpg" width="1367" height="571" alt="" /><br /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/jk15.jpg" width="1367" height="571" alt="" /><br /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/jk16.jpg" width="1367" height="571" alt="" /><br /><img src ="http://www.blogjava.net/qileilove/aggbug/410331.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qileilove/" target="_blank">顺其自然EVO</a> 2014-02-26 14:20 <a href="http://www.blogjava.net/qileilove/articles/410331.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jenkins配置详解之构建触发</title><link>http://www.blogjava.net/qileilove/articles/410283.html</link><dc:creator>顺其自然EVO</dc:creator><author>顺其自然EVO</author><pubDate>Tue, 25 Feb 2014 03:52:00 GMT</pubDate><guid>http://www.blogjava.net/qileilove/articles/410283.html</guid><wfw:comment>http://www.blogjava.net/qileilove/comments/410283.html</wfw:comment><comments>http://www.blogjava.net/qileilove/articles/410283.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qileilove/comments/commentRss/410283.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qileilove/services/trackbacks/410283.html</trackback:ping><description><![CDATA[<img src="http://www.blogjava.net/images/blogjava_net/qileilove/test/jk1.jpg" width="1367" height="571" alt="" /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/test/jk2.jpg" width="1367" height="571" alt="" /><br /><br /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/test/jk3.jpg" width="1367" height="571" alt="" /><br /><br /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/test/jk4.jpg" width="1367" height="571" alt="" /><br /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/test/jk5.jpg" width="1367" height="571" alt="" /><br /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/test/jk6.jpg" width="1367" height="571" alt="" /><br /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/cj7.jpg" width="1367" height="571" alt="" /><br /><img src ="http://www.blogjava.net/qileilove/aggbug/410283.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qileilove/" target="_blank">顺其自然EVO</a> 2014-02-25 11:52 <a href="http://www.blogjava.net/qileilove/articles/410283.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jenkins配置详解之源码管理 </title><link>http://www.blogjava.net/qileilove/articles/410242.html</link><dc:creator>顺其自然EVO</dc:creator><author>顺其自然EVO</author><pubDate>Mon, 24 Feb 2014 03:49:00 GMT</pubDate><guid>http://www.blogjava.net/qileilove/articles/410242.html</guid><wfw:comment>http://www.blogjava.net/qileilove/comments/410242.html</wfw:comment><comments>http://www.blogjava.net/qileilove/articles/410242.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qileilove/comments/commentRss/410242.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qileilove/services/trackbacks/410242.html</trackback:ping><description><![CDATA[今天我们来看看 源码管理这里，我们可以看到有cvs这是微软开发的项目版本控制系统 ，还有apache subversion 这是目前应用最广泛的开源的版本控制系统，另外我们可以通过安装插件来实现最先进的GIT版本控制 很厉害 新军。<br />首先看看cvs<br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/jenkins.jpg" width="1367" height="571" alt="" /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/jenkins1.jpg" width="1367" height="571" alt="" /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/jenkins2.jpg" width="1367" height="571" alt="" /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/jenkins3.jpg" width="1367" height="571" alt="" /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/jenkins4.jpg" width="1367" height="571" alt="" /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/jenkins5.jpg" width="1367" height="571" alt="" /><br /><br /><br />none 选项 代表不用任何版本控制<br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/jenkins6.jpg" width="1367" height="571" alt="" /><br /><br />下来我们看看 svn的配置<br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/jenkins7.jpg" alt="" /><br /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/jenkins8.jpg" width="1367" height="571" alt="" /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/jenkins9.jpg" width="1367" height="571" alt="" /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/jenkins10.jpg" width="1367" height="571" alt="" /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/jenkins11.jpg" width="1367" height="571" alt="" /><br /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/jenkins11.jpg" width="1367" height="571" alt="" /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/jenkins12.jpg" width="1367" height="571" alt="" /><br /><br /><br /><br /><p style="padding: 0px; margin: 0px 0px 10px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; line-height: 22px; background-color: #ffffff;">enkins有一些专用术语，请参考下面的连接：</p><p style="padding: 0px; margin: 0px 0px 10px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; line-height: 22px; background-color: #ffffff;"><a href="https://wiki.jenkins-ci.org/display/JENKINS/Terminology" style="padding: 0px; margin: 0px; color: #3e62a6; outline: 0px;">https://wiki.jenkins-ci.org/display/JENKINS/Terminology</a><br style="padding: 0px; margin: 0px;" /></p><p style="padding: 0px; margin: 0px 0px 10px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; line-height: 22px; background-color: #ffffff;"><br style="padding: 0px; margin: 0px;" /></p><p style="padding: 0px; margin: 0px 0px 10px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; line-height: 22px; background-color: #ffffff;"><strong style="padding: 0px; margin: 0px;">1.通过Jenkins web页面添加Git plugin</strong></p><p style="padding: 0px; margin: 0px 0px 10px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; line-height: 22px; background-color: #ffffff;">Manage Jenkins-&gt;Manage Plugins-&gt;Available中选择Git Plugin安装，</p><p style="padding: 0px; margin: 0px 0px 10px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; line-height: 22px; background-color: #ffffff;">注意要填写user name和 email地址，否则日后会碰到git tag的错误</p><p style="padding: 0px; margin: 0px 0px 10px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; line-height: 22px; background-color: #ffffff;"><br style="padding: 0px; margin: 0px;" /></p><p style="padding: 0px; margin: 0px 0px 10px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; line-height: 22px; background-color: #ffffff;"><strong style="padding: 0px; margin: 0px;">2.在Jenkins使用的机器上创建Git用户所需要的公钥</strong></p><p style="padding: 0px; margin: 0px 0px 10px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; line-height: 22px; background-color: #ffffff;">具体步骤参考前面Git server文章</p><p style="padding: 0px; margin: 0px 0px 10px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; line-height: 22px; background-color: #ffffff;"><a href="http://blog.csdn.net/sheismylife/article/details/7204345" style="padding: 0px; margin: 0px; color: #3e62a6; outline: 0px;">http://blog.csdn.net/sheismylife/article/details/7204345</a><br style="padding: 0px; margin: 0px;" /></p><p style="padding: 0px; margin: 0px 0px 10px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; line-height: 22px; background-color: #ffffff;">但是注意，要将最后生成的.ssh目录下的公钥和私钥文件复制到/var/lib/jenkins/.ssh目录下，否则git clone命令会报错</p><p style="padding: 0px; margin: 0px 0px 10px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; line-height: 22px; background-color: #ffffff;"><br style="padding: 0px; margin: 0px;" /></p><p style="padding: 0px; margin: 0px 0px 10px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; line-height: 22px; background-color: #ffffff;"><strong style="padding: 0px; margin: 0px;">3.修改jenkins目录权限</strong></p><p style="padding: 0px; margin: 0px 0px 10px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; line-height: 22px; background-color: #ffffff;">chmod -R 777 /var/lib/jenkins</p><p style="padding: 0px; margin: 0px 0px 10px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; line-height: 22px; background-color: #ffffff;"><br style="padding: 0px; margin: 0px;" /></p><p style="padding: 0px; margin: 0px 0px 10px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; line-height: 22px; background-color: #ffffff;"><strong style="padding: 0px; margin: 0px;">4.现在可以通过web页面创建一个项目Test，然后设置该项目使用Git作为版本管理。</strong></p><p style="padding: 0px; margin: 0px 0px 10px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; line-height: 22px; background-color: #ffffff;">并且设置repository路径，比如我的：git@S1:cml.git</p><p style="padding: 0px; margin: 0px 0px 10px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; line-height: 22px; background-color: #ffffff;"><br style="padding: 0px; margin: 0px;" /></p><p style="padding: 0px; margin: 0px 0px 10px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; line-height: 22px; background-color: #ffffff;"><strong style="padding: 0px; margin: 0px;">5.在build选项的pom文件指定你需要执行的pom.xml路径</strong></p><p style="padding: 0px; margin: 0px 0px 10px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; line-height: 22px; background-color: #ffffff;">比如我的一个测试工程名叫client，是个maven工程，我设置为client/pom.xml</p><p style="padding: 0px; margin: 0px 0px 10px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; line-height: 22px; background-color: #ffffff;"><br style="padding: 0px; margin: 0px;" /></p><p style="padding: 0px; margin: 0px 0px 10px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; line-height: 22px; background-color: #ffffff;"><strong style="padding: 0px; margin: 0px;">6.现在可以点击左侧的Build now进行测试</strong></p><p style="padding: 0px; margin: 0px 0px 10px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; line-height: 22px; background-color: #ffffff;"><br style="padding: 0px; margin: 0px;" /></p><p style="padding: 0px; margin: 0px 0px 10px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; line-height: 22px; background-color: #ffffff;">一切OK,则没有错误日志。在Build History中可以看到测试结果，有没有错误。</p><p style="padding: 0px; margin: 0px 0px 10px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; line-height: 22px; background-color: #ffffff;"><br style="padding: 0px; margin: 0px;" /></p><p style="padding: 0px; margin: 0px 0px 10px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; line-height: 22px; background-color: #ffffff;"><strong style="padding: 0px; margin: 0px;">7.Email发送设置</strong></p><p style="padding: 0px; margin: 0px 0px 10px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; line-height: 22px; background-color: #ffffff;">在Manage Jenkins-&gt;Configure System-&gt;Email Notification中，设置SMTP发送的基本信息，点击Advanced，可以填写用户名和密码。还有一个测试按钮可以用来发送测试设置是否正确。</p><p style="padding: 0px; margin: 0px 0px 10px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; line-height: 22px; background-color: #ffffff;"><br style="padding: 0px; margin: 0px;" /></p><p style="padding: 0px; margin: 0px 0px 10px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; line-height: 22px; background-color: #ffffff;">同时在Test项目中的Building Settings打勾选中E-mail Notification,点击右边的问号，会出现帮助文档，说明在四种情况下会发送email，填写接受email的地址，然后故意将client代码修改到不能编译通过。然后点击Build now按钮测试一下。果然收到email.</p><p style="padding: 0px; margin: 0px 0px 10px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; line-height: 22px; background-color: #ffffff;"><br style="padding: 0px; margin: 0px;" /></p><p style="padding: 0px; margin: 0px 0px 10px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; line-height: 22px; background-color: #ffffff;"><strong style="padding: 0px; margin: 0px;">8.检查代码更新并编译</strong></p><p style="padding: 0px; margin: 0px 0px 10px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; line-height: 22px; background-color: #ffffff;">可以通过Poll SCM来设置定时检查编译功能</p><p style="padding: 0px; margin: 0px 0px 10px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; line-height: 22px; background-color: #ffffff;">比如*/5 * * * * 就是每隔5分钟检查一次，如果git仓库中有更新，则执行build操作。</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 19.5px; font-size: 13px; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #fefef2;"><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #000080;"><span style="margin: 0px; padding: 0px; line-height: 1.5;"><span style="margin: 0px; padding: 0px; line-height: 1.5; font-family: Verdana, Helvetica;">&nbsp;8.&nbsp;</span><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #000000;"><span style="margin: 0px; padding: 0px; line-height: 1.5; font-family: Verdana, Helvetica;"><a href="http://192.168.1.162:8080/" style="margin: 0px; padding: 0px; color: #075db3;"><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #000000;">Jenkins</span></a></span></span></span></span><span style="margin: 0px; padding: 0px; line-height: 1.5;"><span style="margin: 0px; padding: 0px; line-height: 1.5; font-family: Verdana, Helvetica;"><span style="margin: 0px; padding: 0px; line-height: 1.5; font-size: small;">&nbsp;&#8594;&nbsp;</span></span></span><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #3465a4;"><span style="margin: 0px; padding: 0px; line-height: 1.5; font-family: Verdana, Helvetica;">configuration</span></span><span style="margin: 0px; padding: 0px; line-height: 1.5; font-family: 'Lucida Sans Unicode';">下告诉</span><span style="margin: 0px; padding: 0px; line-height: 1.5;"><span style="margin: 0px; padding: 0px; line-height: 1.5; font-family: Verdana, Helvetica;"><span style="margin: 0px; padding: 0px; line-height: 1.5; font-size: small;">jenkins</span></span></span><span style="margin: 0px; padding: 0px; line-height: 1.5; font-family: 'Lucida Sans Unicode';">你的</span><span style="margin: 0px; padding: 0px; line-height: 1.5;"><span style="margin: 0px; padding: 0px; line-height: 1.5; font-family: Verdana, Helvetica;"><span style="margin: 0px; padding: 0px; line-height: 1.5; font-size: small;">JDK</span></span></span><span style="margin: 0px; padding: 0px; line-height: 1.5;"><span style="margin: 0px; padding: 0px; line-height: 1.5; font-family: Verdana, Helvetica;"><span style="margin: 0px; padding: 0px; line-height: 1.5; font-size: small;">、</span></span></span><span style="margin: 0px; padding: 0px; line-height: 1.5;"><span style="margin: 0px; padding: 0px; line-height: 1.5; font-family: Verdana, Helvetica;"><span style="margin: 0px; padding: 0px; line-height: 1.5; font-size: small;">GIT</span></span></span><span style="margin: 0px; padding: 0px; line-height: 1.5; font-family: 'Lucida Sans Unicode';">安装路径</span>&nbsp;</p><p style="margin-top: 10px; margin-bottom: 10px; margin-left: 90px; padding: 0px; line-height: 19.5px; font-size: 13px; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #fefef2;"><img src="http://images.cnitblog.com/blog/144196/201306/07114141-3f79eb67d8254155be11cb987879a84e.jpg" alt="" style="margin: 0px; padding: 0px; border: 0px;" /></p><p style="margin-top: 10px; margin-bottom: 10px; margin-left: 90px; padding: 0px; line-height: 19.5px; font-size: 13px; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #fefef2;"><span style="margin: 0px; padding: 0px; line-height: 1.5; font-family: 'Lucida Sans Unicode';">并配置</span><span style="margin: 0px; padding: 0px; line-height: 1.5;"><span style="margin: 0px; padding: 0px; line-height: 1.5; font-family: Verdana, Helvetica;">GitHub</span><span style="margin: 0px; padding: 0px; line-height: 1.5; font-family: Verdana, Helvetica;">Web</span><span style="margin: 0px; padding: 0px; line-height: 1.5; font-family: Verdana, Helvetica;">Hook</span></span><span style="margin: 0px; padding: 0px; line-height: 1.5; font-family: 'Lucida Sans Unicode';">连通你的</span><span style="margin: 0px; padding: 0px; line-height: 1.5;"><span style="margin: 0px; padding: 0px; line-height: 1.5; font-family: Verdana, Helvetica;"><span style="margin: 0px; padding: 0px; line-height: 1.5; font-size: small;">git</span></span></span><span style="margin: 0px; padding: 0px; line-height: 1.5; font-family: 'Lucida Sans Unicode';">帐号</span></p><p style="margin-top: 10px; margin-bottom: 10px; margin-left: 90px; padding: 0px; line-height: 19.5px; font-size: 13px; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #fefef2;"><span style="margin: 0px; padding: 0px; line-height: 1.5; font-family: 'Lucida Sans Unicode';"><img src="http://images.cnitblog.com/blog/144196/201306/07120423-88229028042e48bf8e0c3b928f7f4ec0.jpg" alt="" style="margin: 0px; padding: 0px; border: 0px;" /></span></p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 19.5px; font-size: 13px; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #fefef2;"><span style="margin: 0px; padding: 0px; line-height: 1.5; font-family: 'Lucida Sans Unicode';"><span style="margin: 0px; padding: 0px; line-height: 1.5;">&nbsp; &nbsp; 9. &nbsp;至此配置完毕</span><span style="margin: 0px; padding: 0px; line-height: 1.5;"><span style="margin: 0px; padding: 0px; line-height: 1.5; font-family: Verdana, Helvetica;">，&nbsp;</span></span><span style="margin: 0px; padding: 0px; line-height: 1.5;">现在开始建个自由风格的</span></span><span style="margin: 0px; padding: 0px; line-height: 1.5;"><span style="margin: 0px; padding: 0px; line-height: 1.5; font-family: Verdana, Helvetica;"><span style="margin: 0px; padding: 0px; line-height: 1.5; font-size: small;">job</span></span></span><span style="margin: 0px; padding: 0px; line-height: 1.5;"><span style="margin: 0px; padding: 0px; line-height: 1.5; font-family: Verdana, Helvetica;"><span style="margin: 0px; padding: 0px; line-height: 1.5; font-size: small;">，&nbsp;</span></span></span><span style="margin: 0px; padding: 0px; line-height: 1.5; font-family: 'Lucida Sans Unicode';">各项的配置如下</span></p><p style="margin-top: 10px; margin-bottom: 10px; margin-left: 120px; padding: 0px; line-height: 19.5px; font-size: 13px; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #fefef2;"><br style="margin: 0px; padding: 0px;" /></p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 19.5px; font-size: 13px; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #fefef2;"><span style="margin: 0px; padding: 0px; line-height: 1.5; font-family: 'Lucida Sans Unicode';">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;当进行构建时<span style="margin: 0px; padding: 0px; line-height: 1.5; font-family: 'Times New Roman', serif;">，&nbsp;</span></span>jenkins<span style="margin: 0px; padding: 0px; line-height: 1.5; font-family: 'Lucida Sans Unicode';">会去该</span>url&nbsp;<span style="margin: 0px; padding: 0px; line-height: 1.5; font-family: 'Lucida Sans Unicode';">获取你的代码到当前</span>workspace</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 19.5px; font-size: 13px; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #fefef2;"><br style="margin: 0px; padding: 0px;" /></p><p style="margin-top: 10px; margin-bottom: 10px; margin-left: 120px; padding: 0px; line-height: 19.5px; font-size: 13px; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #fefef2;"><img src="http://images.cnitblog.com/blog/144196/201306/07114230-9420d95b9f914bd1885133e31db2f8c8.jpg" alt="" style="margin: 0px; padding: 0px; border: 0px;" /><br style="margin: 0px; padding: 0px;" /></p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 19.5px; font-size: 13px; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #fefef2;"><span style="margin: 0px; padding: 0px; line-height: 1.5; font-family: 'Lucida Sans Unicode';">如果要实现</span><span style="margin: 0px; padding: 0px; line-height: 1.5; font-size: 14px;">email</span><span style="margin: 0px; padding: 0px; line-height: 1.5; font-family: 'Lucida Sans Unicode';">的发送<span style="margin: 0px; padding: 0px; line-height: 1.5; font-family: 'Times New Roman', serif;">，</span></span></p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 19.5px; font-size: 13px; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #fefef2;"><span style="margin: 0px; padding: 0px; line-height: 1.5; font-family: 'Lucida Sans Unicode';">需要安装</span><span style="margin: 0px; padding: 0px; line-height: 1.5; font-size: 14px;">iis，&nbsp;</span><span style="margin: 0px; padding: 0px; line-height: 1.5; font-family: 'Lucida Sans Unicode';">配置</span><span style="margin: 0px; padding: 0px; line-height: 1.5; font-size: 14px;">smtp</span><span style="margin: 0px; padding: 0px; line-height: 1.5; font-family: 'Lucida Sans Unicode';">服务<span style="margin: 0px; padding: 0px; line-height: 1.5; font-family: 'Times New Roman', serif;">（</span>不熟悉的同学网上搜一搜吧<span style="margin: 0px; padding: 0px; line-height: 1.5; font-family: 'Times New Roman', serif;">）</span></span></p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 19.5px; font-size: 13px; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #fefef2;"><span style="margin: 0px; padding: 0px; line-height: 1.5; font-family: 'Lucida Sans Unicode';"><span style="margin: 0px; padding: 0px; line-height: 1.5; font-family: 'Times New Roman', serif;">当然如果有现成的smtp服务，直接在jenkins -config页面填写，包括端口（默认22）</span></span></p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 19.5px; font-size: 13px; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #fefef2;"><br style="margin: 0px; padding: 0px;" /></p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 19.5px; font-size: 13px; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #fefef2;"><span style="margin: 0px; padding: 0px; line-height: 1.5; font-family: 'Lucida Sans Unicode';">好啦<span style="margin: 0px; padding: 0px; line-height: 1.5; font-family: 'Times New Roman', serif;">，</span>等不及的话先点击<span style="margin: 0px; padding: 0px; line-height: 1.5; font-family: 'Times New Roman', serif;">&#8216;</span></span>Build Now&#8217;&nbsp;<span style="margin: 0px; padding: 0px; line-height: 1.5; font-family: 'Lucida Sans Unicode';">手动构建吧<span style="margin: 0px; padding: 0px; line-height: 1.5; font-family: 'Times New Roman', serif;">，</span></span></p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 19.5px; font-size: 13px; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #fefef2;"><strong style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; line-height: 1.5; font-family: 'Lucida Sans Unicode';">验证</span>jenkins</strong><span style="margin: 0px; padding: 0px; line-height: 1.5; font-family: 'Lucida Sans Unicode';"><strong style="margin: 0px; padding: 0px;">如何自动构建<span style="margin: 0px; padding: 0px; line-height: 1.5; font-family: 'Times New Roman', serif;">：</span></strong></span></p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 19.5px; font-size: 13px; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #fefef2;"><span style="margin: 0px; padding: 0px; line-height: 1.5; font-family: 'Lucida Sans Unicode';">&nbsp; &nbsp;修改下本地</span>git<span style="margin: 0px; padding: 0px; line-height: 1.5; font-family: 'Lucida Sans Unicode';">仓库的代码<span style="margin: 0px; padding: 0px; line-height: 1.5; font-family: 'Times New Roman', serif;">，</span></span>commit&nbsp;<span style="margin: 0px; padding: 0px; line-height: 1.5; font-family: 'Lucida Sans Unicode';">并</span>push&nbsp;<span style="margin: 0px; padding: 0px; line-height: 1.5; font-family: 'Lucida Sans Unicode';">到远程仓库<span style="margin: 0px; padding: 0px; line-height: 1.5; font-family: 'Times New Roman', serif;">，&nbsp;</span>等<span style="margin: 0px; padding: 0px; line-height: 1.5; font-family: 'Times New Roman', serif;">2</span>分钟的样子<span style="margin: 0px; padding: 0px; line-height: 1.5; font-family: 'Times New Roman', serif;">，</span></span>jenkins<span style="margin: 0px; padding: 0px; line-height: 1.5; font-family: 'Lucida Sans Unicode';">便会自动构建<span style="margin: 0px; padding: 0px; line-height: 1.5; font-family: 'Times New Roman', serif;">。（</span>由于上面设置了每<span style="margin: 0px; padding: 0px; line-height: 1.5; font-family: 'Times New Roman', serif;">2</span>分钟检查</span>git<span style="margin: 0px; padding: 0px; line-height: 1.5; font-family: 'Lucida Sans Unicode';">源码仓库<span style="margin: 0px; padding: 0px; line-height: 1.5; font-family: 'Times New Roman', serif;">，</span>如有</span>checkin<span style="margin: 0px; padding: 0px; line-height: 1.5; font-family: 'Lucida Sans Unicode';">就触发构建<span style="margin: 0px; padding: 0px; line-height: 1.5; font-family: 'Times New Roman', serif;">）</span></span></p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 19.5px; font-size: 13px; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #fefef2;"><br style="margin: 0px; padding: 0px;" /></p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 19.5px; font-size: 13px; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #fefef2;"><span style="margin: 0px; padding: 0px; line-height: 1.5; font-family: 'Lucida Sans Unicode';">在构建的控制台输出可查看构建的细节<span style="margin: 0px; padding: 0px; line-height: 1.5; font-family: 'Times New Roman', serif;">，</span>如果顺利的话<span style="margin: 0px; padding: 0px; line-height: 1.5; font-family: 'Times New Roman', serif;">，</span>如下</span></p><div><span style="margin: 0px; padding: 0px; line-height: 1.5; font-family: 'Lucida Sans Unicode';"><br /></span></div><img src ="http://www.blogjava.net/qileilove/aggbug/410242.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qileilove/" target="_blank">顺其自然EVO</a> 2014-02-24 11:49 <a href="http://www.blogjava.net/qileilove/articles/410242.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jenkins配置详解之高级项目选项</title><link>http://www.blogjava.net/qileilove/articles/410098.html</link><dc:creator>顺其自然EVO</dc:creator><author>顺其自然EVO</author><pubDate>Thu, 20 Feb 2014 06:26:00 GMT</pubDate><guid>http://www.blogjava.net/qileilove/articles/410098.html</guid><wfw:comment>http://www.blogjava.net/qileilove/comments/410098.html</wfw:comment><comments>http://www.blogjava.net/qileilove/articles/410098.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qileilove/comments/commentRss/410098.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qileilove/services/trackbacks/410098.html</trackback:ping><description><![CDATA[<br /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/gjxx3.jpg" width="1367" height="571" alt="" /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/gjxx2.jpg" width="1367" height="571" alt="" /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/gjxx3.jpg" width="1367" height="571" alt="" /><br /><img src ="http://www.blogjava.net/qileilove/aggbug/410098.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qileilove/" target="_blank">顺其自然EVO</a> 2014-02-20 14:26 <a href="http://www.blogjava.net/qileilove/articles/410098.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jenkins Credentials</title><link>http://www.blogjava.net/qileilove/articles/410053.html</link><dc:creator>顺其自然EVO</dc:creator><author>顺其自然EVO</author><pubDate>Wed, 19 Feb 2014 07:10:00 GMT</pubDate><guid>http://www.blogjava.net/qileilove/articles/410053.html</guid><wfw:comment>http://www.blogjava.net/qileilove/comments/410053.html</wfw:comment><comments>http://www.blogjava.net/qileilove/articles/410053.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qileilove/comments/commentRss/410053.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qileilove/services/trackbacks/410053.html</trackback:ping><description><![CDATA[<p style="line-height: 17.33333396911621px; margin: 10px 0px; padding: 0px; font-family: Helvetica, Arial, sans-serif; background-color: #ffffff;">This plugin allows you to store credentials in Jenkins.<br />The credentials plugin provides a standardized API for other plugins to store and retrieve different types of credentials. User visible features are:</p><ul style="line-height: 17.33333396911621px; font-family: Helvetica, Arial, sans-serif; background-color: #ffffff;"><li style="font-size: 10pt; line-height: 13pt; margin: 0px; padding: 0px;">A &#8220;Manage Credentials&#8221; screen on the &#8220;Manage Jenkins&#8221; screen allowing you to manage system and global credentials.</li><li style="font-size: 10pt; line-height: 13pt; margin: 0px; padding: 0px;">If you are using Jenkins security, when you go to &#8220;Users&#8221; / your username / &#8220;Configure&#8221; you would see the option to manage personal credentials.</li><li style="font-size: 10pt; line-height: 13pt; margin: 0px; padding: 0px;">Anywhere those credentials are needed, there is a drop down list of the appropriate available credentials, and you just select the appropriate one.</li><li style="font-size: 10pt; line-height: 13pt; margin: 0px; padding: 0px;">When the time comes to change the password, you just change it once.&nbsp;</li></ul><p style="line-height: 17.33333396911621px; margin: 10px 0px; padding: 0px; font-family: Helvetica, Arial, sans-serif; background-color: #ffffff;">And that is about it, from the end-user's perspective. A single point for managing each credential. Change it in one place and you are done.</p><p style="line-height: 17.33333396911621px; margin: 10px 0px; padding: 0px; font-family: Helvetica, Arial, sans-serif; background-color: #ffffff;">As of version 1.5, the plugin now supports categorising credentials into different "domains" in order to allow plugins to restrict the choice of credentials to only those that are appropriate.</p><p style="line-height: 17.33333396911621px; margin: 10px 0px; padding: 0px; font-family: Helvetica, Arial, sans-serif; background-color: #ffffff;">For example, you may use the same username with a different password on multiple services. e.g. Wile E Coyote may have an account with Acme Industries, Jenkins CI, etc. in each case using the same username but a different password.</p><p style="line-height: 17.33333396911621px; margin: 10px 0px; padding: 0px; font-family: Helvetica, Arial, sans-serif; background-color: #ffffff;">If you need to select the credentials to use when connecting to a service, it can be difficult to ensure that you select the correct one. Selecting the wrong one may mean that the incorrect password triggers a service lockout.</p><p style="line-height: 17.33333396911621px; margin: 10px 0px; padding: 0px; font-family: Helvetica, Arial, sans-serif; background-color: #ffffff;">Credential Domains are a solution to help with this problem.</p><p style="line-height: 17.33333396911621px; margin: 10px 0px; padding: 0px; font-family: Helvetica, Arial, sans-serif; background-color: #ffffff;">When a plugin is asking for a list of credentials, it can add some specifications about where and how the credential will be used. If we configure the following Credential Domain:&nbsp;<img src="https://wiki.jenkins-ci.org/download/attachments/59511751/Screen+Shot+2013-08-07+at+13.50.42.png?version=1&amp;modificationDate=1375880556000" style="border: 1px solid black;"  alt="" /><br />And we are trying to make an update to the Acme wiki (e.g.&nbsp;<strong><a href="https://wiki.acme.com/" rel="nofollow" style="color: #4b758b;">https://wiki.acme.com</a></strong>) then the plugin asking for credentials can say that it is looking for username/password credentials and it needs ones that support the&nbsp;<strong>https</strong>&nbsp;URI scheme, the hostname is&nbsp;<strong>wiki.acme.com</strong>&nbsp;and the port is&nbsp;<strong>443</strong>. The credentials plugin will compare each credential domain's specification against the requirements and exclude any which do not match. Thus the user would be presented with the appropriate and relevant set of credentials.</p><p style="line-height: 17.33333396911621px; margin: 10px 0px; padding: 0px; font-family: Helvetica, Arial, sans-serif; background-color: #ffffff;">When creating credential domains, it is important to note that domains are&nbsp;<strong>excluded</strong>&nbsp;based on requirements failing to match the specification. Thus if there is a specification for a specific URI scheme&nbsp;<strong>and</strong>&nbsp;the requirements do not detail a specific URI scheme then the credential domain is still considered to be a match. The logic is necessary to be this way in order to both allow existing plugins to retrieve credentials from within domains (even if they do not construct and supply a list of domain requirements) and also with the principle of allowing the user to be in control, i.e. the user can still select a credential if there is a possibility that the credential might apply, only where we know the credential is not appropriate do we exclude the domain.</p><h3><a name="CredentialsPlugin-" style="width: 20px; height: 20px; text-indent: 20px; background-image: url(http://www.blogjava.net/CuteSoft_Client/CuteEditor/Load.ashx?type=image&amp;file=anchor.gif); background-repeat: no-repeat no-repeat;"></a>Information for Plugin Developers</h3><p style="line-height: 17.33333396911621px; margin: 10px 0px; padding: 0px; font-family: Helvetica, Arial, sans-serif; background-color: #ffffff;">The credentials plugin provides two main extension points:</p><ul style="line-height: 17.33333396911621px; font-family: Helvetica, Arial, sans-serif; background-color: #ffffff;"><li style="font-size: 10pt; line-height: 13pt; margin: 0px; padding: 0px;">Credentials&nbsp;- a base class for all Credentials types managed by the credentials plugin. Most plugin authors will just want to subclass this type to define what they need to store in the credential type... better yet, if you can find an existing Credentials subclass that stores your credentials. &nbsp;So, for example, if somebody created a ssh-credentials plugin that just defines a SshCredentials class, then anyone needing ssh credentials could just depend on that... [Note that careful use of readResolve can allow this to be introduced after the fact]</li><li style="font-size: 10pt; line-height: 13pt; margin: 0px; padding: 0px;">CredentialsProvider&nbsp;- an extension point for something that can provide credentials. For example, the CloudBees Folders plugin uses this extension point to provide folder scoped credentials, so that the credentials are only available to jobs within the folder.</li></ul><p style="line-height: 17.33333396911621px; margin: 10px 0px; padding: 0px; font-family: Helvetica, Arial, sans-serif; background-color: #ffffff;">When you need to get back some credentials you just callCredentialsProvider.lookupCredentials(type,item,auth,domainRequirements)&nbsp;to retrieve the appropriate credentials.&nbsp;<br />The&nbsp;type&nbsp;parameter is the class of credentials you want to retrieve.&nbsp;<br />The&nbsp;item&nbsp;parameter is the job you want to retrieve the credentials for, but this could also be the Jenkins instance itself; e.g., if getting the email credentials when Jenkins is sending emails, if getting the ssh credentials for Jenkins to start a slave node with, etc.<br />The&nbsp;auth&nbsp;parameter is the authentication that is requesting the credentials. In general this will be ACL.SYSTEM but, for example, the version 2.0 of the CloudBees Deployer plugin adds a &#8220;Deploy Now&#8221; action which allows a user to use their own user-scoped credentials to deploy an already built web application to their own RUN servlet container instance (useful for testing older builds to see if you have a valid test case for that bug).<br />The domainRequirements parameter is the list of requirements against which domain specifications will be verified when retrieving credentials.<br /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/mc3.jpg" width="1367" height="571" alt="" /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/mc.jpg" width="1367" height="571" alt="" /><br /><br /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/mc3.jpg" width="1367" height="571" alt="" /><br /></p><img src ="http://www.blogjava.net/qileilove/aggbug/410053.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qileilove/" target="_blank">顺其自然EVO</a> 2014-02-19 15:10 <a href="http://www.blogjava.net/qileilove/articles/410053.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Jenkins实战演练之Linux节点任务配置</title><link>http://www.blogjava.net/qileilove/articles/409984.html</link><dc:creator>顺其自然EVO</dc:creator><author>顺其自然EVO</author><pubDate>Tue, 18 Feb 2014 06:09:00 GMT</pubDate><guid>http://www.blogjava.net/qileilove/articles/409984.html</guid><wfw:comment>http://www.blogjava.net/qileilove/comments/409984.html</wfw:comment><comments>http://www.blogjava.net/qileilove/articles/409984.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qileilove/comments/commentRss/409984.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qileilove/services/trackbacks/409984.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 现在我们已经搭建好了基本的Jenkins环境，在这一集里，我们说一说如何管理节点。&nbsp;进入&#8220;系统管理&#8221;中的&#8220;管理节点&#8221;。&nbsp;&nbsp;创建Windos系统的奴隶节点&nbsp;先创建一台安装了Win7系统的虚拟机，作为Jenkins构建的奴隶节点。比如我这台机器IP为172.16.12.81，用户名为user1，密码为123456。...&nbsp;&nbsp;<a href='http://www.blogjava.net/qileilove/articles/409984.html'>阅读全文</a><img src ="http://www.blogjava.net/qileilove/aggbug/409984.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qileilove/" target="_blank">顺其自然EVO</a> 2014-02-18 14:09 <a href="http://www.blogjava.net/qileilove/articles/409984.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用命令行方式管理你的Jenkins</title><link>http://www.blogjava.net/qileilove/articles/409947.html</link><dc:creator>顺其自然EVO</dc:creator><author>顺其自然EVO</author><pubDate>Mon, 17 Feb 2014 08:08:00 GMT</pubDate><guid>http://www.blogjava.net/qileilove/articles/409947.html</guid><wfw:comment>http://www.blogjava.net/qileilove/comments/409947.html</wfw:comment><comments>http://www.blogjava.net/qileilove/articles/409947.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qileilove/comments/commentRss/409947.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qileilove/services/trackbacks/409947.html</trackback:ping><description><![CDATA[<blockquote style="width: 660px; color: #4e6384; line-height: 23px; margin: 5px auto; padding-top: 10px; padding-bottom: 10px; clear: both; border-width: 1px; border-color: #cccccc; font-family: Verdana, 'Microsoft YaHei', 微软雅黑, Arial, sans-serif; font-size: 13px; background-color: #ffffff;"><p style="margin: 0px 0px 10px; padding: 0px; border: 0px; font-size: 13px; background-color: transparent; text-indent: 2em;"><span style="margin: 0px; padding: 0px; border: 0px; font-size: 13px; font-family: verdana, geneva; background-color: transparent; background-position: initial initial; background-repeat: initial initial;">Jenkins</span>保留了一套内嵌命令行，允许你通过<span style="margin: 0px; padding: 0px; border: 0px; font-size: 13px; font-family: verdana, geneva; background-color: transparent; background-position: initial initial; background-repeat: initial initial;">Shell</span>脚本方式访问<span style="margin: 0px; padding: 0px; border: 0px; font-size: 13px; font-family: verdana, geneva; background-color: transparent; background-position: initial initial; background-repeat: initial initial;">Jenkins</span>并进行管理，这就极大的方便了一些日常自动化任务，包括故障诊断等等。</p><p style="margin: 0px 0px 10px; padding: 0px; border: 0px; font-size: 13px; background-color: transparent; text-indent: 2em;">详细信息请参看官方<span style="margin: 0px; padding: 0px; border: 0px; font-size: 13px; font-family: verdana, geneva; background-color: transparent; background-position: initial initial; background-repeat: initial initial;">Wiki</span>：<span style="margin: 0px; padding: 0px; border: 0px; font-size: 13px; font-family: verdana, geneva; background-color: transparent; background-position: initial initial; background-repeat: initial initial;"><strong><a title="Jenkins+CLI" href="https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+CLI" target="_blank" style="text-decoration: none; color: #0196e3;">Jenkins-CLI</a></strong></span></p></blockquote><p style="margin: 0px 0px 10px; padding: 0px; border: 0px; font-size: 13px; font-family: Verdana, 'Microsoft YaHei', 微软雅黑, Arial, sans-serif; background-color: #ffffff; text-indent: 2em; line-height: 24.049999237060547px;">当然，如果你手头已经搭建了一台<span style="margin: 0px; padding: 0px; border: 0px; font-size: 13px; font-family: verdana, geneva; background-color: transparent; background-position: initial initial; background-repeat: initial initial;">Jenkins</span>服务器，那么你也可以访问你的<span style="margin: 0px; padding: 0px; border: 0px; font-size: 13px; font-family: verdana, geneva; background-color: transparent; background-position: initial initial; background-repeat: initial initial;">Jenkins</span>，然后通过<span style="margin: 0px; padding: 0px; border: 0px; font-size: 13px; font-family: verdana, geneva; background-color: transparent; color: #333300; background-position: initial initial; background-repeat: initial initial;"><strong>Jenkins - Manage Jenkins - Jenkins CLI</strong></span>页面查看相关帮助，如下图：<br /><br /></p><p style="margin: 0px 0px 10px; padding: 0px; border: 0px; font-size: 13px; font-family: Verdana, 'Microsoft YaHei', 微软雅黑, Arial, sans-serif; background-color: #ffffff; text-indent: 2em; line-height: 24.049999237060547px;"><img src="http://www.blogjava.net/images/blogjava_net/qileilove/cli1.jpg" width="1367" height="571" alt="" /><br /></p><p style="margin: 0px 0px 10px; padding: 0px; border: 0px; font-size: 13px; font-family: Verdana, 'Microsoft YaHei', 微软雅黑, Arial, sans-serif; background-color: #ffffff; text-indent: 2em; line-height: 24.049999237060547px;"><strong><span style="margin: 0px; padding: 0px; border: 0px; font-size: 13px; font-family: verdana, geneva; background-color: transparent; background-position: initial initial; background-repeat: initial initial;">Jenkins</span>的命令行方式：</strong></p><div style="margin: 0px auto; border: 1px solid #e8e8e8; font-family: 'Microsoft YaHei', 微软雅黑, Verdana, Tahoma, 'Lucida Grande', Arial, sans-serif; background-color: #fcfcfc; width: 693px; line-height: 24.049999237060547px;"><ol style="margin-left: 32px; padding: 2px; border-width: 0px; font-size: 12px; font-family: Verdana, 'Microsoft YaHei', 微软雅黑, Arial, sans-serif; background-color: transparent; color: #2b91af;"><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;"><span style="border-width: 0px; font-size: 12px; font-family: Verdana, 'Microsoft YaHei', 微软雅黑, Arial, sans-serif; color: #ff0000;">java&nbsp;</span><span style="border-width: 0px; font-size: 12px; font-family: Verdana, 'Microsoft YaHei', 微软雅黑, Arial, sans-serif; color: #0000ff;">-jar</span>&nbsp;<span style="border-width: 0px; font-size: 12px; font-family: Verdana, 'Microsoft YaHei', 微软雅黑, Arial, sans-serif; color: #800000;">jenkins-cli.jar</span>&nbsp;<span style="border-width: 0px; font-size: 12px; font-family: Verdana, 'Microsoft YaHei', 微软雅黑, Arial, sans-serif; color: #008000;">[-s&nbsp;JENKINS_URL]</span>&nbsp;<span style="border-width: 0px; font-size: 12px; font-family: Verdana, 'Microsoft YaHei', 微软雅黑, Arial, sans-serif; color: #800080;">command&nbsp;</span><span style="border-width: 0px; font-size: 12px; font-family: Verdana, 'Microsoft YaHei', 微软雅黑, Arial, sans-serif; color: #008000;">[options...]&nbsp;[arguments...]</span></span></li></ol></div><p style="margin: 0px 0px 10px; padding: 0px; border: 0px; font-size: 13px; font-family: Verdana, 'Microsoft YaHei', 微软雅黑, Arial, sans-serif; background-color: #ffffff; text-indent: 2em; line-height: 24.049999237060547px;"><strong>所有参数：</strong></p><div style="margin: 0px auto; border: 1px solid #e8e8e8; font-family: 'Microsoft YaHei', 微软雅黑, Verdana, Tahoma, 'Lucida Grande', Arial, sans-serif; background-color: #fcfcfc; width: 693px; line-height: 24.049999237060547px;"><ol style="margin-left: 32px; padding: 2px; border-width: 0px; font-size: 12px; font-family: Verdana, 'Microsoft YaHei', 微软雅黑, Arial, sans-serif; background-color: transparent; color: #2b91af;"><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; color: #666699;"><strong><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&lt;Available&nbsp;Commands&gt;</span></strong></span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">build: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Builds&nbsp;a&nbsp;job,&nbsp;and&nbsp;optionally&nbsp;waits&nbsp;until&nbsp;its&nbsp;completion. &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">cancel-quiet-down: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cancel&nbsp;the&nbsp;effect&nbsp;of&nbsp;the&nbsp;<span style="border-width: 0px; font-size: 12px; font-family: Verdana, 'Microsoft YaHei', 微软雅黑, Arial, sans-serif; color: #2a00ff;">"quiet-down"</span>&nbsp;command. &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">clear-queue: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Clears&nbsp;the&nbsp;build&nbsp;queue &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">connect-node: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Reconnect&nbsp;to&nbsp;a&nbsp;node &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">copy-job: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Copies&nbsp;a&nbsp;job. &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">create-job: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Creates&nbsp;a&nbsp;<span style="border-width: 0px; font-size: 12px; font-family: Verdana, 'Microsoft YaHei', 微软雅黑, Arial, sans-serif; color: #7f0055;">new</span>&nbsp;job&nbsp;by&nbsp;reading&nbsp;stdin&nbsp;as&nbsp;a&nbsp;configuration&nbsp;XML&nbsp;file. &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">delete-builds: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Deletes&nbsp;build&nbsp;record(s). &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">delete-job: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Deletes&nbsp;a&nbsp;job &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">delete-node: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Deletes&nbsp;a&nbsp;node &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">disable-job: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Disables&nbsp;a&nbsp;job &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">disconnect-node: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Disconnects&nbsp;from&nbsp;a&nbsp;node &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">dist-fork: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;forks&nbsp;a&nbsp;process&nbsp;on&nbsp;a&nbsp;remote&nbsp;machine&nbsp;and&nbsp;connects&nbsp;to&nbsp;its&nbsp;stdin/stdout &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">enable-job: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Enables&nbsp;a&nbsp;job &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">get-job: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Dumps&nbsp;the&nbsp;job&nbsp;definition&nbsp;XML&nbsp;to&nbsp;stdout &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">groovy: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Executes&nbsp;the&nbsp;specified&nbsp;Groovy&nbsp;script.&nbsp; &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">groovysh: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Runs&nbsp;an&nbsp;interactive&nbsp;groovy&nbsp;shell. &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">help: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Lists&nbsp;all&nbsp;the&nbsp;available&nbsp;commands. &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">install-plugin: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Installs&nbsp;a&nbsp;plugin&nbsp;either&nbsp;from&nbsp;a&nbsp;file,&nbsp;an&nbsp;URL,&nbsp;or&nbsp;from&nbsp;update&nbsp;center.&nbsp; &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">install-tool: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Performs&nbsp;automatic&nbsp;tool&nbsp;installation,&nbsp;and&nbsp;print&nbsp;its&nbsp;location&nbsp;to&nbsp;stdout.&nbsp;Can&nbsp;be&nbsp;only&nbsp;called&nbsp;from&nbsp;inside&nbsp;a&nbsp;build. &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">keep-build: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Mark&nbsp;the&nbsp;build&nbsp;to&nbsp;keep&nbsp;the&nbsp;build&nbsp;forever. &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">list-changes: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Dumps&nbsp;the&nbsp;changelog&nbsp;<span style="border-width: 0px; font-size: 12px; font-family: Verdana, 'Microsoft YaHei', 微软雅黑, Arial, sans-serif; color: #7f0055;">for</span>&nbsp;the&nbsp;specified&nbsp;build(s). &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">login: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Saves&nbsp;the&nbsp;current&nbsp;credential&nbsp;to&nbsp;allow&nbsp;future&nbsp;commands&nbsp;to&nbsp;run&nbsp;without&nbsp;explicit&nbsp;credential&nbsp;information. &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">logout: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Deletes&nbsp;the&nbsp;credential&nbsp;stored&nbsp;with&nbsp;the&nbsp;login&nbsp;command.&nbsp; &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">mail: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Reads&nbsp;stdin&nbsp;and&nbsp;sends&nbsp;that&nbsp;out&nbsp;as&nbsp;an&nbsp;e-mail. &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">offline-node: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Stop&nbsp;using&nbsp;a&nbsp;node&nbsp;<span style="border-width: 0px; font-size: 12px; font-family: Verdana, 'Microsoft YaHei', 微软雅黑, Arial, sans-serif; color: #7f0055;">for</span>&nbsp;performing&nbsp;builds&nbsp;temporarily,&nbsp;until&nbsp;the&nbsp;next&nbsp;<span style="border-width: 0px; font-size: 12px; font-family: Verdana, 'Microsoft YaHei', 微软雅黑, Arial, sans-serif; color: #2a00ff;">"online-node"</span>&nbsp;command. &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">online-node: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Resume&nbsp;using&nbsp;a&nbsp;node&nbsp;<span style="border-width: 0px; font-size: 12px; font-family: Verdana, 'Microsoft YaHei', 微软雅黑, Arial, sans-serif; color: #7f0055;">for</span>&nbsp;performing&nbsp;builds,&nbsp;to&nbsp;cancel&nbsp;out&nbsp;the&nbsp;earlier&nbsp;<span style="border-width: 0px; font-size: 12px; font-family: Verdana, 'Microsoft YaHei', 微软雅黑, Arial, sans-serif; color: #2a00ff;">"offline-node"</span>&nbsp;command. &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">quiet-down: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Quiet&nbsp;down&nbsp;Jenkins,&nbsp;in&nbsp;preparation&nbsp;<span style="border-width: 0px; font-size: 12px; font-family: Verdana, 'Microsoft YaHei', 微软雅黑, Arial, sans-serif; color: #7f0055;">for</span>&nbsp;a&nbsp;restart.&nbsp;Don't&nbsp;start&nbsp;any&nbsp;builds. &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">reload-configuration: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Discard&nbsp;all&nbsp;the&nbsp;loaded&nbsp;data&nbsp;in&nbsp;memory&nbsp;and&nbsp;reload&nbsp;everything&nbsp;from&nbsp;file&nbsp;system.&nbsp;Useful&nbsp;when&nbsp;you&nbsp;modified&nbsp;config&nbsp;files&nbsp;directly&nbsp;on&nbsp;disk. &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">restart: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Restart&nbsp;Jenkins &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">safe-restart: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Safely&nbsp;restart&nbsp;Jenkins &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">safe-shutdown: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Puts&nbsp;Jenkins&nbsp;into&nbsp;the&nbsp;quiet&nbsp;mode,&nbsp;wait&nbsp;<span style="border-width: 0px; font-size: 12px; font-family: Verdana, 'Microsoft YaHei', 微软雅黑, Arial, sans-serif; color: #7f0055;">for</span>&nbsp;existing&nbsp;builds&nbsp;to&nbsp;be&nbsp;completed,&nbsp;and&nbsp;then&nbsp;shut&nbsp;down&nbsp;Jenkins. &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">set-build-description: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sets&nbsp;the&nbsp;description&nbsp;of&nbsp;a&nbsp;build. &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">set-build-display-name: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sets&nbsp;the&nbsp;displayName&nbsp;of&nbsp;a&nbsp;build &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">set-build-result: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sets&nbsp;the&nbsp;result&nbsp;of&nbsp;the&nbsp;current&nbsp;build.&nbsp;Works&nbsp;only&nbsp;<span style="border-width: 0px; font-size: 12px; font-family: Verdana, 'Microsoft YaHei', 微软雅黑, Arial, sans-serif; color: #7f0055;">if</span>&nbsp;invoked&nbsp;from&nbsp;within&nbsp;a&nbsp;build. &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">shutdown: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Immediately&nbsp;shuts&nbsp;down&nbsp;Jenkins&nbsp;server &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">update-job: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Updates&nbsp;the&nbsp;job&nbsp;definition&nbsp;XML&nbsp;from&nbsp;stdin.&nbsp;The&nbsp;opposite&nbsp;of&nbsp;the&nbsp;get-job&nbsp;command &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">version: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Outputs&nbsp;the&nbsp;current&nbsp;version. &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">wait-node-offline: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Wait&nbsp;<span style="border-width: 0px; font-size: 12px; font-family: Verdana, 'Microsoft YaHei', 微软雅黑, Arial, sans-serif; color: #7f0055;">for</span>&nbsp;a&nbsp;node&nbsp;to&nbsp;become&nbsp;offline &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">wait-node-online: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Wait&nbsp;<span style="border-width: 0px; font-size: 12px; font-family: Verdana, 'Microsoft YaHei', 微软雅黑, Arial, sans-serif; color: #7f0055;">for</span>&nbsp;a&nbsp;node&nbsp;to&nbsp;become&nbsp;online &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">who-am-i: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Reports&nbsp;your&nbsp;credential&nbsp;and&nbsp;permissions &nbsp;</span></li></ol></div><img src ="http://www.blogjava.net/qileilove/aggbug/409947.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qileilove/" target="_blank">顺其自然EVO</a> 2014-02-17 16:08 <a href="http://www.blogjava.net/qileilove/articles/409947.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用命令行方式管理你的Jenkins</title><link>http://www.blogjava.net/qileilove/articles/409948.html</link><dc:creator>顺其自然EVO</dc:creator><author>顺其自然EVO</author><pubDate>Mon, 17 Feb 2014 08:08:00 GMT</pubDate><guid>http://www.blogjava.net/qileilove/articles/409948.html</guid><wfw:comment>http://www.blogjava.net/qileilove/comments/409948.html</wfw:comment><comments>http://www.blogjava.net/qileilove/articles/409948.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qileilove/comments/commentRss/409948.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qileilove/services/trackbacks/409948.html</trackback:ping><description><![CDATA[<blockquote style="width: 660px; color: #4e6384; line-height: 23px; margin: 5px auto; padding-top: 10px; padding-bottom: 10px; clear: both; border-width: 1px; border-color: #cccccc; font-family: Verdana, 'Microsoft YaHei', 微软雅黑, Arial, sans-serif; font-size: 13px; background-color: #ffffff;"><p style="margin: 0px 0px 10px; padding: 0px; border: 0px; font-size: 13px; background-color: transparent; text-indent: 2em;"><span style="margin: 0px; padding: 0px; border: 0px; font-size: 13px; font-family: verdana, geneva; background-color: transparent; background-position: initial initial; background-repeat: initial initial;">Jenkins</span>保留了一套内嵌命令行，允许你通过<span style="margin: 0px; padding: 0px; border: 0px; font-size: 13px; font-family: verdana, geneva; background-color: transparent; background-position: initial initial; background-repeat: initial initial;">Shell</span>脚本方式访问<span style="margin: 0px; padding: 0px; border: 0px; font-size: 13px; font-family: verdana, geneva; background-color: transparent; background-position: initial initial; background-repeat: initial initial;">Jenkins</span>并进行管理，这就极大的方便了一些日常自动化任务，包括故障诊断等等。</p><p style="margin: 0px 0px 10px; padding: 0px; border: 0px; font-size: 13px; background-color: transparent; text-indent: 2em;">详细信息请参看官方<span style="margin: 0px; padding: 0px; border: 0px; font-size: 13px; font-family: verdana, geneva; background-color: transparent; background-position: initial initial; background-repeat: initial initial;">Wiki</span>：<span style="margin: 0px; padding: 0px; border: 0px; font-size: 13px; font-family: verdana, geneva; background-color: transparent; background-position: initial initial; background-repeat: initial initial;"><strong><a title="Jenkins+CLI" href="https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+CLI" target="_blank" style="text-decoration: none; color: #0196e3;">Jenkins-CLI</a></strong></span></p></blockquote><p style="margin: 0px 0px 10px; padding: 0px; border: 0px; font-size: 13px; font-family: Verdana, 'Microsoft YaHei', 微软雅黑, Arial, sans-serif; background-color: #ffffff; text-indent: 2em; line-height: 24.049999237060547px;">当然，如果你手头已经搭建了一台<span style="margin: 0px; padding: 0px; border: 0px; font-size: 13px; font-family: verdana, geneva; background-color: transparent; background-position: initial initial; background-repeat: initial initial;">Jenkins</span>服务器，那么你也可以访问你的<span style="margin: 0px; padding: 0px; border: 0px; font-size: 13px; font-family: verdana, geneva; background-color: transparent; background-position: initial initial; background-repeat: initial initial;">Jenkins</span>，然后通过<span style="margin: 0px; padding: 0px; border: 0px; font-size: 13px; font-family: verdana, geneva; background-color: transparent; color: #333300; background-position: initial initial; background-repeat: initial initial;"><strong>Jenkins - Manage Jenkins - Jenkins CLI</strong></span>页面查看相关帮助，如下图：<br /><br /></p><p style="margin: 0px 0px 10px; padding: 0px; border: 0px; font-size: 13px; font-family: Verdana, 'Microsoft YaHei', 微软雅黑, Arial, sans-serif; background-color: #ffffff; text-indent: 2em; line-height: 24.049999237060547px;"><img src="http://www.blogjava.net/images/blogjava_net/qileilove/cli1.jpg" width="1367" height="571" alt="" /><br /></p><p style="margin: 0px 0px 10px; padding: 0px; border: 0px; font-size: 13px; font-family: Verdana, 'Microsoft YaHei', 微软雅黑, Arial, sans-serif; background-color: #ffffff; text-indent: 2em; line-height: 24.049999237060547px;"><strong><span style="margin: 0px; padding: 0px; border: 0px; font-size: 13px; font-family: verdana, geneva; background-color: transparent; background-position: initial initial; background-repeat: initial initial;">Jenkins</span>的命令行方式：</strong></p><div style="margin: 0px auto; border: 1px solid #e8e8e8; font-family: 'Microsoft YaHei', 微软雅黑, Verdana, Tahoma, 'Lucida Grande', Arial, sans-serif; background-color: #fcfcfc; width: 693px; line-height: 24.049999237060547px;"><ol style="margin-left: 32px; padding: 2px; border-width: 0px; font-size: 12px; font-family: Verdana, 'Microsoft YaHei', 微软雅黑, Arial, sans-serif; background-color: transparent; color: #2b91af;"><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;"><span style="border-width: 0px; font-size: 12px; font-family: Verdana, 'Microsoft YaHei', 微软雅黑, Arial, sans-serif; color: #ff0000;">java&nbsp;</span><span style="border-width: 0px; font-size: 12px; font-family: Verdana, 'Microsoft YaHei', 微软雅黑, Arial, sans-serif; color: #0000ff;">-jar</span>&nbsp;<span style="border-width: 0px; font-size: 12px; font-family: Verdana, 'Microsoft YaHei', 微软雅黑, Arial, sans-serif; color: #800000;">jenkins-cli.jar</span>&nbsp;<span style="border-width: 0px; font-size: 12px; font-family: Verdana, 'Microsoft YaHei', 微软雅黑, Arial, sans-serif; color: #008000;">[-s&nbsp;JENKINS_URL]</span>&nbsp;<span style="border-width: 0px; font-size: 12px; font-family: Verdana, 'Microsoft YaHei', 微软雅黑, Arial, sans-serif; color: #800080;">command&nbsp;</span><span style="border-width: 0px; font-size: 12px; font-family: Verdana, 'Microsoft YaHei', 微软雅黑, Arial, sans-serif; color: #008000;">[options...]&nbsp;[arguments...]</span></span></li></ol></div><p style="margin: 0px 0px 10px; padding: 0px; border: 0px; font-size: 13px; font-family: Verdana, 'Microsoft YaHei', 微软雅黑, Arial, sans-serif; background-color: #ffffff; text-indent: 2em; line-height: 24.049999237060547px;"><strong>所有参数：</strong></p><div style="margin: 0px auto; border: 1px solid #e8e8e8; font-family: 'Microsoft YaHei', 微软雅黑, Verdana, Tahoma, 'Lucida Grande', Arial, sans-serif; background-color: #fcfcfc; width: 693px; line-height: 24.049999237060547px;"><ol style="margin-left: 32px; padding: 2px; border-width: 0px; font-size: 12px; font-family: Verdana, 'Microsoft YaHei', 微软雅黑, Arial, sans-serif; background-color: transparent; color: #2b91af;"><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; color: #666699;"><strong><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&lt;Available&nbsp;Commands&gt;</span></strong></span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">build: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Builds&nbsp;a&nbsp;job,&nbsp;and&nbsp;optionally&nbsp;waits&nbsp;until&nbsp;its&nbsp;completion. &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">cancel-quiet-down: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cancel&nbsp;the&nbsp;effect&nbsp;of&nbsp;the&nbsp;<span style="border-width: 0px; font-size: 12px; font-family: Verdana, 'Microsoft YaHei', 微软雅黑, Arial, sans-serif; color: #2a00ff;">"quiet-down"</span>&nbsp;command. &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">clear-queue: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Clears&nbsp;the&nbsp;build&nbsp;queue &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">connect-node: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Reconnect&nbsp;to&nbsp;a&nbsp;node &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">copy-job: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Copies&nbsp;a&nbsp;job. &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">create-job: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Creates&nbsp;a&nbsp;<span style="border-width: 0px; font-size: 12px; font-family: Verdana, 'Microsoft YaHei', 微软雅黑, Arial, sans-serif; color: #7f0055;">new</span>&nbsp;job&nbsp;by&nbsp;reading&nbsp;stdin&nbsp;as&nbsp;a&nbsp;configuration&nbsp;XML&nbsp;file. &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">delete-builds: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Deletes&nbsp;build&nbsp;record(s). &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">delete-job: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Deletes&nbsp;a&nbsp;job &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">delete-node: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Deletes&nbsp;a&nbsp;node &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">disable-job: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Disables&nbsp;a&nbsp;job &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">disconnect-node: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Disconnects&nbsp;from&nbsp;a&nbsp;node &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">dist-fork: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;forks&nbsp;a&nbsp;process&nbsp;on&nbsp;a&nbsp;remote&nbsp;machine&nbsp;and&nbsp;connects&nbsp;to&nbsp;its&nbsp;stdin/stdout &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">enable-job: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Enables&nbsp;a&nbsp;job &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">get-job: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Dumps&nbsp;the&nbsp;job&nbsp;definition&nbsp;XML&nbsp;to&nbsp;stdout &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">groovy: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Executes&nbsp;the&nbsp;specified&nbsp;Groovy&nbsp;script.&nbsp; &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">groovysh: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Runs&nbsp;an&nbsp;interactive&nbsp;groovy&nbsp;shell. &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">help: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Lists&nbsp;all&nbsp;the&nbsp;available&nbsp;commands. &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">install-plugin: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Installs&nbsp;a&nbsp;plugin&nbsp;either&nbsp;from&nbsp;a&nbsp;file,&nbsp;an&nbsp;URL,&nbsp;or&nbsp;from&nbsp;update&nbsp;center.&nbsp; &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">install-tool: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Performs&nbsp;automatic&nbsp;tool&nbsp;installation,&nbsp;and&nbsp;print&nbsp;its&nbsp;location&nbsp;to&nbsp;stdout.&nbsp;Can&nbsp;be&nbsp;only&nbsp;called&nbsp;from&nbsp;inside&nbsp;a&nbsp;build. &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">keep-build: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Mark&nbsp;the&nbsp;build&nbsp;to&nbsp;keep&nbsp;the&nbsp;build&nbsp;forever. &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">list-changes: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Dumps&nbsp;the&nbsp;changelog&nbsp;<span style="border-width: 0px; font-size: 12px; font-family: Verdana, 'Microsoft YaHei', 微软雅黑, Arial, sans-serif; color: #7f0055;">for</span>&nbsp;the&nbsp;specified&nbsp;build(s). &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">login: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Saves&nbsp;the&nbsp;current&nbsp;credential&nbsp;to&nbsp;allow&nbsp;future&nbsp;commands&nbsp;to&nbsp;run&nbsp;without&nbsp;explicit&nbsp;credential&nbsp;information. &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">logout: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Deletes&nbsp;the&nbsp;credential&nbsp;stored&nbsp;with&nbsp;the&nbsp;login&nbsp;command.&nbsp; &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">mail: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Reads&nbsp;stdin&nbsp;and&nbsp;sends&nbsp;that&nbsp;out&nbsp;as&nbsp;an&nbsp;e-mail. &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">offline-node: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Stop&nbsp;using&nbsp;a&nbsp;node&nbsp;<span style="border-width: 0px; font-size: 12px; font-family: Verdana, 'Microsoft YaHei', 微软雅黑, Arial, sans-serif; color: #7f0055;">for</span>&nbsp;performing&nbsp;builds&nbsp;temporarily,&nbsp;until&nbsp;the&nbsp;next&nbsp;<span style="border-width: 0px; font-size: 12px; font-family: Verdana, 'Microsoft YaHei', 微软雅黑, Arial, sans-serif; color: #2a00ff;">"online-node"</span>&nbsp;command. &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">online-node: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Resume&nbsp;using&nbsp;a&nbsp;node&nbsp;<span style="border-width: 0px; font-size: 12px; font-family: Verdana, 'Microsoft YaHei', 微软雅黑, Arial, sans-serif; color: #7f0055;">for</span>&nbsp;performing&nbsp;builds,&nbsp;to&nbsp;cancel&nbsp;out&nbsp;the&nbsp;earlier&nbsp;<span style="border-width: 0px; font-size: 12px; font-family: Verdana, 'Microsoft YaHei', 微软雅黑, Arial, sans-serif; color: #2a00ff;">"offline-node"</span>&nbsp;command. &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">quiet-down: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Quiet&nbsp;down&nbsp;Jenkins,&nbsp;in&nbsp;preparation&nbsp;<span style="border-width: 0px; font-size: 12px; font-family: Verdana, 'Microsoft YaHei', 微软雅黑, Arial, sans-serif; color: #7f0055;">for</span>&nbsp;a&nbsp;restart.&nbsp;Don't&nbsp;start&nbsp;any&nbsp;builds. &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">reload-configuration: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Discard&nbsp;all&nbsp;the&nbsp;loaded&nbsp;data&nbsp;in&nbsp;memory&nbsp;and&nbsp;reload&nbsp;everything&nbsp;from&nbsp;file&nbsp;system.&nbsp;Useful&nbsp;when&nbsp;you&nbsp;modified&nbsp;config&nbsp;files&nbsp;directly&nbsp;on&nbsp;disk. &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">restart: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Restart&nbsp;Jenkins &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">safe-restart: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Safely&nbsp;restart&nbsp;Jenkins &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">safe-shutdown: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Puts&nbsp;Jenkins&nbsp;into&nbsp;the&nbsp;quiet&nbsp;mode,&nbsp;wait&nbsp;<span style="border-width: 0px; font-size: 12px; font-family: Verdana, 'Microsoft YaHei', 微软雅黑, Arial, sans-serif; color: #7f0055;">for</span>&nbsp;existing&nbsp;builds&nbsp;to&nbsp;be&nbsp;completed,&nbsp;and&nbsp;then&nbsp;shut&nbsp;down&nbsp;Jenkins. &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">set-build-description: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sets&nbsp;the&nbsp;description&nbsp;of&nbsp;a&nbsp;build. &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">set-build-display-name: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sets&nbsp;the&nbsp;displayName&nbsp;of&nbsp;a&nbsp;build &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">set-build-result: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sets&nbsp;the&nbsp;result&nbsp;of&nbsp;the&nbsp;current&nbsp;build.&nbsp;Works&nbsp;only&nbsp;<span style="border-width: 0px; font-size: 12px; font-family: Verdana, 'Microsoft YaHei', 微软雅黑, Arial, sans-serif; color: #7f0055;">if</span>&nbsp;invoked&nbsp;from&nbsp;within&nbsp;a&nbsp;build. &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">shutdown: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Immediately&nbsp;shuts&nbsp;down&nbsp;Jenkins&nbsp;server &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">update-job: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Updates&nbsp;the&nbsp;job&nbsp;definition&nbsp;XML&nbsp;from&nbsp;stdin.&nbsp;The&nbsp;opposite&nbsp;of&nbsp;the&nbsp;get-job&nbsp;command &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">version: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Outputs&nbsp;the&nbsp;current&nbsp;version. &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">wait-node-offline: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Wait&nbsp;<span style="border-width: 0px; font-size: 12px; font-family: Verdana, 'Microsoft YaHei', 微软雅黑, Arial, sans-serif; color: #7f0055;">for</span>&nbsp;a&nbsp;node&nbsp;to&nbsp;become&nbsp;offline &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">wait-node-online: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Wait&nbsp;<span style="border-width: 0px; font-size: 12px; font-family: Verdana, 'Microsoft YaHei', 微软雅黑, Arial, sans-serif; color: #7f0055;">for</span>&nbsp;a&nbsp;node&nbsp;to&nbsp;become&nbsp;online &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">who-am-i: &nbsp;&nbsp;</span></li><li style="border-left-width: 1px; border-left-color: #d1d7dc; line-height: 18px;"><span style="border-width: 0px; font-size: 12px; font-family: verdana, geneva;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Reports&nbsp;your&nbsp;credential&nbsp;and&nbsp;permissions &nbsp;</span></li></ol></div><img src ="http://www.blogjava.net/qileilove/aggbug/409948.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qileilove/" target="_blank">顺其自然EVO</a> 2014-02-17 16:08 <a href="http://www.blogjava.net/qileilove/articles/409948.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jenkins配置详解之系统属性</title><link>http://www.blogjava.net/qileilove/articles/409870.html</link><dc:creator>顺其自然EVO</dc:creator><author>顺其自然EVO</author><pubDate>Fri, 14 Feb 2014 09:14:00 GMT</pubDate><guid>http://www.blogjava.net/qileilove/articles/409870.html</guid><wfw:comment>http://www.blogjava.net/qileilove/comments/409870.html</wfw:comment><comments>http://www.blogjava.net/qileilove/articles/409870.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qileilove/comments/commentRss/409870.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qileilove/services/trackbacks/409870.html</trackback:ping><description><![CDATA[<br /><br />这里面显示着jenkins和系统的一些配置信息<br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/qwe.jpg" width="1367" height="651" alt="" /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/qwe1.jpg" width="1367" height="651" alt="" /><br /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/qwe2.jpg" width="1367" height="651" alt="" /><br /><br /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/qwe4.jpg" width="1367" height="651" alt="" /><br /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/qwe5.jpg" width="1367" height="651" alt="" /><br /><br /><img src ="http://www.blogjava.net/qileilove/aggbug/409870.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qileilove/" target="_blank">顺其自然EVO</a> 2014-02-14 17:14 <a href="http://www.blogjava.net/qileilove/articles/409870.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jenkins之插件管理</title><link>http://www.blogjava.net/qileilove/articles/409723.html</link><dc:creator>顺其自然EVO</dc:creator><author>顺其自然EVO</author><pubDate>Tue, 11 Feb 2014 06:51:00 GMT</pubDate><guid>http://www.blogjava.net/qileilove/articles/409723.html</guid><wfw:comment>http://www.blogjava.net/qileilove/comments/409723.html</wfw:comment><comments>http://www.blogjava.net/qileilove/articles/409723.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qileilove/comments/commentRss/409723.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qileilove/services/trackbacks/409723.html</trackback:ping><description><![CDATA[<img src="http://www.blogjava.net/images/blogjava_net/qileilove/cj.jpg" width="1367" height="571" alt="" /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/cj1.jpg" width="1367" height="571" alt="" /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/cj2.jpg" width="1367" height="571" alt="" /><br /><br /><br /><br /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/cj2.jpg" width="1367" height="571" alt="" /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/cj3.jpg" width="1367" height="571" alt="" /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/cj4.jpg" width="1367" height="571" alt="" /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/cj5.jpg" width="1366" height="571" alt="" /><br /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/cj6.jpg" width="1367" height="571" alt="" /><br /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/cj7.jpg" width="1367" height="571" alt="" /><img src ="http://www.blogjava.net/qileilove/aggbug/409723.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qileilove/" target="_blank">顺其自然EVO</a> 2014-02-11 14:51 <a href="http://www.blogjava.net/qileilove/articles/409723.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jenkins配置详解（3）Configure Global Security</title><link>http://www.blogjava.net/qileilove/articles/409662.html</link><dc:creator>顺其自然EVO</dc:creator><author>顺其自然EVO</author><pubDate>Mon, 10 Feb 2014 05:56:00 GMT</pubDate><guid>http://www.blogjava.net/qileilove/articles/409662.html</guid><wfw:comment>http://www.blogjava.net/qileilove/comments/409662.html</wfw:comment><comments>http://www.blogjava.net/qileilove/articles/409662.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qileilove/comments/commentRss/409662.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qileilove/services/trackbacks/409662.html</trackback:ping><description><![CDATA[今天我们来看看 jenkins 全局安全配置<br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/qe.jpg" width="1318" height="607" alt="" /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/qa1.jpg" width="1367" height="571" alt="" /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/qa1.jpg" width="1367" height="571" alt="" /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/qa2.jpg" width="1367" height="571" alt="" /><br /><br /><br /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/qa3.jpg" width="1367" height="571" alt="" /><br /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/qa4.jpg" width="1367" height="571" alt="" /><br /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/qa5.jpg" width="1367" height="571" alt="" /><br /><br /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/qa5.jpg" width="1367" height="571" alt="" /><br /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/qa6.jpg" width="1367" height="571" alt="" /><br /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/qa7.jpg" width="1367" height="571" alt="" /><br /><br /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/qa8.jpg" width="1367" height="571" alt="" /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/qa9.jpg" width="1367" height="571" alt="" /><img src ="http://www.blogjava.net/qileilove/aggbug/409662.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qileilove/" target="_blank">顺其自然EVO</a> 2014-02-10 13:56 <a href="http://www.blogjava.net/qileilove/articles/409662.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jenkins配置详解（2）---jenkins系统配置 </title><link>http://www.blogjava.net/qileilove/articles/409636.html</link><dc:creator>顺其自然EVO</dc:creator><author>顺其自然EVO</author><pubDate>Sun, 09 Feb 2014 07:52:00 GMT</pubDate><guid>http://www.blogjava.net/qileilove/articles/409636.html</guid><wfw:comment>http://www.blogjava.net/qileilove/comments/409636.html</wfw:comment><comments>http://www.blogjava.net/qileilove/articles/409636.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qileilove/comments/commentRss/409636.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qileilove/services/trackbacks/409636.html</trackback:ping><description><![CDATA[<div>
<img src="http://www.blogjava.net/images/blogjava_net/qileilove/qe.jpg" width="1318" height="607" alt="" /><br /><br />点击进入系统设置<br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/qe2.jpg" width="1318" height="607" alt="" /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/QE4.jpg" width="1318" height="607" alt="" /><br /><br /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/qe5.jpg" width="1318" height="607" alt="" /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/qe7.jpg" width="1318" height="607" alt="" /><br /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/qe8.jpg" width="1318" height="607" alt="" /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/qe9.jpg" width="1318" height="607" alt="" /><br /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/qe11.jpg" width="1318" height="607" alt="" /><br /><br /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/qe12.jpg" width="1318" height="607" alt="" /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/QE13.jpg" width="1318" height="607" alt="" /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/qe15.jpg" width="1318" height="607" alt="" /><br /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/qe4.png" width="1318" height="607" alt="" /></div><img src ="http://www.blogjava.net/qileilove/aggbug/409636.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qileilove/" target="_blank">顺其自然EVO</a> 2014-02-09 15:52 <a href="http://www.blogjava.net/qileilove/articles/409636.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jenkins详细讲解之首页</title><link>http://www.blogjava.net/qileilove/articles/409577.html</link><dc:creator>顺其自然EVO</dc:creator><author>顺其自然EVO</author><pubDate>Fri, 07 Feb 2014 07:03:00 GMT</pubDate><guid>http://www.blogjava.net/qileilove/articles/409577.html</guid><wfw:comment>http://www.blogjava.net/qileilove/comments/409577.html</wfw:comment><comments>http://www.blogjava.net/qileilove/articles/409577.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qileilove/comments/commentRss/409577.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qileilove/services/trackbacks/409577.html</trackback:ping><description><![CDATA[<div style="display: inline-block;"><div class="postTitle" style="font-size: 14.7px; font-weight: bold; margin-bottom: 10px; color: #4b4b4b; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; line-height: 20px;"><a id="viewpost1_TitleUrl" class="postTitle2" href="http://www.blogjava.net/qileilove/archive/2014/02/07/409576.html" style="text-decoration: none; color: #1a8bc8;">jenkins详细讲解之首页</a></div><img src="http://www.blogjava.net/images/blogjava_net/qileilove/weweqewq.jpg" width="1280" height="907" alt="" style="border: 0px; color: #4b4b4b; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13.333333969116211px; line-height: 20px;" /><br style="color: #4b4b4b; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13.333333969116211px; line-height: 20px;" /><br style="color: #4b4b4b; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13.333333969116211px; line-height: 20px;" /><span style="color: #4b4b4b; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13.333333969116211px; line-height: 20px; background-color: #ffffff;">如图我们可以看到首页很直接明了的向我们展示了功能菜单和job的状态栏 例如 每个job 成功或失败 。</span><br style="color: #4b4b4b; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13.333333969116211px; line-height: 20px;" /><br style="color: #4b4b4b; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13.333333969116211px; line-height: 20px;" /><span style="color: #4b4b4b; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13.333333969116211px; line-height: 20px; background-color: #ffffff;">首先新建job</span><br style="color: #4b4b4b; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13.333333969116211px; line-height: 20px;" /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/WE1.jpg" width="1273" height="526" alt="" style="border: 0px; color: #4b4b4b; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13.333333969116211px; line-height: 20px;" /><br style="color: #4b4b4b; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13.333333969116211px; line-height: 20px;" /><span style="color: #4b4b4b; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13.333333969116211px; line-height: 20px; background-color: #ffffff;">点击进入</span><br style="color: #4b4b4b; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13.333333969116211px; line-height: 20px;" /><span style="color: #4b4b4b; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13.333333969116211px; line-height: 20px; background-color: #ffffff;">如图 我们构建一个 自由风格的 JOB</span><br style="color: #4b4b4b; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13.333333969116211px; line-height: 20px;" /><br style="color: #4b4b4b; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13.333333969116211px; line-height: 20px;" /><br style="color: #4b4b4b; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13.333333969116211px; line-height: 20px;" /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/we2.jpg" width="1276" height="474" alt="" style="border: 0px; color: #4b4b4b; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13.333333969116211px; line-height: 20px;" /><br style="color: #4b4b4b; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13.333333969116211px; line-height: 20px;" /><br style="color: #4b4b4b; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13.333333969116211px; line-height: 20px;" /><br style="color: #4b4b4b; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13.333333969116211px; line-height: 20px;" /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/we3.jpg" alt="" style="border: 0px; color: #4b4b4b; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13.333333969116211px; line-height: 20px;" /><br style="color: #4b4b4b; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13.333333969116211px; line-height: 20px;" /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/we4.jpg" width="1280" height="864" alt="" style="border: 0px; color: #4b4b4b; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13.333333969116211px; line-height: 20px;" /><br style="color: #4b4b4b; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13.333333969116211px; line-height: 20px;" /><img src="http://www.blogjava.net/images/blogjava_net/qileilove/we5.jpg" width="1264" height="555" alt="" style="border: 0px; color: #4b4b4b; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13.333333969116211px; line-height: 20px;" /><br style="color: #4b4b4b; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13.333333969116211px; line-height: 20px;" /><span style="color: #4b4b4b; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13.333333969116211px; line-height: 20px; background-color: #ffffff;">我们可以看到当我们创建完JOB后 就进入了配置页面，里面有项目的名称，描述丢弃构建的策略等选项，以及版本控制功能的集成，构建触发器的配置 构建动作 和构建后的操作 等等，以后我们会用实战演示！下来让我们在看看其他类型的JOB，例如构建一个maven的项目 创建后 进入配置页面，</span><br style="color: #4b4b4b; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13.333333969116211px; line-height: 20px;" /><div style="color: #4b4b4b; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13.333333969116211px; line-height: 20px; position: absolute; width: 104px; height: 104px;">在这里输入文本</div><br style="color: #4b4b4b; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13.333333969116211px; line-height: 20px;" /><div style="color: #4b4b4b; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13.333333969116211px; line-height: 20px;"></div><img src="http://www.blogjava.net/images/blogjava_net/qileilove/we6.jpg" width="1280" height="827" alt="" style="border: 0px; color: #4b4b4b; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13.333333969116211px; line-height: 20px;" /><br style="color: #4b4b4b; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13.333333969116211px; line-height: 20px;" /><br style="color: #4b4b4b; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13.333333969116211px; line-height: 20px;" /><span style="color: #4b4b4b; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13.333333969116211px; line-height: 20px; background-color: #ffffff;">我们可以看到这是一个关于maven的项目的定制JOB 很方便~</span><br style="color: #4b4b4b; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13.333333969116211px; line-height: 20px;" /><br style="color: #4b4b4b; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13.333333969116211px; line-height: 20px;" /><span style="color: #4b4b4b; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13.333333969116211px; line-height: 20px; background-color: #ffffff;">下来我们看看&nbsp;</span><table width="100%" style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;"><tbody><tr><td colspan="3" style="font-size: 12px; color: #454545; word-wrap: break-word; line-height: 15.555556297302246px;"><label><strong>建一个多配置项目</strong></label></td></tr><tr><td style="font-size: 12px; color: #454545; word-wrap: break-word; line-height: 15.555556297302246px;">&nbsp;</td><td style="font-size: 12px; color: #454545; word-wrap: break-word; line-height: 15.555556297302246px;"></td><td style="font-size: 12px; color: #454545; word-wrap: break-word; line-height: 15.555556297302246px;">适用于多配置项目,例如多环境测试,平台指定构建,等等.</td></tr></tbody></table><img src="http://www.blogjava.net/images/blogjava_net/qileilove/we7.jpg" width="1280" height="827" alt="" style="border: 0px; color: #4b4b4b; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13.333333969116211px; line-height: 20px;" /><br style="color: #4b4b4b; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13.333333969116211px; line-height: 20px;" /><br style="color: #4b4b4b; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13.333333969116211px; line-height: 20px;" /><span style="color: #4b4b4b; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13.333333969116211px; line-height: 20px; background-color: #ffffff;">我们可以看到</span><span style="color: #4b4b4b; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; line-height: 20px; font-size: 14px;">Advanced Project Options以及</span><span style="color: #4b4b4b; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; line-height: 20px; font-size: 14px;">Configuration Matrix 我们可以通过配置不同的节点来实现不同环境下集成<br /><br /></span><span style="color: #4b4b4b; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; line-height: 20px; font-size: 14px;">下来我们看看<br /></span><table width="100%" style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;"><tbody><tr><td colspan="3" style="font-size: 12px; color: #454545; word-wrap: break-word; line-height: 15.555556297302246px;"><label class="attach-previous"><strong>监控一个外部的任务</strong></label></td></tr><tr><td class="setting-leftspace" style="font-size: 12px; color: #454545; word-wrap: break-word; line-height: 15.555556297302246px;">&nbsp;</td><td class="setting-name" style="font-size: 12px; color: #454545; word-wrap: break-word; line-height: 15.555556297302246px;"></td><td class="setting-main" style="font-size: 12px; color: #454545; word-wrap: break-word; line-height: 15.555556297302246px;"><st:set value="hudson.model.ExternalJob$DescriptorImpl@1c3b31f" var="instance" xmlns:st="jelly:stapler"></st:set><div>这个类型的任务允许你记录执行在外部Jenkins的任务, 任务甚至运行在远程机器上.这可以让Jenkins作为你所有自动构建系统的控制面板.参阅&nbsp;<a href="http://wiki.jenkins-ci.org/display/JENKINS/Monitoring+external+jobs" style="color: #1a8bc8; text-decoration: none;">这个文档查看详细内容</a>.</div></td></tr></tbody></table><span style="color: #4b4b4b; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; line-height: 20px; font-size: 14px;"><br /></span><img src="http://www.blogjava.net/images/blogjava_net/qileilove/we8.jpg" width="1280" height="827" alt="" style="border: 0px; color: #4b4b4b; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13.333333969116211px; line-height: 20px;" /><br style="color: #4b4b4b; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13.333333969116211px; line-height: 20px;" /><br style="color: #4b4b4b; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13.333333969116211px; line-height: 20px;" /><br style="color: #4b4b4b; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13.333333969116211px; line-height: 20px;" /><label style="color: #4b4b4b; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13.333333969116211px; line-height: 20px;"><strong>监控一个外部的任务 就是复制现有的一个项目~ ok 完毕 明天再来了解别的</strong></label></div><div><span style="line-height: 20px;"><strong><br /></strong></span> </div><img src ="http://www.blogjava.net/qileilove/aggbug/409577.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qileilove/" target="_blank">顺其自然EVO</a> 2014-02-07 15:03 <a href="http://www.blogjava.net/qileilove/articles/409577.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Jenkins(二) 安装、新建Jobs与删除及SVN配置</title><link>http://www.blogjava.net/qileilove/articles/409433.html</link><dc:creator>顺其自然EVO</dc:creator><author>顺其自然EVO</author><pubDate>Wed, 29 Jan 2014 08:01:00 GMT</pubDate><guid>http://www.blogjava.net/qileilove/articles/409433.html</guid><wfw:comment>http://www.blogjava.net/qileilove/comments/409433.html</wfw:comment><comments>http://www.blogjava.net/qileilove/articles/409433.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qileilove/comments/commentRss/409433.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qileilove/services/trackbacks/409433.html</trackback:ping><description><![CDATA[<p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="color: #000000;">官网首页就提供了windows版本的Jenkins安装包。可以自己下载一个用于学习。安装后自动打开http://localhost:8080，就可以看见Jenkins的界面。</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="color: #000000;">要运行Jenkins的其它配置：<br /></span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="color: #000000;">1，Jenkins是java程序，因此需要安装JDK。<br /></span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="color: #000000;">2，同时运行job需要提供repository，也就是存放Jenkins定期poll源代码的地方。可以去github免费注册一个。</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="color: #000000;">3，如果想在Jenkins中使用ant，maven等，则还需要单独安装。但不是必须的。<br /></span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><strong><span style="color: #6633ff;"><br /></span></strong></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><strong><span style="color: #6633ff;">启动Jenkins</span></strong><br /></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">Jenkins天生支持unix-like system。</p><ul style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><li>直接运行<br /></li></ul><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">好吧，Jenkins是一个java程序，所以要运行它，只需要：</p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">$ java -jar jenkins.war</p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">我们也可以使用nohup命令，让Jenkins在后台运行。</p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">之后打开URL<span style="font-family: SimSun;">&nbsp;http://</span><span style="font-family: SimSun; color: green;">myServer</span><span style="font-family: SimSun;">:8080 就可以方便的操作Jenkins了</span><tt><strong><br /></strong></tt></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">官网给了一个sh的例子，用于启动Jenkins。可以参考一下。</p><ul style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><li>在Servlet container中运行</li></ul><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">Alternatively, if you have a servlet container that supports Servlet 2.4/JSP 2.0, such as Glassfish v2, Tomcat 5 (or any later versions), then you can run them as services, and deploy<tt>jenkins.war</tt>&nbsp;as you would any other war file.</p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">For example,<br />you could simply place the jenkins.war file in Tomcat&#8217;s webapps directory.&nbsp; 此时使用的URL默认就变成：</p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">http://localhost:8080/jenkins<br /></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><br /></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">同时Jenkins提供一些默认不会启动的特殊的功能，参考下面的link来enable它们。<br /></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">https://wiki.jenkins-ci.org/display/JENKINS/Features+controlled+by+system+properties<br /></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><br /></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><strong><span style="color: #3366ff;">Jenkins的目录结构</span></strong><br /></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">和CruiseControler一样，Jenkins需要一个目录来存储相关文件：JENKINS_HOME。默认为&nbsp;<tt>~/.jenkins</tt>。即为user的home目录下的一个隐藏目录。我们也可以更改JENKINS_HOME，指向我们希望的地方。</p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">(注意因为是隐藏目录，所以需要使用ls -al 才能看到)<br /></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="color: #009900;">JENKINS_HOME<br />&nbsp;+- config.xml&nbsp;&nbsp;&nbsp;&nbsp; (jenkins root configuration)<br />&nbsp;+- *.xml&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (other site-wide configuration files)<br />&nbsp;+- userContent&nbsp;&nbsp;&nbsp; (files in this directory will be served under your http://server/userContent/)<br />&nbsp;+- fingerprints&nbsp;&nbsp; (stores fingerprint records)<br />&nbsp;+- plugins&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (stores plugins)<br />&nbsp;+- jobs<br />&nbsp;&nbsp;&nbsp;&nbsp; +- [JOBNAME]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (sub directory for each job)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +- config.xml&nbsp;&nbsp;&nbsp;&nbsp; (job configuration file)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +- workspace&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (working directory for the version control system)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +- latest&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (symbolic link to the last successful build)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +- builds<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +- [BUILD_ID]&nbsp;&nbsp;&nbsp;&nbsp; (for each build)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +- build.xml&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (build result summary)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +- log&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (log file)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +- changelog.xml&nbsp; (change log)</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">如果有权限管理，则在HOME目录下还会有users目录。<br /></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">从目录结构来看，和CruiseController非常相似。其中config.xml是Jenkins重要的配置文件。我们都知道Jenkins用于monitor多个build，而jobs这个目录无疑就是存储每个build相关信息的地方。</p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">总的来说，Jenkins目录结构非常直白，简洁。<br /></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><br /></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="color: #009900;"><strong><span style="color: #3366ff;">备份和恢复</span></strong></span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="color: #000000;">备份和恢复非常简单，就是简单的copy Jenkins的目录就好了：</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="color: #009900;"><span style="color: #000000;">All the settings, build logs, artifact archives are stored under the JENKINS_HOME directory. Simply archive this directory to make a back up. Similarly, restoring the data is just replacing the contents of the JENKINS_HOME directory from a back up.</span><br /></span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><br /></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="color: #3366ff;"><strong>移动/拷贝/重命名 job</strong></span><br /><br />由于每个jobs都有自己单独的目录，我们可以很容易的：<br /><br />&nbsp;&nbsp;&nbsp; 1，move a job from one installation of Jenkins to another by simply copying the corresponding job directory.<br />&nbsp;&nbsp; ,2，make a copy of an existing job by making a clone of a job directory by a different name.<br />&nbsp;&nbsp;&nbsp; 3，rename an existing job by renaming a directory.</p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">修改后执行下面的命令刷新：<br /></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">http://[jenkins-server]/[command]&nbsp;<br /></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">在这里[command]可以是：exit 退出，restart 重启， reload 重载。<br /></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><br /></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="color: #3366ff;"><strong>创建一个Project</strong></span><br /></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">因为Jenkins可以用于运行各种CI，测试，批处理任务等等，所以在Jenkins中将这些任务统称为&#8220;free-style software project&#8221;.</p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">Jenkins也提供了其他类型的jobs，例如：<br /></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">1，如果项目是Maven，Jenkins还提供了一种仅用于Maven Project的job。但其实free-style software projec仍然可以用于创建Maven项目，只不过这种更适合Maven项目，结合的更好而已。</p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">2，也可以创建一个"Monitor an external job&#8220;用于监控外部进程。</p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">3，或者一个Matrix project，也就是multi-configuration project。</p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">我不确定是否仅有这4种job，也许使用插件可以创建更多类型的job，大家自己看资料吧。<br /></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><br /></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">下面是如何创建一个最常见的&#8220;free-style software project"的过程：<br /></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><img src="http://my.csdn.net/uploads/201205/24/1337823944_3142.png" alt="" style="border: none;" /><br /></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">ok确定</p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><img src="http://my.csdn.net/uploads/201205/24/1337824211_7039.png" alt="" style="border: none;" /><br /></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">这之前有很多描述性的工作可以自己选择，配置svn要Subersion，在Repository URL中输入svn地址，点击enter credential</p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><img src="http://my.csdn.net/uploads/201205/24/1337824424_3843.png" alt="" style="border: none;" /><br /></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">这里输入svn用户名和密码即可，在已建项目中可以点击Configure</p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><img src="http://my.csdn.net/uploads/201205/24/1337824618_9379.png" alt="" style="border: none;" /><br /></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="color: #3366ff;"><strong>自动运行Build</strong></span><br /></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">触发一个build有三种方式：</p><ul style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><li>Builds in Jenkins can be triggered periodically (on a schedule, specified in configuration) 这里定义schedule的语法是unix常见的cron语法。<br /></li><li>Or when source changes in the project have been detected</li></ul><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">可以设置Jenkins定时检查SVN是否发生了变化，也可以手动检查：http://YOURHOST/jenkins/job/PROJECTNAME/pollong。也可以设置Jenkins为post-commit，这个方式尤其适用于那些检查是否代码改变会花费很长时间的情况。<br /></p><ul style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><li>Or they can be automatically triggered by requesting the URL:</li></ul><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">http://YOURHOST/jenkins/job/PROJECTNAME/build</p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><br /></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><strong><span style="color: #3366ff;">Distributed builds</span></strong><br /></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">Jenkins supports the "master/slave" mode, where the workload of building projects are delegated to multiple "slave" nodes, allowing single Jenkins installation to host a large number of projects, or provide different environments needed for builds/tests.<br /></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">在现实中需要使用distributed builds情况很多，例如：一个web application的build，需要分别验证firefox和IE的行为，那么就需要到windows机器上运行IE。</p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">或因为性能问题，将build分布到多个slave节点去。</p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><br /></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">到Jenkins的管理界面，就可以方便的添加节点。配置节点时，需要提供节点所在的机器，登陆用户名密码，使用的目录等。</p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">但是slave并不需要再安装Jenkins。jenkins会自动启用slave agent，将build需要tools考到远程机器上。<br /></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">需要注意的是：the build results and artifacts will always end up on the master server. 因此不需要跑到各个节点去查看build产生的文件，log等。</p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">其实在slave节点，会创建一个本地的workspace，并在运行时使用这个workspace。因为毕竟build运行在slave节点上，所以这个节点肯定要有运行build需要的所有因素。</p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">总之添加节点并远程运行build真是太方便了~<br /></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><br /></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">添加节点后，在master Jenkins home目录下会出现关于该节点的配置文件。</p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">Jenkins将自动决定在哪个节点上运行build，根据下列策略：<br /></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">Some slaves are faster, while others are slow. Some slaves are closer (network wise) to a master, others are far away. So doing a good build distribution is a challenge. Currently, Jenkins employs the following strategy:</p><ol style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><li>If a project is configured to stick to one computer, that's always honored.</li><li>Jenkins tries to build a project on the same computer that it was previously built.</li><li>Jenkins tries to move long builds to slaves, because the amount of network interaction between a master and a slave tends to be logarithmic to the duration of a build (IOW, even if project A takes twice as long to build as project B, it won't require double network transfer.) So this strategy reduces the network overhead.</li></ol><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">Jenkins通过运行slave agents来完成分布式build。最常见的情况是：slave agent运行在各个slave 节点。master通过SSH远程启动/停止slave agent，进而控制各个节点的行为。<br /></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">一共有下列4种方式启动slave agent：<br /></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">&#8226;The master starts the slave agents via ssh<br />&#8226; Starting the slave agent manually using Java Web Start<br />&#8226; Installing the slave agent as a Window service<br />&#8226; Starting the slave agent directly from the command line on the slave machine from the command line</p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">需要注意的是这4种方式适用于不同的情况，例如slave节点在防火墙后，导致master无法通过SSH启停slave agent。此时只能用后三种方式，但是往往有一些弊端，比如master无法自动停止/重启 slave agent.</p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">一旦添加node成功，你就可以在job中指定这个job在哪个node运行：</p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">Restrict where this project can be run (如果不指定则由Jenkins自行决定，即可以在slave节点运行，也可以在master节点运行，甚至在一次build中就可以自行来回切换)。<br /></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><br /></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="color: #3366ff;"><strong>配置Jenkins，让它收集更多的log</strong></span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">https://wiki.jenkins-ci.org/display/JENKINS/Logging</p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><br /></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">在流行持续集成的今天，在各个环境：alpha,beta和production 都部署了唯一的Jenkins服务器。</p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">Jenkins服务器统一负责该环境内所有组件的持续集成。也就是说，一个Jenkins服务器会有很多个build。所以有时会用到上面提到的&#8221;Monitor an external job&#8220;。</p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">但不是Distributed Builds。</p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><br />同时由于Jenkins会进入每个环境，包括production，因此会使用auto deployment的方式，自动完成Jenkins在各个环境的部署。</p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><br /></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><strong><span style="color: #3333ff;">用户管理</span></strong></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">毫无疑问Jenkins中需要有用户管理的功能，因为除开发人员外，有多种角色的人需要查看build的结果。</p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">在Jenkins中的系统管理中，可以设置&#8220;任何用户可以做任何事&#8221; 或 &#8220;登录用户可以做任何事&#8221;。</p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">因此前一个选项意味着，任何浏览JenkinsURL的用户都可以修改Jenkins。或只有登录用户才能做修改。</p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">Jenkins中的用户划分为两类：可登录用户和不可登录用户。</p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">1，只要是修改过repository，即对build产生过影响的用户，都会被Jenkins记录在本地的database中。这类用户可以在Jenkins界面-&gt;查看用户中浏览。</p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">但这类用户不是正式的Jenkins用户，也不能登录Jenkins。这类用户的权限由上面说的系统管理中的配置决定。通常只有查看build的权限，没有修改权限。</p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">2，只有在Jenkins中明确注册的用户，才能够登录Jenkins，并且有权限控制。同时注册过的用户，在JENKINS_HOME目录下的users目录下，都有一个单独的目录来存储相关信息。</p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><br /></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="color: #3333ff;"><strong>Jenkins Script Console</strong></span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">Jenkins提供了一个script console&nbsp;Groovy script which allows to run arbitrary scripts on the Jenkins server or on slave nodes. This feature can be accessed from the "manage Jenkins" link。</p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">也可以通过URL直接访问：http://myserver:8080/hudson/script</p><img src ="http://www.blogjava.net/qileilove/aggbug/409433.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qileilove/" target="_blank">顺其自然EVO</a> 2014-01-29 16:01 <a href="http://www.blogjava.net/qileilove/articles/409433.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>持续集成的工具都有哪些？</title><link>http://www.blogjava.net/qileilove/articles/409415.html</link><dc:creator>顺其自然EVO</dc:creator><author>顺其自然EVO</author><pubDate>Tue, 28 Jan 2014 15:47:00 GMT</pubDate><guid>http://www.blogjava.net/qileilove/articles/409415.html</guid><wfw:comment>http://www.blogjava.net/qileilove/comments/409415.html</wfw:comment><comments>http://www.blogjava.net/qileilove/articles/409415.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qileilove/comments/commentRss/409415.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qileilove/services/trackbacks/409415.html</trackback:ping><description><![CDATA[目前市场上主流的持续集成工具很多<br />例如&nbsp;<span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">CruiseControL，hudson ，jenkins，还有apache的</span>Continuum 等 开源的持续集成工具,<br /><span style="color: #333333; font-family: arial, 宋体, sans-serif; line-height: 24px; text-indent: 28px; background-color: #ffffff;">CruiseControl ：简称 CC ，持续集成工具，主要提供了基于版本管理工具 ( 如 CVS、VSS、SVN) 感知变化或每天定时的持续集成，并提供持续集成报告、 Email 、 Jabber 等等方式通知相关负责人，其要求是需要进行日构建的项目已编写好全自动的项目编译脚本 ( 可基于 Maven 或 Ant) 。由于该工具配置以及部署很麻烦 且版本很久没有更新<br /></span><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">hudson 但是由于被oracle收购 很多以前开源的东西 以后很可能被ORACLE私有化&nbsp;<br /></span><div class="para" style="color: #333333; margin-bottom: 5px; text-indent: 2em; line-height: 24px; font-family: arial, 宋体, sans-serif; background-color: #ffffff;">Hudson是Jenkins的前身，是基于Java开发的一种持续集成工具，用于监控程序重复的工作，包括：　</div><div class="para" style="color: #333333; margin-bottom: 5px; text-indent: 2em; line-height: 24px; font-family: arial, 宋体, sans-serif; background-color: #ffffff;">1、持续的软件版本发布/测试项目。　</div><div class="para" style="color: #333333; margin-bottom: 5px; text-indent: 2em; line-height: 24px; font-family: arial, 宋体, sans-serif; background-color: #ffffff;">2、监控外部调用执行的工作。</div><h3 class="headline-2" style="margin: 22px 0px 12px; padding: 0px 0px 0px 5px; font-size: 18px; font-family: 微软雅黑, 黑体, Verdana; line-height: 19px; clear: both; font-weight: 500; background-color: #ffffff;"><a name="0_1" class="anchor-2" style="color: #136ec2; position: relative; top: -50px; display: block; width: 20px; height: 20px; text-indent: 20px; background-image: url(http://www.blogjava.net/CuteSoft_Client/CuteEditor/Load.ashx?type=image&amp;file=anchor.gif); background-repeat: no-repeat no-repeat;"></a><a name="sub7992155_0_1" class="anchor-2" style="color: #136ec2; position: relative; top: -50px; display: block; width: 20px; height: 20px; text-indent: 20px; background-image: url(http://www.blogjava.net/CuteSoft_Client/CuteEditor/Load.ashx?type=image&amp;file=anchor.gif); background-repeat: no-repeat no-repeat;"></a><span class="headline-content">Hudson的特性</span></h3><div class="para" style="color: #333333; margin-bottom: 5px; text-indent: 2em; line-height: 24px; font-family: arial, 宋体, sans-serif; background-color: #ffffff;">1、易于安装-只要把hudson.war部署到servlet容器，不需要数据库支持。</div><div class="para" style="color: #333333; margin-bottom: 5px; text-indent: 2em; line-height: 24px; font-family: arial, 宋体, sans-serif; background-color: #ffffff;">2、易于配置-所有配置都是通过其提供的web界面实现。</div><div class="para" style="color: #333333; margin-bottom: 5px; text-indent: 2em; line-height: 24px; font-family: arial, 宋体, sans-serif; background-color: #ffffff;">3、集成RSS/E-mail/IM-通过RSS发布构建结果或当构建失败时通过e-mail实时通知。</div><div class="para" style="color: #333333; margin-bottom: 5px; text-indent: 2em; line-height: 24px; font-family: arial, 宋体, sans-serif; background-color: #ffffff;">4、生成JUnit/TestNG测试报告。</div><div class="para" style="color: #333333; margin-bottom: 5px; text-indent: 2em; line-height: 24px; font-family: arial, 宋体, sans-serif; background-color: #ffffff;">5、分布式构建支持-Hudson能够让多台计算机一起构建/测试。</div><div class="para" style="color: #333333; margin-bottom: 5px; text-indent: 2em; line-height: 24px; font-family: arial, 宋体, sans-serif; background-color: #ffffff;">6、文件识别- Hudson能够跟踪哪次构建生成哪些jar，哪次构建使用哪个版本的jar等。</div><div class="para" style="color: #333333; margin-bottom: 5px; text-indent: 2em; line-height: 24px; font-family: arial, 宋体, sans-serif; background-color: #ffffff;">7、插件支持-Hudson可以通过插件扩展，你可以开发适合自己团队使用的工具。</div>基于以上情况 Hudson创造者们 另起炉灶 &nbsp;建立了有一个CI JENKINS<br /><br /><div id="card-container" style="margin-bottom: 18px; font-family: arial, 宋体, sans-serif; line-height: 24px; background-color: #ffffff; clear: both;"><div nslog-area=""  clearfix"="" data-nslog-type="72" style="clear: both; line-height: 25px; color: #333333; margin-bottom: 18px;"><div><div style="margin-bottom: 5px; text-indent: 2em; line-height: 24px;">Jenkins是一个开源软件项目，旨在提供一个开放易用的软件平台，使持续集成变成可能。<span style="white-space: nowrap; margin-left: 2px; color: #3366cc; cursor: pointer; padding: 0px 2px; position: relative; vertical-align: baseline; top: -0.5em;">[1]</span><a name="ref_[1]_6277821" style="color: rgb(19, 110, 194);"></a></div></div></div></div><div id="lemmaContent-0"  rainbowlemma--"="" style="overflow: hidden; float: left; outline: 0px; padding-bottom: 16px; width: 790px; position: relative; left: -30px; padding-left: 30px; font-family: arial, 宋体, sans-serif; line-height: 24px; background-color: #ffffff;"><div style="color: #333333; margin-bottom: 5px; text-indent: 2em;">Jenkins，之前叫做Hudson，是基于Java开发的一种<a target="_blank" href="http://baike.baidu.com/view/5253255.htm" style="text-decoration: none; color: #136ec2;">持续集成</a>工具，用于监控秩序重复的工作，包括：</div><div style="color: #333333; margin-bottom: 5px; text-indent: 2em;">1、持续的软件版本发布/测试项目。</div><div style="color: #333333; margin-bottom: 5px; text-indent: 2em;">2、监控外部调用执行的工作。</div><div style="color: #333333; margin-bottom: 5px; text-indent: 2em;">Jenkins搭建</div><div style="color: #333333; margin-bottom: 5px; text-indent: 2em;">下载jenkins.war</div><div style="color: #333333; margin-bottom: 5px; text-indent: 2em;">有两种启动方法。</div><div style="color: #333333; margin-bottom: 5px; text-indent: 2em;">首先保证系统中已经安装了jdk，最好是jdk1.5以上。</div><div style="color: #333333; margin-bottom: 5px; text-indent: 2em;">第一种启动方法，切换到jenkins.war存放的目录，输入如下命令：</div><div style="color: #333333; margin-bottom: 5px; text-indent: 2em;">$ java -jar jenkins.war</div><div style="color: #333333; margin-bottom: 5px; text-indent: 2em;">然后在浏览器中（推荐用火狐）输入http://localhost:8080，localhost可以是本机的ip，也可以是计算机名。就可以打开jenkins</div><div style="color: #333333; margin-bottom: 5px; text-indent: 2em;">第二种方法是用tomcat打开</div><div style="color: #333333; margin-bottom: 5px; text-indent: 2em;">解压tomcat到某个目录,如/usr/local，进入tomcat下的/bin目录，启动tomcat</div><div style="color: #333333; margin-bottom: 5px; text-indent: 2em;">将jenkins.war文件放入tomcat下的webapps目录下，启动jenkins时，会自动在webapps目录下建立jenkins目录，所以在地址栏上需要输入的地址于上一种方法有点不一样：</div><div style="color: #333333; margin-bottom: 5px; text-indent: 2em;">http://localhost:8080/jenkins。</div></div><img src ="http://www.blogjava.net/qileilove/aggbug/409415.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qileilove/" target="_blank">顺其自然EVO</a> 2014-01-28 23:47 <a href="http://www.blogjava.net/qileilove/articles/409415.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>什么是持续集成</title><link>http://www.blogjava.net/qileilove/articles/409291.html</link><dc:creator>顺其自然EVO</dc:creator><author>顺其自然EVO</author><pubDate>Thu, 23 Jan 2014 13:37:00 GMT</pubDate><guid>http://www.blogjava.net/qileilove/articles/409291.html</guid><wfw:comment>http://www.blogjava.net/qileilove/comments/409291.html</wfw:comment><comments>http://www.blogjava.net/qileilove/articles/409291.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qileilove/comments/commentRss/409291.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qileilove/services/trackbacks/409291.html</trackback:ping><description><![CDATA[刚开始时 我对这个概念很狭隘 以为只要能让系统自动下载代码然后编译通过就叫持续集成，其实不然 我们仔细学习下基础概念。<br /><div style="color: #333333; margin-bottom: 5px; text-indent: 2em; line-height: 24px; font-family: arial, 宋体, sans-serif; background-color: #ffffff;">持续集成（Continuous integration）</div><div style="color: #333333; margin-bottom: 5px; text-indent: 2em; line-height: 24px; font-family: arial, 宋体, sans-serif; background-color: #ffffff;">集成<a target="_blank" href="http://baike.baidu.com/view/37.htm" style="text-decoration: none; color: #136ec2;">软件</a>的过程不是新问题，如果项目开发的规模比较小，<a target="_blank" href="http://baike.baidu.com/view/6814120.htm" style="text-decoration: none; color: #136ec2;">比如</a>一个人的项目，如果它对<a target="_blank" href="http://baike.baidu.com/view/1328912.htm" style="text-decoration: none; color: #136ec2;">外部系统</a>的依赖很小，那么软件集成不是问题，但是随着软件项目复杂度的增加（即使增加一个人），就会对集成和确保<a target="_blank" href="http://baike.baidu.com/view/551014.htm" style="text-decoration: none; color: #136ec2;">软件组件</a>能够在一起工作提出了更多的要求-要早集成，常集成。早集成，频繁的集成帮助项目在早期发现项目风险和质量问题，如果到后期才发现这些问题，解决问题代价很大，很有可能导致项目延期或者项目失败。</div><h2><span style="width: 25px; height: 24px; line-height: 24px; font-size: 16px; display: block; float: left; margin: 1px 0px 0px; background-color: #519cea; color: #ffffff; text-align: center; border-top-left-radius: 0px; border-top-right-radius: 2px; border-bottom-right-radius: 2px; border-bottom-left-radius: 0px;">2</span><img id="0" anchorname="2" src="http://www.blogjava.net/CuteSoft_Client/CuteEditor/Images/anchor.gif"  alt="" /><img id="1" anchorname="sub5282854_2" src="http://www.blogjava.net/CuteSoft_Client/CuteEditor/Images/anchor.gif"  alt="" /><span style="line-height: 24px; display: block; float: left; padding: 0px 8px 0px 5px;">定义</span><span editable-title"="" data-edit-id="5253255:5282854:2" style="display: block; float: right; padding: 6px 0px 0px 8px; margin-left: 10px;"><a href="http://baike.baidu.com/link?url=Tuz_LNfAzH0qox5pCAtTezedg9h6co37K8iB8LZZcCc3owU09yvjlwjiHU11m7yEycR0o41EzhFwO5xCItGtja#" title="编辑本段" style="text-decoration: none; color: #888888; height: 15px; line-height: 16px; padding-left: 18px; background-image: url(http://baike.bdimg.com/static/lemma/view3/img/icon-view_4b787901.gif); font-size: 12px; font-family: 宋体; display: block; background-position: -85px 1px; background-repeat: no-repeat no-repeat;">编辑</a></span></h2><div style="color: #333333; margin-bottom: 5px; text-indent: 2em; line-height: 24px; font-family: arial, 宋体, sans-serif; background-color: #ffffff;">大师Martin Fowler对持续集成是这样定义的:持续集成是一种<a target="_blank" href="http://baike.baidu.com/view/3326872.htm" style="text-decoration: none; color: #136ec2;">软件开发实践</a>，即团队开发成员经常集成他们的工作，通常每个成员每天至少集成一次，也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建（包括编译，发布，<a target="_blank" href="http://baike.baidu.com/view/1303916.htm" style="text-decoration: none; color: #136ec2;">自动化测试</a>)来验证，从而尽快地发现集成错误。许多团队发现这个过程可以大大减少集成的问题，让团队能够更快的开发<a target="_blank" href="http://baike.baidu.com/view/553710.htm" style="text-decoration: none; color: #136ec2;">内聚</a>的<a target="_blank" href="http://baike.baidu.com/view/37.htm" style="text-decoration: none; color: #136ec2;">软件</a>。</div><h2><span style="width: 25px; height: 24px; line-height: 24px; font-size: 16px; display: block; float: left; margin: 1px 0px 0px; background-color: #519cea; color: #ffffff; text-align: center; border-top-left-radius: 0px; border-top-right-radius: 2px; border-bottom-right-radius: 2px; border-bottom-left-radius: 0px;">3</span><img id="2" anchorname="3" src="http://www.blogjava.net/CuteSoft_Client/CuteEditor/Images/anchor.gif"  alt="" /><img id="3" anchorname="sub5282854_3" src="http://www.blogjava.net/CuteSoft_Client/CuteEditor/Images/anchor.gif"  alt="" /><span style="line-height: 24px; display: block; float: left; padding: 0px 8px 0px 5px;">价值</span><span editable-title"="" data-edit-id="5253255:5282854:3" style="display: block; float: right; padding: 6px 0px 0px 8px; margin-left: 10px;"><a href="http://baike.baidu.com/link?url=Tuz_LNfAzH0qox5pCAtTezedg9h6co37K8iB8LZZcCc3owU09yvjlwjiHU11m7yEycR0o41EzhFwO5xCItGtja#" title="编辑本段" style="text-decoration: none; color: #888888; height: 15px; line-height: 16px; padding-left: 18px; background-image: url(http://baike.bdimg.com/static/lemma/view3/img/icon-view_4b787901.gif); font-size: 12px; font-family: 宋体; display: block; background-position: -85px 1px; background-repeat: no-repeat no-repeat;">编辑</a></span></h2><h3><img id="4" anchorname="3_1" src="http://www.blogjava.net/CuteSoft_Client/CuteEditor/Images/anchor.gif"  alt="" /><img id="5" anchorname="sub5282854_3_1" src="http://www.blogjava.net/CuteSoft_Client/CuteEditor/Images/anchor.gif"  alt="" />减少风险</h3><div style="color: #333333; margin-bottom: 5px; text-indent: 2em; line-height: 24px; font-family: arial, 宋体, sans-serif; background-color: #ffffff;">一天中进行多次的集成，并做了相应的测试，这样有利于检查缺陷，了解<a target="_blank" href="http://baike.baidu.com/view/37.htm" style="text-decoration: none; color: #136ec2;">软件</a>的健康状况，减少假定。</div><h3><img id="6" anchorname="3_2" src="http://www.blogjava.net/CuteSoft_Client/CuteEditor/Images/anchor.gif"  alt="" /><img id="7" anchorname="sub5282854_3_2" src="http://www.blogjava.net/CuteSoft_Client/CuteEditor/Images/anchor.gif"  alt="" />减少重复过程</h3><div style="color: #333333; margin-bottom: 5px; text-indent: 2em; line-height: 24px; font-family: arial, 宋体, sans-serif; background-color: #ffffff;">减少重复的过程可以节省时间、费用和工作量。说起来简单，做起来难。这些浪费时间的重复劳动可能在我们的项目活动的任何一个环节发生，包括代码编译、数据库集成、测试、审查、部署及反馈。通过自动化的持续集成可以将这些重复的动作都变成自动化的，无需太多人工干预，让人们的时间更多的投入到动脑筋的、更高价值的事情上。</div><h3><img id="8" anchorname="3_3" src="http://www.blogjava.net/CuteSoft_Client/CuteEditor/Images/anchor.gif"  alt="" /><img id="9" anchorname="sub5282854_3_3" src="http://www.blogjava.net/CuteSoft_Client/CuteEditor/Images/anchor.gif"  alt="" />任何时间、任何地点生成可部署的软件</h3><div style="color: #333333; margin-bottom: 5px; text-indent: 2em; line-height: 24px; font-family: arial, 宋体, sans-serif; background-color: #ffffff;">持续集成可以让您在任何时间发布可以部署的<a target="_blank" href="http://baike.baidu.com/view/37.htm" style="text-decoration: none; color: #136ec2;">软件</a>。从外界来看，这是持续集成最明显的好处，我们可以对改进<a target="_blank" href="http://baike.baidu.com/view/37.htm" style="text-decoration: none; color: #136ec2;">软件</a>品质和减少风险说起来滔滔不绝，但对于客户来说，可以部署的软件产品是最实际的资产。利用持续集成，您可以经常对<a target="_blank" href="http://baike.baidu.com/view/60376.htm" style="text-decoration: none; color: #136ec2;">源代码</a>进行一些小改动，并将这些改动和其他的代码进行集成。如果出现问题，项目成员马上就会被通知到，问题会第一时间被修复。不采用持续集成的情况下，这些问题有可能到交付前的<a target="_blank" href="http://baike.baidu.com/view/106652.htm" style="text-decoration: none; color: #136ec2;">集成测试</a>的时候才发现，有可能会导致延迟发布产品，而在急于修复这些缺陷的时候又有可能引入新的缺陷，最终可能导致项目失败。</div><h3><img id="10" anchorname="3_4" src="http://www.blogjava.net/CuteSoft_Client/CuteEditor/Images/anchor.gif"  alt="" /><img id="11" anchorname="sub5282854_3_4" src="http://www.blogjava.net/CuteSoft_Client/CuteEditor/Images/anchor.gif"  alt="" />增强项目的可见性</h3><div style="color: #333333; margin-bottom: 5px; text-indent: 2em; line-height: 24px; font-family: arial, 宋体, sans-serif; background-color: #ffffff;">持续集成让我们能够注意到趋势并进行有效的决策。如果没有真实或最新的数据提供支持，项目就会遇到麻烦，每个人都会提出他最好的猜测。通常，项目成员通过手工收集这些信息，增加了负担，也很耗时。持续集成可以带来两点积极效果：</div><div style="color: #333333; margin-bottom: 5px; text-indent: 2em; line-height: 24px; font-family: arial, 宋体, sans-serif; background-color: #ffffff;">(1)有效决策：持续集成系统为项目构建状态和品质指标提供了及时的信息，有些持续集成系统可以报告功能完成度和<a target="_blank" href="http://baike.baidu.com/view/4098429.htm" style="text-decoration: none; color: #136ec2;">缺陷率</a>。</div><div style="color: #333333; margin-bottom: 5px; text-indent: 2em; line-height: 24px; font-family: arial, 宋体, sans-serif; background-color: #ffffff;">(2)注意到趋势：由于经常集成，我们可以看到一些趋势，如构建成功或失败、总体品质以及其它的项目信息。</div><h3><img id="12" anchorname="3_5" src="http://www.blogjava.net/CuteSoft_Client/CuteEditor/Images/anchor.gif"  alt="" /><img id="13" anchorname="sub5282854_3_5" src="http://www.blogjava.net/CuteSoft_Client/CuteEditor/Images/anchor.gif"  alt="" />建立团队对开发产品的信心</h3><div style="color: #333333; margin-bottom: 5px; text-indent: 2em; line-height: 24px; font-family: arial, 宋体, sans-serif; background-color: #ffffff;">持续集成可以建立开发团队对开发产品的信心，因为他们清楚的知道每一次构建的结果，他们知道他们对<a target="_blank" href="http://baike.baidu.com/view/37.htm" style="text-decoration: none; color: #136ec2;">软件</a>的改动造成了哪些影响，结果怎么样。</div><h2><span style="width: 25px; height: 24px; line-height: 24px; font-size: 16px; display: block; float: left; margin: 1px 0px 0px; background-color: #519cea; color: #ffffff; text-align: center; border-top-left-radius: 0px; border-top-right-radius: 2px; border-bottom-right-radius: 2px; border-bottom-left-radius: 0px;">4</span><img id="14" anchorname="4" src="http://www.blogjava.net/CuteSoft_Client/CuteEditor/Images/anchor.gif"  alt="" /><img id="15" anchorname="sub5282854_4" src="http://www.blogjava.net/CuteSoft_Client/CuteEditor/Images/anchor.gif"  alt="" /><span style="line-height: 24px; display: block; float: left; padding: 0px 8px 0px 5px;">要素</span><span editable-title"="" data-edit-id="5253255:5282854:4" style="display: block; float: right; padding: 6px 0px 0px 8px; margin-left: 10px;"><a href="http://baike.baidu.com/link?url=Tuz_LNfAzH0qox5pCAtTezedg9h6co37K8iB8LZZcCc3owU09yvjlwjiHU11m7yEycR0o41EzhFwO5xCItGtja#" title="编辑本段" style="text-decoration: none; color: #888888; height: 15px; line-height: 16px; padding-left: 18px; background-image: url(http://baike.bdimg.com/static/lemma/view3/img/icon-view_4b787901.gif); font-size: 12px; font-family: 宋体; display: block; background-position: -85px 1px; background-repeat: no-repeat no-repeat;">编辑</a></span></h2><div style="color: #333333; margin-bottom: 5px; text-indent: 2em; line-height: 24px; font-family: arial, 宋体, sans-serif; background-color: #ffffff;">1.统一的代码库</div><div style="color: #333333; margin-bottom: 5px; text-indent: 2em; line-height: 24px; font-family: arial, 宋体, sans-serif; background-color: #ffffff;">2.自动构建</div><div style="color: #333333; margin-bottom: 5px; text-indent: 2em; line-height: 24px; font-family: arial, 宋体, sans-serif; background-color: #ffffff;">3.自动测试</div><div style="color: #333333; margin-bottom: 5px; text-indent: 2em; line-height: 24px; font-family: arial, 宋体, sans-serif; background-color: #ffffff;">4.每个人每天都要向代码库主干提交代码</div><div style="color: #333333; margin-bottom: 5px; text-indent: 2em; line-height: 24px; font-family: arial, 宋体, sans-serif; background-color: #ffffff;">5.每次代码递交后都会在持续集成服务器上触发一次构建</div><div style="color: #333333; margin-bottom: 5px; text-indent: 2em; line-height: 24px; font-family: arial, 宋体, sans-serif; background-color: #ffffff;">6.保证快速构建</div><div style="color: #333333; margin-bottom: 5px; text-indent: 2em; line-height: 24px; font-family: arial, 宋体, sans-serif; background-color: #ffffff;">7.模拟生产环境的自动测试</div><div style="color: #333333; margin-bottom: 5px; text-indent: 2em; line-height: 24px; font-family: arial, 宋体, sans-serif; background-color: #ffffff;">8.每个人都可以很容易的获取最新可执行的<a target="_blank" href="http://baike.baidu.com/view/330120.htm" style="text-decoration: none; color: #136ec2;">应用程序</a></div><div style="color: #333333; margin-bottom: 5px; text-indent: 2em; line-height: 24px; font-family: arial, 宋体, sans-serif; background-color: #ffffff;">9.每个人都清楚正在发生的状况</div><div style="color: #333333; margin-bottom: 5px; text-indent: 2em; line-height: 24px; font-family: arial, 宋体, sans-serif; background-color: #ffffff;">10.自动化的部署</div><h2><span style="width: 25px; height: 24px; line-height: 24px; font-size: 16px; display: block; float: left; margin: 1px 0px 0px; background-color: #519cea; color: #ffffff; text-align: center; border-top-left-radius: 0px; border-top-right-radius: 2px; border-bottom-right-radius: 2px; border-bottom-left-radius: 0px;">5</span><img id="16" anchorname="5" src="http://www.blogjava.net/CuteSoft_Client/CuteEditor/Images/anchor.gif"  alt="" /><img id="17" anchorname="sub5282854_5" src="http://www.blogjava.net/CuteSoft_Client/CuteEditor/Images/anchor.gif"  alt="" /><span style="line-height: 24px; display: block; float: left; padding: 0px 8px 0px 5px;">原则</span><span editable-title"="" data-edit-id="5253255:5282854:5" style="display: block; float: right; padding: 6px 0px 0px 8px; margin-left: 10px;"><a href="http://baike.baidu.com/link?url=Tuz_LNfAzH0qox5pCAtTezedg9h6co37K8iB8LZZcCc3owU09yvjlwjiHU11m7yEycR0o41EzhFwO5xCItGtja#" title="编辑本段" style="text-decoration: none; color: #888888; height: 15px; line-height: 16px; padding-left: 18px; background-image: url(http://baike.bdimg.com/static/lemma/view3/img/icon-view_4b787901.gif); font-size: 12px; font-family: 宋体; display: block; background-position: -85px 1px; background-repeat: no-repeat no-repeat;">编辑</a></span></h2><div style="color: #333333; margin-bottom: 5px; text-indent: 2em; line-height: 24px; font-family: arial, 宋体, sans-serif; background-color: #ffffff;">1. 所有的开发人员需要在<a target="_blank" href="http://baike.baidu.com/view/1375595.htm" style="text-decoration: none; color: #136ec2;">本地机器</a>上做本地构建，然后再提交的<a target="_blank" href="http://baike.baidu.com/view/183136.htm" style="text-decoration: none; color: #136ec2;">版本控制</a>库中，从而确保他们的变更不会导致持续集成失败。</div><div style="color: #333333; margin-bottom: 5px; text-indent: 2em; line-height: 24px; font-family: arial, 宋体, sans-serif; background-color: #ffffff;">2. 开发人员每天至少向<a target="_blank" href="http://baike.baidu.com/view/183136.htm" style="text-decoration: none; color: #136ec2;">版本控制</a>库中提交一次代码。</div><div style="color: #333333; margin-bottom: 5px; text-indent: 2em; line-height: 24px; font-family: arial, 宋体, sans-serif; background-color: #ffffff;">3. 开发人员每天至少需要从<a target="_blank" href="http://baike.baidu.com/view/183136.htm" style="text-decoration: none; color: #136ec2;">版本控制</a>库中更新一次代码到<a target="_blank" href="http://baike.baidu.com/view/1375595.htm" style="text-decoration: none; color: #136ec2;">本地机器</a>。</div><div style="color: #333333; margin-bottom: 5px; text-indent: 2em; line-height: 24px; font-family: arial, 宋体, sans-serif; background-color: #ffffff;">4. 需要有专门的集成服务器来执行集成构建,每天要执行多次构建。</div><div style="color: #333333; margin-bottom: 5px; text-indent: 2em; line-height: 24px; font-family: arial, 宋体, sans-serif; background-color: #ffffff;">5. 每次构建都要100%通过。</div><div style="color: #333333; margin-bottom: 5px; text-indent: 2em; line-height: 24px; font-family: arial, 宋体, sans-serif; background-color: #ffffff;">6. 每次构建都可以生成可发布的产品。</div><div style="color: #333333; margin-bottom: 5px; text-indent: 2em; line-height: 24px; font-family: arial, 宋体, sans-serif; background-color: #ffffff;">7. 修复失败的构建是优先级最高的事情。<br />以上是百度百科的定义，我个人理解是，尽量减少人工操作，让整个流程自动化，减少人工误操作带来的损失，并且可以并行构建，例如，我们可以让CI服务器，通过版本控制服务器自行下载项目的不同版本，然后自行进行编译构建，发布版本到应用服务器上，集成自动化测试脚本进行测试，设置可以利用脚本来管理我们的数据库，解放我们的测试到业务的重点上去工作，带个整个项目组等等好处，以上任何环节出错都可以发邮件通知相关人员去整改。</div><img src ="http://www.blogjava.net/qileilove/aggbug/409291.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qileilove/" target="_blank">顺其自然EVO</a> 2014-01-23 21:37 <a href="http://www.blogjava.net/qileilove/articles/409291.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>