jenkins 部署 git 專案
背景
最近安裝Jenkins,參照網上的各種資料進行嘗試,折騰了好久,但是查找了這麼多資料,相似度在90%以上!!!,相同的安裝過程,測試了幾臺機器,未曾成功,不得不感慨自己能力有限,最終慢慢摸索,形成思路,現分享給大家,希望大家在安裝的時候少走彎路。
PS:本人很痛恨那種貼上複製,毫無思考的博主,本想著拿著解決問題的心態,但結果還是一樣,不但浪費了大家的時間,還浪費了大家的感情,所以,我把我遇到的問題和解決的方式記錄下來和大家分享。
知識背景
首先需要理解的是,Jenkins是幫我們將程式碼進行統一的編譯打包、還可以放到tomcat容器中進行釋出。
意思是我們通過配置,將以前:編譯、打包、上傳、部署到Tomcat中的過程交由Jenkins,Jenkins通過給定的程式碼地址URL,將程式碼拉取到其“宿主伺服器”(這是我個人的稱呼,在下邊會用到,就是Jenkins的安裝位置),進行編譯、打包和釋出到容器中。
因此我們可以注意到的是,在Jenkins的宿主伺服器中必須要有可以進行:程式碼clone(Git)、程式碼編譯(Maven)、程式碼執行(Tomcat)的基本環境,其他文章上來就是安裝jenkins,忽略了一些基本的配置。
下邊就開始講解各部分的安裝過程,如果已經安裝某一步的環境,則可以以此進行下一步。
一、Git的安裝
1、安裝依賴
sudo yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker
- 1
- 1
注意:perl-ExtUtils-MakeMaker 也是這些安裝列表中的一員,不要因為顯示的換行造成大家認為是兩條執行命令。
2、下載Git
選擇一個目錄,存放下載的git,例如我的是:/home/xuliugen/tmp,大家可以根據需求到官網下載相應的版本
wget https://github.com/git/git/archive/v2.3.0.zip
- 1
- 1
3、解壓git
下載之後是這樣的,不要感到奇怪,直接解壓即可
因為下載的是一個zip,所以使用命令將其解壓到git目錄下:
#引數-d 後邊的是解壓到的目錄
unzip v2.3.0 -d git
- 1
- 2
- 1
- 2
4、編譯安裝git
進入git目錄
將其安裝在“/usr/local/git”目錄下,命令如下:
make prefix=/usr/local/git all
sudo make prefix=/usr/local /git install
- 1
- 2
- 1
- 2
5、配置Git
sudo vim /etc/profile #編輯profile檔案
- 1
- 1
然後而已看到這個檔案已經有很多配置了,只需要在最下邊新增git的路徑即可:
export PATH=/usr/local/git/bin:$PATH
- 1
- 1
將這段話放在最後邊,然後使用source命令應用修改:
source /etc/profile
- 1
- 1
6、檢驗Git是否安裝成功
git --version
- 1
- 1
二、Maven安裝
1、下載和解壓Maven
Maven的安裝包下載可以根據需求找到合適的版本,解壓之後,我的位置是:
2、配置Maven
編輯:~/.bash_profile檔案,根據註釋相應的修改即可
# maven所在的目錄
export M2_HOME=/home/xuliugen/software/maven/apache-maven-3.3.3
# maven bin所在的目錄
export M2=$M2_HOME/bin
# 將maven bin加到PATH變數中
export PATH=$M2:$PATH
# 配置JAVA_HOME所在的目錄,注意這個目錄下應該有bin資料夾,bin下應該有java等命令
export JAVA_HOME=/usr/lib/jvm/jre-1.7.0
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
然後執行:source ~/.bash_profile 應用修改
3、檢視Maven是否安裝成功
使用:mvn -version 即可檢視結果
三、Jenkins的部署
Jenkins的安裝很簡單,直接將war放到容器中進行執行即可
1、將jenkins放到Tomcat中並解壓,啟動Tomcat,成功啟動之後訪問ip和埠如下:
啟動成功之後,進入的介面如上,表示啟動成功。
2、安裝外掛
在進行配置之前,由於使用的是Git拉去程式碼的方式,所以要首先安裝外掛
找到:外掛管理 在“可選外掛”介面使用ctrl+f 搜尋:Deploy to Container Plugin 外掛(這個是支援將程式碼部署到tomcat容器的)
勾選,點選下邊的按鈕:直接安裝,這個可能時間較久,等待即可。
安裝完之後,如果勾選了:安裝完成後重啟jenkins 那麼會重啟jenkins。
然後安裝:GIT plugin,何上邊的步驟一樣,如果使用上述的方式,由於網路的原因,可能會安裝失敗,這就需要我們使用另一種方式進行安裝。
使用同樣的方式在“可選外掛”中搜索GIT plugin,找到之後點選藍色連結(最好右鍵在新視窗中開啟,放置覆蓋jenkins介面)
會跳轉到Git Plugin的外掛資訊地址:
點進去下載的是一個hpi檔案
然後同樣的在:系統管理–管理外掛–高階Tab中,下拉可以看到上傳外掛,然後選擇檔案上傳剛才下載的hpi檔案,即可,上傳完之後,會自動安裝。上述安裝Deploy to container Plugin的方式也可以採用這種方式。
都安裝完之後,在已安裝Tab中可以看到剛安裝的外掛:
3、進行配置
看到上圖中的左側有一個:系統管理 點選去
上邊的第一行黃色資訊,表示編碼問題,在Tomcat–>conf–>server.xml檔案中修改即可
4、Jenkins系統設定
點選:系統設定,這裡沒有強調的都設定為預設即可
(1)JDK,別名是任意的,選擇自己jdk的位置,jenkins推薦使用sun jdk而不是openjdk
(2)Git 的配置
注意這裡的git位置,是可執行檔案的地址,即是git–bin–下的可執行檔案 git的目錄(類似於Java中bin下的java可執行檔案位置)
如果填錯,後期回報無法找到git等錯誤(最下邊,其他問題下的第三個問題),請大家注意!
(3)Ant的配置
由於本次並沒有用到Ant,不做配置,大家可以根據配置進行設定
(4)Maven的配置,選擇自己maven的存放位置
(5)Jenkins Location
這裡配置的是ip加埠和一個路徑名稱,郵箱要進行設定,後期會發送jenkins執行的結果到郵件中
(6)郵件通知
這裡我配置的QQ郵箱,大家根據情況進行設定相應的smtp伺服器,使用者名稱、密碼分別為自己的QQ郵箱何密碼,如果不進行設定,後期jenkins構建專案的時候會報錯,報錯資訊很好理解也很好找到是沒有配置郵件的問題。
首先,要保證郵件的smtp和pop是開啟狀態的,這樣的話才可以通過驗證:
最後點選下邊的應用、儲存即可
5、Configure Global Security
然後回到系統管理,看到Configure Global Security 點選進去,根據下邊進行配置即可
點選應用 儲存之後,然後在螢幕的右上角,有一個登入-註冊 ,點選註冊即可實現使用者的登入。
這裡,如果是公司內網的話,或者最後搭建的jenkins是公司使用,那麼最好使用者名稱和密碼為公司的賬戶密碼,郵件也是公司的郵件,這樣的話方便後期的操作。
至此Jenkins的基本配置完成。
建立Job
1、建立專案
點選登入之後,會看到下邊的介面中:My Views
點選進去
點選:建立一個新任務
選擇maven專案,點選OK,這裡的Item名稱是後邊需要用到的,下邊的配置也有用到這個的,大家可以很好的對應。
2、進行專案的配置
(1)原始碼管理選擇Git,這個時候新增url之後,下邊會報錯,顯示讓去認證,認證即可(其他的安裝中又遇到這個問題),如果認證失敗,請下載認證Github Authentication plugin外掛,這個在外掛管理的可選外掛中搜索安裝。
我這裡的rul是我在gitos上的一個專案,credentials是我在gitos上的使用者名稱和密碼認證。
(2)構建觸發器,就是什麼時候執行jenkins的自動化部署
選擇第一個,其他的基本是定時執行什麼的,大家可以自行查詢,檢視如何設定,根據需要進行配置
(3)Post Steps
選擇上圖中的,然後下邊 的Execute shell如下,指令碼的編寫在下邊進行了詳細的說明:
#!/bin/bash
#copy file and restart tomcat
export JAVA_HOME=/opt/tools/jdk1.7.0_67
export CATALINA_HOME=/opt/tools/apache-tomcat-7.0.70
export BUILD_ID=dontKillMe
tomcat_path=/opt/tools/apache-tomcat-7.0.70
war_name=webTest.war
#war_path=http://132.153.131.237/:8022/jenkins/job/ManenDemo/ws/targetserver_port=8082
file_path=~/.jenkins/jobs/test/workspace/webTest/target
$tomcat_path/bin/shutdown.sh
sleep 3s
echo "rm -rf ${tomcat_path}/webapps/ROOT/*"
rm -rf ${tomcat_path}/webapps/ROOT/*
cd $file_path
cp ${war_name} ${tomcat_path}/webapps/ROOT/
cd $tomcat_path/webapps/ROOT/
unzip ${war_name}
rm -rf ${war_name}
sleep 5s
#$tomcat_path/bin/startup.sh
cd $tomcat_path/bin/
./startup.sh
- 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
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 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
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
(4)郵件通知
至此基本設定完畢,點選應用、儲存
(5)立即構建
點選左上角的立即構建
然後看到下邊的Build History 點選藍色的進去,會進入Console
下邊是進行jar的下載,會下載到宿主伺服器的maven倉庫中:
下邊的資訊表示專案編譯通過:
下邊是執行指令碼的資訊:
指令碼的分析
在Jenkins的伺服器上檢視:
可以看到在/root/.jenkins這個目錄,實際存放了Jenkins拉取Git程式碼之後編譯好war的位置,到此,大家也許都該明白了,編譯後的位置就在這裡啊!然後,接著是部署到宿主伺服器的Tomcat容器中,如何將編譯好的war放到tomcat中,這就需要指令碼來完成,也是上述過程中配置的過程,下邊對每一行進行分析。
首先我們應該明白,將編譯好的war放到tomcat容器中,我們首先要知道這兩個的位置:編譯後war的位置和目標容器的位置,很顯然我們是知道的。
1、指令碼檔案的頭,這個沒得說
#!/bin/bash
- 1
- 1
2、環境變數設定
export JAVA_HOME=/data/home/server/jdk
export CATALINA_HOME=/home/xuliugen/dubbo-provider
export CATALINA_BASE=/home/xuliugen/dubbo-provider
export BUILD_ID=dontKillMe
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
上邊的各個位置,大家也許都知道,CATALINA_HOME和CATALINA_BASE的位置就是Tomcat容器的位置,這裡根據需求我將Tomcat容器的名字改為dubbo-provider了,如果改成/home/xuliugen/tomcat是不是更好理解。
export BUILD_ID=dontKillMe這一句很重要,因為該job啟動完後執行下一job,jenkins直接把tomcat程序殺了,所以無論指令碼中怎麼寫了啟動tomcat的命令,他是不會啟動的。雖然上述截圖中顯示了Tomcat started、server restarted但是訪問專案地址是訪問不了的,這在:其他問題的第二個說明了這個問題。
3、其他路徑位置
tomcat_path=/home/xuliugen/dubbo-provider #我的Tomcat位置
project=dubbo-provider #我的專案編譯的名稱
war_name=dubbo-provider.war #最後打包的war名稱
war_path=http://132.153.131.237/:8022/jenkins/job/ManenDemo/ws/targetserver_port=8082 #宿主伺服器的ip何埠
file_path=~/.jenkins/jobs/ManenDemo/workspace/spring_provider/target #編譯好的war包存放地址
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
這個:war_path 其實也就是Jenkins的宿主伺服器位置IP,埠為jenkins執行的埠,大家只需要將ip地址埠ManenDemo換成自己的即可;
file_path:就是Jenkins幫我們編譯好的專案war的位置,上圖中大家也可以看到,並且大家不可以完全按照上邊的路徑,要找到自己宿主伺服器上實際war的位置,進行設定。
4、耳熟能詳的執行命令
下邊就是我們在使用原始方式,部署war的命令,大家很簡單的可以理解,其中:
注意:個人寫指令碼的能力有限,所以我是假設專案已經在執行的情況下,因此我上來就是先關閉Tomcat,(正確的方式,應該判斷埠是否開啟,如果本身tomcat未啟動,我的這種情況,會在Jenkins的Console中報拒絕連線的問題,如下圖)。
另外用到了sleep 3s 這個可以讓執行緒休眠一下,這樣的話可以看一下tomcat的日誌資訊。
下邊的指令碼就是刪除原來容器中的檔案,然後將編譯好的war移動到容器中,解壓。執行tomcat。
$tomcat_path/bin/shutdown.sh
sleep 3s
echo "rm -rf ${tomcat_path}/webapps/ROOT/*"
rm -rf ${tomcat_path}/webapps/ROOT/*
cd $file_path
cp ${war_name} ${tomcat_path}/webapps/ROOT/
cd $tomcat_path/webapps/ROOT/
unzip ${war_name}
rm -rf ${war_name}
sleep 5s
cd $tomcat_path/bin/
./startup.sh
echo "server restarted"
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
將專案佈署到遠端Tomcat
上述建立專案,可以看出是在本地進行執行的,也就是進行編譯後執行的Tomcat是何Jenkins的宿主伺服器是在一起的,這很顯然不符合我們常規的公司及其部署的方案,通常是將編譯之後的程式碼在執行到其他的Tomcat伺服器中的,下邊有兩種方式,將編譯之後的專案部署到遠端伺服器中。
1、使用指令碼的方式部署到遠端伺服器
2、使用Deploy to container Plugin
外掛部署到遠端伺服器
外掛下載地址:http://updates.jenkins-ci.org/download/plugins/deploy/1.10/deploy.hpi
上述的開始階段就安裝了這個外掛,下邊就開始發揮其作用。
在建立的Job左側點選設定,其他配置何在遠端搭建專案是一致的,不同的是在這個地方:
以前我們在編譯之後,將編譯後的通過指令碼補助到Jenkins的宿主伺服器,使用外掛,就不需要這種方式了。
還有就是的在構建之後,將編譯後的檔案**/target/dubbo-provider.war
(就是上邊的~/.jenkins/jobs/ManenDemo/workspace/spring_provider/target目錄)部署到下邊的遠端Tomcat容器中;這裡Containers的使用者名稱和密碼是Tomcat管理員的賬戶密碼,Tomcat URL 就是你需要進行部署的遠端Tomcat伺服器的ip和埠。
這裡需要進行設定的是遠端Tomcat的管理員資訊,修改遠端Tomcat容器下的conf–tomcat-users.xml檔案,在內新增下邊的內容:
注意 manager-script 這個必須得有,不然的話這個使用者就沒有操作指令碼的許可權了。
<role rolename="manager"/>
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<role rolename="admin"/>
<user username="admin" password="admin" roles="admin,manager,manager-script,manager-gui"/>
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
即可實現遠端的訪問,測試是可以通過的,但是有一個問題,通過這種方式,只將war複製到了wenapps下:
因此這種方式的話,我們訪問的時候必須是ip、埠和專案名,例如:
http://115.159.151.247:8030/dubbo-provider/
- 1
- 1
當然這種方式 也是在實際的應用中不提倡的,解決方式就是修改Tomcat預設的訪問路徑即可,設定Tomcat–conf–server.xml檔案如下:
在Host節點之間新增:
<Context path="" docBase="dubbo-provider" debug="0" reloadable="true" />
- 1
- 1
或者在docBase裡邊輸入專案的絕對路徑,例如我的:
<Context path="" docBase="/home/xuliugen/dubbo-provider/webapps/dubbo-provider" debug="0" reloadable="true" />
- 1
- 1
其他問題
1、部署專案的時候報錯
這個大家很好理解,是因為下載jar失敗的問題,由於是第一次使用Maven,需要第一次下載很多jar到Maven倉庫中,由於網路的問題下載失敗,大家可以多次構建讓他重新下載,或者直接到:https://repo.maven.apache.org/maven2 根據報錯的jar,在maven2中找到自己缺失的jar,然後在/root/.m2/repository
相應的位置新增jar即可。
2、編寫指令碼檔案啟動tomcat但是專案仍然執行不起來
就是上邊說道的問題了:
新增:export BUILD_ID=dontKillMe
,因為該job啟動完後執行下一job,jenkins直接把tomcat程序殺了,所以無論指令碼中怎麼寫了啟動tomcat的命令,他是不會啟動的。
3、遇到下邊的問題
這就是在系統設定的時候,設定的git的地址不對,上述已經說明了,應該是git的可執行檔案的地址,如果只是git的目錄,是無法找到git這個可執行檔案的,如下:
可以看出使用的是這個:/usr/local/git/bin/git 進行git倉庫的配置何程式碼的拉取,因此這設定git的目錄,jenkins預設是不會找bin目錄下的git可執行檔案的。
至此,Jenkins的部署完成,希望對大家有所幫助。