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已经在运行:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuIzM1gjM0YDM40SM2kjMxMTN2EDOxkDM1EDMy0SM0MDNyUzLclDM1EDMy8CXxQzM0ITNvw1ZvxmYvwVbvNmLzd2bsJmbj5SNxAjMzV2Zh1Wavw1LcpDc0RHaiojIsJye.png)
配置git仓库需要用到git插件,jenkins默认没有git插件,需要手动安装。
点击manage jenkins,进入manage plugins,
在可用(avaliable)插件列表下找到source code management一栏,
选择git plugin插件,安装之后重启。
其他的插件如maven等,jenkins默认安装,不需要手动下载。
选择configure system,可以配置maven安装路径等。
如果没有maven和git环境,需要另外设置。
记得配置jdk路径,第一次我就忘记配置,结果构建时系统自动安装jdk,特别慢。
下面是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,我新建了一个非常简单的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><</code><code>groupid</code><code>>springmvc-maven</</code><code>groupid</code><code>></code>
<code> </code><code><</code><code>artifactid</code><code>>easy-springmvc-maven</</code><code>artifactid</code><code>></code>
<code> </code><code><</code><code>version</code><code>>0.0.1-snapshot</</code><code>version</code><code>></code>
<code> </code><code><</code><code>packaging</code><code>>war</</code><code>packaging</code><code>></code>
<code> </code><code><</code><code>build</code><code>></code>
<code> </code><code><!-- 生成的war文件名 避免添加版本号 --></code>
<code> </code><code><</code><code>finalname</code><code>>easy-springmvc-maven</</code><code>finalname</code><code>></code>
<code> </code><code><</code><code>plugins</code><code>></code>
<code> </code><code><</code><code>plugin</code><code>></code>
<code> </code><code><</code><code>artifactid</code><code>>maven-compiler-plugin</</code><code>artifactid</code><code>></code>
<code> </code><code><</code><code>version</code><code>>3.1</</code><code>version</code><code>></code>
<code> </code><code><</code><code>configuration</code><code>></code>
<code> </code><code><</code><code>source</code><code>>1.6</</code><code>source</code><code>></code>
<code> </code><code><</code><code>target</code><code>>1.6</</code><code>target</code><code>></code>
<code> </code><code></</code><code>configuration</code><code>></code>
<code> </code><code></</code><code>plugin</code><code>></code>
<code> </code><code><</code><code>artifactid</code><code>>maven-war-plugin</</code><code>artifactid</code><code>></code>
<code> </code><code><</code><code>version</code><code>>3.0 </</code><code>version</code><code>></code>
<code> </code><code></</code><code>plugin</code><code>></code>
<code> </code><code></</code><code>plugins</code><code>></code>
<code> </code><code></</code><code>build</code><code>></code>
<code> </code><code>...</code>
首先按照提示创建一个任务,选择maven project。
进入config页面,点击source code management的git选项,
填入上面的git地址,配置用户名密码等参数。
下面的build triggers是一个持续集成的触发器插件,
可以根据已经完成构建的结果,触发新job或者传递参数。
默认的选项是build whenever a snapshot dependency is built,
意思是依赖于快照的构建意思是依赖于快照的构建,当代码有更新时就构建项目。
下面的build periodically和poll scm可以设置定时自动构建,这里我暂时不设置。
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 可以设置邮件收件人列表等,在每次构建结束后可以将相关信息发送到邮箱。
完成相应的设置后,就可以进行项目的构建。
在任务列表页点击play的按钮,或者进入任务然后选择build now。
首页左下角的栏目显示正在构建的项目状态:
点击可以查看控制台输出和日志:
构建成功,项目状态为蓝色,失败是红色。
打包成功后,可以进入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路径,如果控制台没有错误输出,构建的项目应该可以正常访问:
构建成功!
部署到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.
<connector port="8080" uriencoding="utf-8"/>
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端口没有打开。