Jenkins+Maven+Git搭建持續集成和自動化部署的配置手記

前言

    持續集成這個概念已經成爲軟件開發的主流,可以更頻繁的進行測試,儘早發現問題並提示。自動化部署就更不用說了,可以加快部署速度,並可以有效減少人爲操作的失誤。之前一直沒有把這個做起來,最近的新項目正好有機會,費了一番功夫總算搞好了,特此記錄。


1. 開發環境

    我這邊建立的標準開發環境如下:

    1. Maven做項目管理;

    2. Git做代碼管理;

    3. SpringMVC+Spring+Mybatis搭建的程序框架;

    4. Mysql作爲數據存儲,Druid做連接池;

    5. unitils作爲測試框架;

    6. Hibernate Validator作爲數據驗證;

    7. log4j作爲日誌輸出。

    注:其實這套東西非常像Grails,但不敢用太激進的技術和框架,擔心招人的問題-_-!


2. Jenkins的部署

    Jenkins原名是Hudson,這個淵源這裏就不追溯了,網上多得是,但是千萬別下錯了,官網地址是http://jenkins-ci.org/。建議直接下載最新版本。

    這個軟件的安裝是我見過最簡單的了,直接取war包放到tomcat下,啓動tomcat即可。相應的工程配置會在~/.jenkins目錄中。(當然你根據官網給的那種安裝方法也行,只是在debian的那個弄法還要去下載openjdk等等,多下了很多東西,相關配置也按linux目錄標準分開的,還要去找。)

    另外提醒一下,建議把Jenkins安裝在Linux上,這樣就不會出現ssh等命令找不到的問題,否則還要想辦法去處理。


3. Jenkins的插件

    安裝好後直接訪問“http://yourhost:8080/jenkins”即可進入主界面,點擊“系統管理”->“管理插件”,首次進入都是空白的,要等1分鐘左右才能看到內容,在後臺估計是在做更新或者下載,然後重新再進此界面就能看到內容了。


3.1 Git插件

    在“可選插件”中找到“GIT plugin”安裝,最下面有個安裝完重啓的勾選項,選中即可。這裏最搞笑的是檢測網絡是否連通的辦法是去嘗試打開google,豈不知天朝是打不開的,還好不影響下載。。。


3.2 Email插件

    這個事情非常蛋疼,之前測試怎麼都發布出來郵件,最後升級了一下默認插件就行了,狂汗。在“可更新”中找到“Mailer Plugin”選中並更新即可。另外如果想有更豐富的郵件內容,就去“可選插件”中安裝“Email Extension Plugin”,具體郵件內容配置網上大把可以搜。


3.3 其他插件

    默認就裝了很多常用插件,比如Maven、Junit等等,如果使用感覺有問題可以嘗試升級一下版本,但是沒有升級說明,也不知道升級了什麼東西。


4. 系統設置

    主界面點擊“系統管理”->“系統設置”即可進入。重點配置以下內容:

    1. Java、Git、Maven的目錄位置,確保可以正確找到命令;

    2. Jenkins URL,自動生成的,檢查一下即可;

    3. 郵件的設置。這裏注意一下,上面有一個“系統管理員郵件地址”需要填寫,另外“Extended E-mail Notification”中填寫配置,原來的“郵件配置”就不用再理會了。


5. 項目設置

    在主界面直接“新建”,就會有一個新的項目。重點配置以下內容:

    1. 源碼管理:選擇Git,填寫“Repository URL”,並加上相應的“Credentials”,其中認證信息用私鑰的話乾脆直接把私鑰內容填上去就行了,省的不知道目錄查找規則還不知道出的啥問題。

    2. 構建觸發器:這個地方要把“Build periodically”和“Poll SCM”都選上,時間格式都填寫成一樣的即可,比如“H/15  * * * *”,下面會有個具體執行時間的提示,Build動作會自動比Poll延遲3分40秒,這個設定還是很合理的。

    3. 構建:增加兩個構建步驟,分別是“Execute shell”和“Invoke top-level Maven target”,注意先後順序,可以拖拽擺放的。腳本執行根據自己需要,比如我需要去修改數據庫連接配置,官方建議是自己在工程裏面寫好腳本,這裏直接調用,而不是在這寫一個完整的腳本。Maven構建就加上“clean test”即可,就是運行“mvn clean test”的命令。

    4. Publish Junit test result report:在測試報告(XML)上加上“**/target/surefire-reports/*.xml”即可,這樣就會每次測試完自動找到測試報告,在Jenkins上即可在每個構建結構裏面查看到。

    5. 郵件通知:在構建後增加“Editable Email Notification”,填寫郵件的接受者、內容格式可以直接用全局變量,重點是配置一下發送觸發條件。


6. 安全性配置

    經過以上配置進行一次構建就會發現,Jenkins可以看到太多內容了,包括pull到的源碼,所以非常有必要增加權限控制。進入“系統管理”->“Configure Global Security”中進行如下步驟:

    1. 啓用安全;

    2. Jenkins專有用戶數據庫,先允許用戶註冊;

    3. 授權策略選擇“安全矩陣”,新加一個“admin”的用戶,把所有權限都開給admin用戶;

    4. 在主界面的用戶中找到admin,進行配置,設置登陸密碼;

    5. 先重新登陸測試一下是否admin正常,沒有問題就關閉允許用戶註冊,把匿名用戶的所有權限都去掉。


7. 自動化部署

    這裏我沒有讓Jenkins每次測試都去部署,一方面是考慮到單元測試基本已經滿足需要了,另一方面因爲測試太頻繁了,一直部署也搞得Stage測試環境要經常重啓,反而影響正常的人工測試。所以自己寫了個腳本,在必要的時候去運行一下去自動完成整個部署工作。

#!/bin/sh

# update code
git pull

# package
mvn clean
mvn package -Dmaven.test.skip=true

# deploy
WAR=`ls target | grep war`
TOMCAT=/home/test/apache-tomcat-6.0.41
mv target/$WAR $TOMCAT
cd $TOMCAT
# invoke another deploy script
sh deploy-war.sh $WAR webapps


8. 一個非常蛋疼的問題

    這個和以上問題都無關,只是極其不解的是這個錯誤在Windows下不出現,在Linux下打成War也不會出現,只有在Linux下直接執行Maven test就會出錯。其實問題的根源就是配置書寫不夠規範,但是錯誤出現的不一致性實在讓人蛋疼。報錯如下:

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): xxx

    這個就是Mybatis找不到綁定的類,但是xml是正確打包的,怎麼看都是沒大問題,並且windows也是對的,最後發現是我在寫模糊路徑的時候,classpath後面必須要加個*纔是標準寫法,正確寫法如下:

    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.gzxitao.demo.*.dao"/>
    </bean>

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="configLocation" value="classpath:configuration.xml"/>
        <!-- 這裏是要掃描多個目錄下的文件,必須聲明成“classpath*”,否則在某些情況下會報錯 -->
        <property name="mapperLocations" value="classpath*:com/gzxitao/demo/*/dao/*.xml" />
    </bean>


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章