天天看點

使用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端口沒有打開。