天天看點

Jenkins+Maven+Git搭建持續內建和自動化部署的配置

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 ”中進行如下步驟:

2. Jenkins專有使用者資料庫,先允許使用者注冊;

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

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

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

7. 自動化部署

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

#!/bin/sh# update codegit pull# packagemvn clean
mvn package -Dmaven.test.skip=true# deployWAR=`ls target | grep war`
TOMCAT=/home/test/apache-tomcat-6.0.41
mv target/$WAR $TOMCATcd $TOMCAT# invoke another deploy scriptsh deploy-war.sh $WAR webapps           

8. 一個非常蛋疼的問題

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): xxx           
<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>
操作過程中有任何問題都可以聯系我
或添加公衆号更多技術分享           

繼續閱讀