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已經在運作:
配置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端口沒有打開。