1. 程式人生 > >Jenkins + Git + Maven + tomcat集成環境搭建

Jenkins + Git + Maven + tomcat集成環境搭建

jenkins git maven

折騰了好幾天,終於吧Jenkins + Git + Maven + tomcat集成環境搭建起來了,最終主要實現“自動構建、部署”web應用。

1、安裝環境

操作系統:Centos 6.5

JDK:1.7.x

Maven:3.1.x

Git: 1.7.1,自建GitLab平臺

tomcat:7.x

上述宿主機器2臺:192.168.1.194,192,168.1.198,其中194位Jenkins Master,198位slave。

2、第三方安裝安裝和環境配置

JDK、Git、Maven、tomcat在上述2個宿主機器上都需要安裝,即jenkins master和slave都需要這些環境。

1)JDK安裝:略;安裝後之後,請註意配置JAVA_HOME環境變量。

2)Maven安裝:從apache下載tar.gz壓縮包,在合適的目錄下解壓即可。此後配置M2_HOME環境變量。

3)tomcat安裝:略。

4)Git:安裝非常簡單,直接執行“yum install git”即可。

5)如果你的GitLab是自建的內網平臺,千萬不要忘了在上述2個宿主機器上增加hosts解析,例如:

Java代碼 技術分享

  1. 192.168.1.110 git.xxx.com

上述環境安裝,需要在Jenkins和slave上都進行,即slave上也需要JDK、Maven、Git,因為slave接收master的job調度後,將會使用Git從GitLab上同步代碼並使用Maven進行build,這個過程都是在salve的本地進行。

此外,兩個宿主機器,還需要安裝ssh-keygen等必要軟件,同時它們還需要交換public Key,確保2個機器能夠實現“無密碼登陸”(過程略)。因為Jenkins在ssh傳輸時無法繞過“授權確認”的手動操作,所以管理員需要人為的進行一次ssh登陸。

3、jenkins master

master是job調度的分配者,我們需要首先安裝部署它。從“https://jenkins-ci.org/”官網下載jenkins.war部署包,我們將jenkins.war通過tomcat部署,即使用tomcat掛在啟動jenkins服務,因為這樣我們可以非常簡單的修改一些配置參數和維護。(啟動jenkins服務的方式還可以通過jar方式啟動,請參見其他說明文檔)

將master安裝在192.168.1.194機器上,單獨安裝一個tomcat,其http端口為38080。並修改如下文件:

1)context.xml:增加jenkins環境變量,由tomcat掛載。

Java代碼 技術分享

  1. <Context>

  2. ....

  3. <Environment name="JENKINS_HOME" value="/home/jenkins_home/" type="java.lang.String"/>

  4. </Context>

“JENKINS_HOME”是jenkins的home目錄,通常設定為“磁盤空間較大”的分區,這個目錄中將放置maven build的文件,歷史部署記錄等等,所以將會消耗很大的存儲空間。

2)tomcat-users.xml:配置jenkins的用戶,此後用戶可以在jenkins的頁面上登錄和授權操作,對於jenkins的用戶授權,官方提供了很多方式,比如LDAP、基於數據庫等等。本實例基於tomcat user的方式,簡單易用。

Java代碼 技術分享

  1. <tomcat-users>

  2. <role rolename="admin"/>

  3. <user username="admin" password="admin" roles="admin"/>

  4. <user username="developer" password="developer" roles="manager"/>

  5. </tomcat-users>

添加2個管理員用戶,其中admin可以對系統各項配置進行修改,manager可以管理項目、部署等。

3)將jenkins.war放置在webapps目錄下,我們此處希望jenkins作為ROOT項目加載,所以刪除原有的ROOT項目,並將jenkins.war重命名位ROOT.war,這樣在通過http訪問jenkins時,不需要加ContextPath了。

4)啟動jenkins tomcat:./startup.sh

5)訪問“http://192.168.1.194:38080”,然後使用admin用戶登錄(用戶密碼參見tomcat-users.xml)。

4、master配置

如果master需要真正的能夠運行job,我們還需要一些周密的配置。

1)插件管理:

技術分享


技術分享

jenkins master需要幾個常用的插件,在“可選插件”中,建議將如下列表插件選中並安裝:


技術分享

技術分享

這些插件主要涉及到:ssh、Git、GitLab、Maven,已經後面我們需要提到的“deploy”插件。管理員可以根據需要選擇性的安裝需要的plugins。

安裝完之後,重啟jenkins。

5、 系統配置

在jenkins的“系統管理”-->“系統設置”頁面,來設定master全局的配置,其中重要的2個選項位JDK和Maven,我們需要告知master它們安裝在何處。

1)JDK:


技術分享

2)Maven:


技術分享

6、Build與發布

我們接下來創建一個job,這個job將從GitLab上下載源碼到本地,然後使用Maven build和打包,並發布到tomcat上。這個過程正是我們常用的。

1)“Deploy to container plugin”:這個插件我們在上述已經看到,如果還沒有安裝,請首先安裝;它主要用來將“war”文件“deploy/redeploy”到web容器中,比如tomcat、jboss等。有了這個插件,我們可以在maven build之後,立即將war發布到tomcat中,而不需要手動操作或者寫shell腳本來copy文件。

首先,我們需要準備一個tomcat,用來部署我們的web application,過程略。此tomcat的端口為8080,部署在master宿主機器上。

因為Deploy插件是通過外部(http)方式“deploy/redeploy”,所以需要在tomcat上進行用戶授權。編輯tomcat-users.xml,增加如下配置:

