天天看点

使用Jenkins配置Git和Maven的自动化构建

jenkins是一个开源的持续集成工具,应用jenkins搭建持续集成环境,可以进行自动构建、自动编译和部署,非常方便。

在服务器比较少的情况下,jenkins的优势并不明显,但是随着项目发展,服务器数量的增加,jenkins的优势就会凸显出来,可以很好的提高效率,减少很多人工操作。

现在公司的开发都是使用git管理代码,maven管理多模块和项目依赖,

所以今天尝试学习如何使用jenkins搭建github与maven下的自动构建和部署。

jenkins的安装十分简单,下载后就是一个jenkins.war的war包,可以直接部署在tomcat或者其他容器中。

如果不能部署,可以检查tomcat的配置文件,可以查看server.xml里unpackwars和autodeploy是否设置为true。

另外官网还有相关的.deb等的安装,比较繁琐,具体哪种方式部署可以自己选择。

把war文件拷贝到tomcat的webapps目录,

启动后进入http://server_path:8080/jenkins/,可以看到jenkins已经在运行:

使用Jenkins配置Git和Maven的自动化构建

配置git仓库需要用到git插件,jenkins默认没有git插件,需要手动安装。

点击manage jenkins,进入manage plugins,

在可用(avaliable)插件列表下找到source code management一栏,

选择git plugin插件,安装之后重启。

使用Jenkins配置Git和Maven的自动化构建

其他的插件如maven等,jenkins默认安装,不需要手动下载。

选择configure system,可以配置maven安装路径等。

如果没有maven和git环境,需要另外设置。

使用Jenkins配置Git和Maven的自动化构建

记得配置jdk路径,第一次我就忘记配置,结果构建时系统自动安装jdk,特别慢。

使用Jenkins配置Git和Maven的自动化构建

下面是jenkins location选项,jenkins默认会存放在用户主目录下的.jenkins文件夹中,如果需要变动可以在这里更改。

后面的shell中也会用到jenkins location,默认的访问路径:

<a href="http://www.cnblogs.com/jenkins%20location" target="_blank">http://server_path:8080/jenkins/job/</a>

使用Jenkins配置Git和Maven的自动化构建

为了更好的学习jenkins,我新建了一个非常简单的spring mvc项目,这个项目使用maven管理,提交到了github上,地址:

<a href="https://github.com/bingyue/easy-springmvc-maven" target="_blank">https://github.com/bingyue/easy-springmvc-maven</a>

pom.xml的部分内容:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

<code>...</code>

<code>&lt;</code><code>groupid</code><code>&gt;springmvc-maven&lt;/</code><code>groupid</code><code>&gt;</code>

<code>  </code><code>&lt;</code><code>artifactid</code><code>&gt;easy-springmvc-maven&lt;/</code><code>artifactid</code><code>&gt;</code>

<code>  </code><code>&lt;</code><code>version</code><code>&gt;0.0.1-snapshot&lt;/</code><code>version</code><code>&gt;</code>

<code>  </code><code>&lt;</code><code>packaging</code><code>&gt;war&lt;/</code><code>packaging</code><code>&gt;</code>

<code>  </code><code>&lt;</code><code>build</code><code>&gt;</code>

<code>   </code><code>&lt;!-- 生成的war文件名 避免添加版本号 --&gt;</code>

<code>    </code><code>&lt;</code><code>finalname</code><code>&gt;easy-springmvc-maven&lt;/</code><code>finalname</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>plugins</code><code>&gt;</code>

<code>      </code><code>&lt;</code><code>plugin</code><code>&gt;</code>

<code>        </code><code>&lt;</code><code>artifactid</code><code>&gt;maven-compiler-plugin&lt;/</code><code>artifactid</code><code>&gt;</code>

<code>        </code><code>&lt;</code><code>version</code><code>&gt;3.1&lt;/</code><code>version</code><code>&gt;</code>

<code>        </code><code>&lt;</code><code>configuration</code><code>&gt;</code>

<code>          </code><code>&lt;</code><code>source</code><code>&gt;1.6&lt;/</code><code>source</code><code>&gt;</code>

<code>          </code><code>&lt;</code><code>target</code><code>&gt;1.6&lt;/</code><code>target</code><code>&gt;</code>

<code>        </code><code>&lt;/</code><code>configuration</code><code>&gt;</code>

<code>      </code><code>&lt;/</code><code>plugin</code><code>&gt;</code>

<code>      </code><code>&lt;</code><code>artifactid</code><code>&gt;maven-war-plugin&lt;/</code><code>artifactid</code><code>&gt;</code>

<code>        </code><code>&lt;</code><code>version</code><code>&gt;3.0 &lt;/</code><code>version</code><code>&gt;</code>

<code>       </code><code>&lt;/</code><code>plugin</code><code>&gt;</code>

<code>    </code><code>&lt;/</code><code>plugins</code><code>&gt;</code>

<code>  </code><code>&lt;/</code><code>build</code><code>&gt;</code>

<code>  </code><code>...</code>

首先按照提示创建一个任务,选择maven project。

使用Jenkins配置Git和Maven的自动化构建

进入config页面,点击source code management的git选项,

填入上面的git地址,配置用户名密码等参数。

使用Jenkins配置Git和Maven的自动化构建

下面的build triggers是一个持续集成的触发器插件,

可以根据已经完成构建的结果,触发新job或者传递参数。

默认的选项是build whenever a snapshot dependency is built,

意思是依赖于快照的构建意思是依赖于快照的构建,当代码有更新时就构建项目。

