<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>持续集成 on 分享技术带来的喜悦</title><link>https://bridgeli.cn/categories/%E6%8C%81%E7%BB%AD%E9%9B%86%E6%88%90/</link><description>Recent content in 持续集成 on 分享技术带来的喜悦</description><generator>Hugo -- 0.156.0</generator><language>zh-cn</language><lastBuildDate>Sun, 24 May 2015 14:24:39 +0000</lastBuildDate><atom:link href="https://bridgeli.cn/categories/%E6%8C%81%E7%BB%AD%E9%9B%86%E6%88%90/index.xml" rel="self" type="application/rss+xml"/><item><title>持续集成（C I）工具Jenkins入门</title><link>https://bridgeli.cn/posts/2015-05-24-%E6%8C%81%E7%BB%AD%E9%9B%86%E6%88%90ci%E5%B7%A5%E5%85%B7jenkins%E5%85%A5%E9%97%A8/</link><pubDate>Sun, 24 May 2015 14:24:39 +0000</pubDate><guid>https://bridgeli.cn/posts/2015-05-24-%E6%8C%81%E7%BB%AD%E9%9B%86%E6%88%90ci%E5%B7%A5%E5%85%B7jenkins%E5%85%A5%E9%97%A8/</guid><description>&lt;p&gt;这几天研究了一下持续集成（CI）工具Jenkins，感觉很强大，入门也很简单，今天就写一个入门的小例子，对于一般性的小项目足够用了，如果大家用到了更复杂的相信学会这篇文章之后，也一定能自己搞定了&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;安装&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Jenkins是Java开发的，我们只需要到他的官网：http://jenkins-ci.org下载一个war包，扔到servlet容器（例如：tomcat）中，启动就可以了，和普通的war启动没什么差别，如果你还不会，那么你需要补J2EE的基础了。&lt;/p&gt;
&lt;ol start="2"&gt;
&lt;li&gt;安装插件&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;启动完成之后，是这样的，&lt;br&gt;
&lt;a href="https://www.bridgeli.cn/wp-content/uploads/2015/05/20150524172222.png"&gt;&lt;img loading="lazy" decoding="async" src="https://www.bridgeli.cn/wp-content/uploads/2015/05/20150524172222-300x115.png" alt="20150524172222" width="300" height="115" class="alignnone size-medium wp-image-176" /&gt;&lt;/a&gt;&lt;br&gt;
Jenkins自己已经帮我们安装了好多很好用的插件，但有些还是要我们自己装，例如：Git Client Plugin、Git Plugin，要安装这些，我们只需要点击左边的“系统管理” –&amp;gt; 管理插件 –&amp;gt; 可选插件，找到这两个插件装上就好了，装好插件下一步就是配置了&lt;/p&gt;
&lt;ol start="3"&gt;
&lt;li&gt;配置&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;配置，同样“系统管理” –&amp;gt; 系统设置，下面开始配置：&lt;/p&gt;
&lt;p&gt;①. Maven Configuration配置&lt;br&gt;
就是maven的settings文件的位置&lt;br&gt;
②. JDK配置&lt;br&gt;
新增JDK，然后大家一看就应该懂了，尽量不要自动安装&lt;br&gt;
③. Git&lt;br&gt;
也一样，就是Git的路径，需要注意的是：Git的路径一直要到bin下面的exe文件(Linux还没用过，所以不清楚，但我相信大家都懂得了)&lt;br&gt;
④. Maven配置&lt;br&gt;
这个和JDK的配置是一样的&lt;br&gt;
⑤. Maven项目配置&lt;br&gt;
Maven仓库的地址，我选的是第三个Local to the workspace，其实无所谓&lt;br&gt;
⑥. Jenkins URL&lt;br&gt;
就改成127.0.0.1吧，或者其他合适的，邮件地址就写自己的啦&lt;br&gt;
⑦. Git plugin&lt;br&gt;
这个相信不用多说了，Git我们都配过&lt;/p&gt;
&lt;p&gt;这些目前是必须的配置，其他的大家就根据需要或者自己的理解，要么不配也行&lt;/p&gt;
&lt;p&gt;需要说明的是，我没有配ant，用到了可以自己配一下，一样的，配置完成后选择“保存”就好了&lt;/p&gt;
&lt;ol start="4"&gt;
&lt;li&gt;新建一个任务&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这个大家都能找到在哪，然后进入到&lt;br&gt;
&lt;a href="https://www.bridgeli.cn/wp-content/uploads/2015/05/20150524175501.png"&gt;&lt;img loading="lazy" decoding="async" src="https://www.bridgeli.cn/wp-content/uploads/2015/05/20150524175501-300x117.png" alt="20150524175501" width="300" height="117" class="alignnone size-medium wp-image-177" /&gt;&lt;/a&gt;&lt;br&gt;
填入Item名称，选择构建一个maven项目，点击“OK”到下一页，需要说明的：&lt;br&gt;
①. 源码管理，这个也是最重要的，我选的是Git，这也是在一开始我安装那两个插件的原因，如果不安装那两个插件，是不会有Git这个选项的，然后键入要构建的项目的URL，点击“Add”，添加用户名和密码，切记一定要这么选择&lt;br&gt;
&lt;a href="https://www.bridgeli.cn/wp-content/uploads/2015/05/20150518163202_jenkins.png"&gt;&lt;img loading="lazy" decoding="async" src="https://www.bridgeli.cn/wp-content/uploads/2015/05/20150518163202_jenkins-300x145.png" alt="20150518163202_jenkins" width="300" height="145" class="alignnone size-medium wp-image-174" /&gt;&lt;/a&gt;&lt;br&gt;
其中Username是默认的，可以改，但Kind和Private Key强烈建议和我选的一样，否则可能会报代码拉不下来的错误，反正我是被这个错浪费了一天，然后这么选之后就对了，所以建议大家这么干，当然也可以自己选择其他的，大家可以试试。&lt;/p&gt;
&lt;p&gt;②. 构建触发器&lt;br&gt;
Poll SCM、Build periodically这个是我们配置定时任务，也就是定时自动构建项目的，他们的区别：&lt;br&gt;
Poll SCM：定时检查源码变更（根据SCM软件的版本号），如果有更新就checkout最新code下来，然后执行构建动作。我的配置如下：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;\*/5 \* \* \* * （每5分钟检查一次源码变化）
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Build periodically：周期进行项目构建（它不care源码是否发生变化），我的配置如下：&lt;/p&gt;</description></item><item><title>ANT（build）脚本模板示例</title><link>https://bridgeli.cn/posts/2015-05-10-antbuild%E6%A8%A1%E6%9D%BF%E7%A4%BA%E4%BE%8B/</link><pubDate>Sun, 10 May 2015 14:56:18 +0000</pubDate><guid>https://bridgeli.cn/posts/2015-05-10-antbuild%E6%A8%A1%E6%9D%BF%E7%A4%BA%E4%BE%8B/</guid><description>&lt;p&gt;近来虽然Maven构建的项目越来越盛行，但是依然还有很多遗留（暂且称之为遗留吧）项目依然是由ANT编译的，今天老夫就整理一下自己目前公司项目用到的ANT模板，既作为老夫的学习笔记，以供将来查看，也分享出来供需要的参考，因为比较简单易懂，就不多说了，直接上代码&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;
&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt;
&amp;lt;!&amp;amp;#8211;
Ant工程build模板
ant build file
Example: ant -Dprofile=dev deploy
test IDC测试环境
dev 本地开发环境 (default)
&amp;amp;#8211;&amp;gt;
&amp;lt;project name=&amp;#34;antProject&amp;#34; basedir=&amp;#34;.&amp;#34; default=&amp;#34;prompt&amp;#34;&amp;gt;
&amp;lt;property name=&amp;#34;javac.version&amp;#34; value=&amp;#34;1.6&amp;#34; /&amp;gt;
&amp;lt;property name=&amp;#34;project.name&amp;#34; value=&amp;#34;projectname&amp;#34; /&amp;gt;
&amp;lt;property name=&amp;#34;source.encoding&amp;#34; value=&amp;#34;UTF-8&amp;#34; /&amp;gt;
&amp;lt;property name=&amp;#34;deploy.dir&amp;#34; value=&amp;#34;/tmp/${project.name}&amp;#34; /&amp;gt;
&amp;lt;!&amp;amp;#8211; project var set &amp;amp;#8211;&amp;gt;
&amp;lt;property name=&amp;#34;target.path&amp;#34; value=&amp;#34;build&amp;#34; /&amp;gt;
&amp;lt;property name=&amp;#34;target.root.path&amp;#34; value=&amp;#34;${target.path}/ROOT&amp;#34; /&amp;gt;
&amp;lt;property name=&amp;#34;target.root.classes&amp;#34; value=&amp;#34;${target.root.path}/WEB-INF/classes&amp;#34; /&amp;gt;
&amp;lt;property name=&amp;#34;webroot.path&amp;#34; value=&amp;#34;WebRoot&amp;#34; /&amp;gt;
&amp;lt;property name=&amp;#34;compileSrc&amp;#34; value=&amp;#34;src&amp;#34; /&amp;gt;
&amp;lt;property name=&amp;#34;compileDest&amp;#34; value=&amp;#34;${target.root.classes}&amp;#34; /&amp;gt;
&amp;lt;property name=&amp;#34;env.dir&amp;#34; value=&amp;#34;env&amp;#34; /&amp;gt;
&amp;lt;property name=&amp;#34;env.cfg&amp;#34; value=&amp;#34;${env.dir}/${profile}&amp;#34; /&amp;gt;
&amp;lt;tstamp&amp;gt;
&amp;lt;format property=&amp;#34;now&amp;#34; pattern=&amp;#34;yyyyMMddHHmmss&amp;#34; /&amp;gt;
&amp;lt;/tstamp&amp;gt;
&amp;lt;path id=&amp;#34;compileClassPath&amp;#34;&amp;gt;
&amp;lt;fileset dir=&amp;#34;${webroot.path}/WEB-INF/lib&amp;#34;&amp;gt;
&amp;lt;include name=&amp;#34;*.jar&amp;#34; /&amp;gt;
&amp;lt;/fileset&amp;gt;
&amp;lt;/path&amp;gt;
&amp;lt;target name=&amp;#34;prompt&amp;#34; description=&amp;#34;show prompt information&amp;#34;&amp;gt;
&amp;lt;echo&amp;gt;Please choose task: clean, compile, war, deploy. ${line.separator}
Example: ${line.separator}
ant compile ${line.separator}
ant -Dprofile=test deploy
&amp;lt;/echo&amp;gt;
&amp;lt;/target&amp;gt;
&amp;lt;target name=&amp;#34;clean&amp;#34;&amp;gt;
&amp;lt;delete dir=&amp;#34;${target.path}&amp;#34; /&amp;gt;
&amp;lt;mkdir dir=&amp;#34;${target.path}&amp;#34; /&amp;gt;
&amp;lt;delete dir=&amp;#34;${compileDest}&amp;#34; /&amp;gt;
&amp;lt;mkdir dir=&amp;#34;${compileDest}&amp;#34; /&amp;gt;
&amp;lt;delete dir=&amp;#34;${target.root.classes}&amp;#34; /&amp;gt;
&amp;lt;mkdir dir=&amp;#34;${target.root.classes}&amp;#34; /&amp;gt;
&amp;lt;echo&amp;gt;cleaned for ${compileDest}, ${target.root.path},${target.path}/*.war&amp;lt;/echo&amp;gt;
&amp;lt;/target&amp;gt;
&amp;lt;target name=&amp;#34;compile&amp;#34; depends=&amp;#34;clean,testIfProfileSet&amp;#34;&amp;gt;
&amp;lt;echo&amp;gt;starting compile the source from ${compileSrc}&amp;lt;/echo&amp;gt;
&amp;lt;javac srcdir=&amp;#34;${compileSrc}&amp;#34; includeantruntime=&amp;#34;false&amp;#34; fork=&amp;#34;true&amp;#34;
memoryinitialsize=&amp;#34;256m&amp;#34; memorymaximumsize=&amp;#34;512m&amp;#34; destdir=&amp;#34;${compileDest}&amp;#34;
classpathref=&amp;#34;compileClassPath&amp;#34; encoding=&amp;#34;${source.encoding}&amp;#34;
source=&amp;#34;${javac.version}&amp;#34; target=&amp;#34;${javac.version}&amp;#34;
debug=&amp;#34;true&amp;#34; verbose=&amp;#34;false&amp;#34; optimize=&amp;#34;true&amp;#34; deprecation=&amp;#34;false&amp;#34;&amp;gt;
&amp;lt;/javac&amp;gt;
&amp;lt;copy todir=&amp;#34;${compileDest}&amp;#34;&amp;gt;
&amp;lt;fileset dir=&amp;#34;${compileSrc}&amp;#34; excludes=&amp;#34;*\*/\*.svn,*\*/\*.java&amp;#34; /&amp;gt;
&amp;lt;/copy&amp;gt;
&amp;lt;echo&amp;gt;compiled classes copied to ${compileDest}&amp;lt;/echo&amp;gt;
&amp;lt;copy todir=&amp;#34;${target.root.path}&amp;#34;&amp;gt;
&amp;lt;fileset dir=&amp;#34;${webroot.path}&amp;#34; excludes=&amp;#34;*\*/\*.svn,*\*/\*.java&amp;#34; /&amp;gt;
&amp;lt;/copy&amp;gt;
&amp;lt;echo&amp;gt;copied to ${webroot.path} to ${compileDest}&amp;lt;/echo&amp;gt;
&amp;lt;echo&amp;gt;compile finished&amp;lt;/echo&amp;gt;
&amp;lt;/target&amp;gt;
&amp;lt;target name=&amp;#34;testIfProfileSet&amp;#34;&amp;gt;
&amp;lt;echo&amp;gt;ant param profile: ${profile}&amp;lt;/echo&amp;gt;
&amp;lt;condition property=&amp;#34;isProfileSet&amp;#34;&amp;gt;
&amp;lt;!&amp;amp;#8211; &amp;lt;isset property=&amp;#34;${profile}&amp;#34; /&amp;gt; &amp;amp;#8211;&amp;gt;
&amp;lt;or&amp;gt;
&amp;lt;equals arg1=&amp;#34;${profile}&amp;#34; arg2=&amp;#34;dev&amp;#34; /&amp;gt;
&amp;lt;equals arg1=&amp;#34;${profile}&amp;#34; arg2=&amp;#34;test&amp;#34; /&amp;gt;
&amp;lt;/or&amp;gt;
&amp;lt;/condition&amp;gt;
&amp;lt;antcall target=&amp;#34;profileProvided&amp;#34;&amp;gt;
&amp;lt;/antcall&amp;gt;
&amp;lt;antcall target=&amp;#34;noProfile&amp;#34;&amp;gt;
&amp;lt;/antcall&amp;gt;
&amp;lt;/target&amp;gt;
&amp;lt;target name=&amp;#34;profileProvided&amp;#34; if=&amp;#34;isProfileSet&amp;#34;&amp;gt;
&amp;lt;copy todir=&amp;#34;${target.root.classes}&amp;#34;&amp;gt;
&amp;lt;fileset dir=&amp;#34;${env.cfg}&amp;#34; /&amp;gt;
&amp;lt;/copy&amp;gt;
&amp;lt;echo&amp;gt;copied config files ${env.cfg} to ${target.root.classes}&amp;lt;/echo&amp;gt;
&amp;lt;/target&amp;gt;
&amp;lt;target name=&amp;#34;noProfile&amp;#34; if=&amp;#34;isProfileSet&amp;#34;&amp;gt;
&amp;lt;echo&amp;gt;ant param profile is none, use default config files&amp;lt;/echo&amp;gt;
&amp;lt;/target&amp;gt;
&amp;lt;target name=&amp;#34;war&amp;#34; depends=&amp;#34;compile&amp;#34;&amp;gt;
&amp;lt;jar jarfile=&amp;#34;${target.path}/${project.name}-${profile}${now}.war&amp;#34;&amp;gt;
&amp;lt;fileset dir=&amp;#34;${target.root.path}&amp;#34;&amp;gt;
&amp;lt;include name=&amp;#34;*\*/\*&amp;#34; /&amp;gt;
&amp;lt;exclude name=&amp;#34;*\*/\*.fla&amp;#34; /&amp;gt;
&amp;lt;exclude name=&amp;#34;*\*/\*.mp3&amp;#34; /&amp;gt;
&amp;lt;exclude name=&amp;#34;*\*/\*.as&amp;#34; /&amp;gt;
&amp;lt;exclude name=&amp;#34;*\*/\*.bak&amp;#34; /&amp;gt;
&amp;lt;exclude name=&amp;#34;*\*/\*.swd&amp;#34; /&amp;gt;
&amp;lt;exclude name=&amp;#34;*\*/\*.db&amp;#34; /&amp;gt;
&amp;lt;/fileset&amp;gt;
&amp;lt;/jar&amp;gt;
&amp;lt;/target&amp;gt;
&amp;lt;target name=&amp;#34;deploy&amp;#34; depends=&amp;#34;compile&amp;#34;&amp;gt;
&amp;lt;delete dir=&amp;#34;${deploy.dir}&amp;#34; /&amp;gt;
&amp;lt;mkdir dir=&amp;#34;${deploy.dir}&amp;#34; /&amp;gt;
&amp;lt;copy todir=&amp;#34;${deploy.dir}&amp;#34;&amp;gt;
&amp;lt;fileset dir=&amp;#34;${target.root.path}&amp;#34;&amp;gt;
&amp;lt;/fileset&amp;gt;
&amp;lt;/copy&amp;gt;
&amp;lt;echo&amp;gt;deploy ${target.root.path} to ${deploy.dir}&amp;lt;/echo&amp;gt;
&amp;lt;/target&amp;gt;
&amp;lt;/project&amp;gt;
&lt;/code&gt;&lt;/pre&gt;</description></item></channel></rss>