Java代碼 技術分享

  1. <tomcat-users>

  2. <role rolename="manager"/>

  3. <role rolename="admin"/>

  4. <user username="deployer" password="deployer" roles="standard,manager,admin,manager-script" />

  5. </tomcat-users>

增加一個“deployer”用戶,我們可以通過tomcat manager機制來部署war。參見稍後講解。

2)新建Item:

授權與驗證:master需要ssh訪問slave機器(部署、啟動,發送文件等),以及從git上下載代碼,所以我們在開始之前,需要指定這些。“jenkins”-->“Credentials”-->“Add Credentials”添加一個SSH驗證規則:


技術分享


我們創建一個Global範圍的SSH無密碼登陸,這個可以在此後master與slave通訊有用。前提是master與slave已經交換了public key。“From the Jenkins master ~/.ssh”即使用master宿主機器“~/.ssh”目錄下的公私鑰。

然後,我們“新建”:


技術分享

因為我們是基於Maven構建項目,所以選擇第二項,如果你已經創建過類似的item,可以選擇“復制已有的item”,輸入item的名字,那麽它相應的配置就會導入,就像模板一樣,我們無需每次都重復填寫配置表單。

在創建item時,我們還需要指定,這個item的job運行結果最終保存在哪個“節點”上,例如web項目最終發布在哪個server上,在jenkins中,master和slaver都稱為“節點”。


技術分享

指定Git庫的地址,並配置master與GitLab通訊的SSH驗證機制:


技術分享

因為master、slave均需要使用Git從遠端下載代碼,在這個模塊中,“Credentials”選擇剛才我們添加的“root”,這樣jenkins使用Git下載代碼時將會把SSH的秘鑰發過去。此外,我們還需要在GitLab中目標項目中增加“deploy key”:


技術分享

我們將master、slave兩個機器的public key添加到GitLab項目的“deploy key”中。如果你的item無法正確訪問Git,比如“驗證被拒絕”,你應該嘗試通過shell登錄到master、slave機器上,使用git命令嘗試下載項目代碼,可能因為jenkins無法跳過ssh的“授權確認”導致。

當代碼從Git下載之後,啟動Maven build階段:


技術分享

在“Pre step”中,我們增加了一小段shell,主要作用就是在發布之前,先刪除web應用的tomcat中原有的ROOT.war(在某些版本的tomcat,還需要增加一行“rm -r -f ROOT”,即將原有項目的所有文件刪除,才能觸發tomcat undeploy操作),這或許是“Deploy plugin”的bug,如果ROOT.war已經存在,則無法再次deploy/redeploy。

在Maven build時,我們指定“Goals”,這個很重要,否則Maven build就沒有意義了。“Goals and options”根據個人項目的情況來定義,選擇合適的profile環境。

下面我們介紹“Deploy plugin”,這個插件就是將Maven打包生成的war,發布到指定的tomcat下。很好的一個插件。


技術分享

其中“WAR/EAR files”選項指定war的位置,這個路徑是個相對路徑,相對於“/home/jenkins_home/workspace/{你的item名稱}”,本實例是一個maven多模塊項目,且每個module打包的名稱都為ROOT.war,這樣方便部署。 請管理員指定正確的路徑。

Containers中,我們使用了tomcat 7,輸入上文我們設定的用戶名和密碼,指定tomcat Url,需要註意,既然應用是基於http manager的方式deploy,那麽此tomcat的webapps自帶的“manager”項目不能被刪除,同時tomcat還需要處於啟動狀態。(tomcat也可能以為死亡,所以建議在pre step中加上對tomcat狀態的判斷,如果tomcat死亡,先執行startup.sh)。

如果在部署時,報錯。請按照如下方式排查:

1)tomcat是否已經啟動。

2)tomcat-users.xml是否配置正確。

3)tomcat的版本和“Deploy plugin”中container指定的是否一致。

4)tomcat下是否已經有ROOT項目,如果有,請刪除,然後重啟tomcat,此後再使用jenkins發布,因為reploy時會檢測舊的ROOT和新的ROOT.war項目的版本相容性,如果不同,則會導致reploy失敗。

到此為止,第一個item配置完畢,保存後即可通過“立即構建”來部署我們的項目了。

7、Slave節點

通過上文,我們已經在Slave機器上安裝好了SSH、Git、Maven、JDK等,同時我們也需要在Slave節點安裝一個tomcat,用來部署web application。

需要註意的是,jenkins的slave不需要像master一樣部署在tomcat上,我們只需要在jenkins的頁面上操作即可,master將會通過ssh將slave.jar文件到slave節點上,並啟動slave。

通過導航:“系統管理”-->“節點管理”-->“新建節點”,來增加slave。其實此時我們已經看到“master”節點已經被默認添加進來了。


技術分享

保存後,會提示你“啟動slave”,你可以根據需要是否啟動slave。

此後那些需要部署在slave宿主機器上的web應用,只需要在創建item時指定“Restrict where project can be run”為slave即可。

---END---

other: profile

各屬性節點的值,用占位符"${屬性名}"占位,maven在compile/package時,會根據profile的環境自動替換這些占位符為實際屬性值。

默認情況下:

maven package

將采用默認激活的profile環境來打包,也可以手動指定環境,比如:

maven package -P dev

將自動打包成dev環境的部署包(註:參數P為大寫)

gitlab/github可以添加Webhooks實現自動部署

如果是springboot項目,則配置更簡單


技術分享


技術分享


Jenkins + Git + Maven + tomcat集成環境搭建