下面的build periodically和poll scm可以设置定时自动构建,这里我暂时不设置。

使用Jenkins配置Git和Maven的自动化构建

pre steps选项用来配置构建前的工作,这里不作更改。

因为是maven项目,build选项有root pom和goals and options的设置,

使用默认的打包应该就可以。

post steps选项设置构建完成后的动作,

这里我设置为将war包拷贝到tomcat目录,删除项目原来的内容文件夹,并重启tomcat。

选择run only if build succeeds or is unstable ,点击添加execute shell:

28

29

30

31

32

33

34

35

36

37

38

39

40

<code>#!/bin/bash </code>

<code>#copy file and restart tomcat</code>

<code>tomcat_path=</code><code>/usr/local/tomcat2</code>

<code>project=easy-springmvc-maven</code>

<code>war_name=easy-springmvc-maven.war</code>

<code>war_path=http:</code><code>//192</code><code>.168.106.128:8080</code><code>/jenkins/job/jeekins-test/ws/target</code>

<code>server_port=8082</code>

<code>file_path=</code><code>/home/bingyue/</code><code>.jenkins</code><code>/jobs/jeekins-test/workspace/target</code>

<code>now=$(</code><code>date</code> <code>+</code><code>"%y%m%d%h%m%s"</code><code>)</code>

<code>echo</code> <code>"the shell execute time is ${now}"</code>

<code>echo</code> <code>`</code><code>lsof</code> <code>-n -p -t -i :${server_port}`</code>

<code>tomcat_pid=`</code><code>lsof</code> <code>-n -p -t -i :${server_port}`</code>

<code>echo</code> <code>"the tomcat_pid is ${tomcat_pid}"</code>

<code>if</code> <code>[ </code><code>"${tomcat_pid}"</code> <code>!= </code><code>""</code> <code>]; </code><code>then</code> 

<code>   </code><code>kill</code> <code>-9 $tomcat_pid</code>

<code>   </code><code>echo</code> <code>"kill the server"</code>

<code>fi</code> 

<code>echo</code> <code>"rm ${tomcat_path}/webapps/${war_name}"</code>

<code>rm</code> <code>${tomcat_path}</code><code>/webapps/</code><code>${war_name}</code>

<code>echo</code> <code>"rm -rf ${tomcat_path}/webapps/${project}"</code>

<code>rm</code> <code>-rf ${tomcat_path}</code><code>/webapps/</code><code>${project}</code>

<code>cd</code> <code>$file_path</code>

<code>if</code> <code>[ -f ${war_name} ]; </code><code>then</code> 

<code>   </code><code>cp</code> <code>${war_name} ${tomcat_path}</code><code>/webapps</code>

<code>else</code>

<code>   </code><code>echo</code> <code>"${war_name} unexists"</code>

<code>fi</code>

<code>export</code> <code>java_home=</code><code>/data/jdk7</code>

<code>export</code> <code>catalina_home2=</code><code>/usr/local/apache-tomcat-2</code>

<code>export</code> <code>catalina_base2=</code><code>/usr/local/apache-tomcat-2</code>

<code>$tomcat_path</code><code>/bin/startup</code><code>.sh</code>

<code>echo</code> <code>"server restarted"</code>

说明几点:

这次学习是使用了单台虚拟机里的两个tomcat,所以端口号有改变,

我为了方便测试,直接访问了jenkins的隐藏目录/.jenkins/文件夹,

实际应用中,jenkins通常都是应用在分布式系统,同时部署多台服务器,一般都是访问jenkins所在的机器上下载war包来部署,

我们测试的时候也可以直接修改jenkins主目录。

最下面的buildsetting 可以设置邮件收件人列表等,在每次构建结束后可以将相关信息发送到邮箱。

使用Jenkins配置Git和Maven的自动化构建

完成相应的设置后,就可以进行项目的构建。

在任务列表页点击play的按钮,或者进入任务然后选择build now。

首页左下角的栏目显示正在构建的项目状态:

使用Jenkins配置Git和Maven的自动化构建

点击可以查看控制台输出和日志:

使用Jenkins配置Git和Maven的自动化构建

构建成功,项目状态为蓝色,失败是红色。

打包成功后,可以进入workspace查看文件:

<a href="http://server_path:8080/jenkins/job/jeekins-test/ws/target/easy-springmvc-maven.war" target="_blank">http://server_path:8080/jenkins/job/jeekins-test/ws/target/easy-springmvc-maven.war</a>

现在打开刚才的tomcat路径,如果控制台没有错误输出,构建的项目应该可以正常访问:

使用Jenkins配置Git和Maven的自动化构建

构建成功!

部署到tomcat时jenkins启动报错,war包无法解压:

invalid or unreadable war file : error in opening zip file

检查发现是文件下载不完全,重新下载上传后解决。jenkins.war文件有60多mb,使用前记得检查文件完整性。

首次进入提示your container doesn’t use utf-8 to decode urls. if you use non-ascii characters as a job name etc, this will cause problems.

点击jenkins提示已经给出了解决方案:

some versions of tomcat (such as 5.0.28) uses iso-8859-1 to decode urls, which is in a clear violation of the relevant rfcs. to fix this problem, add the following uriencoding attribute to the connector definition in $tomcat_home/conf/server.xml.

&lt;connector port="8080" uriencoding="utf-8"/&gt;

sending e-mails to: [email protected]

error: could not connect to smtp host: localhost, port: 25

javax.mail.messagingexception: could not connect to smtp host: localhost, port: 25;

 本地的smtp25端口没有打开。