持續(xù)集成:Continuous Integration,簡(jiǎn)稱CI,意思是,在一個(gè)項(xiàng)目中,任何人對(duì)代碼庫(kù)的任何改動(dòng),都會(huì)觸發(fā)CI服務(wù)器自動(dòng)對(duì)項(xiàng)目進(jìn)行構(gòu)建,自動(dòng)運(yùn)行測(cè)試,甚至自動(dòng)部署到測(cè)試環(huán)境。這樣做的好處就是,隨時(shí)發(fā)現(xiàn)問(wèn)題,隨時(shí)修復(fù)。因?yàn)樾迯?fù)問(wèn)題的成本隨著時(shí)間的推移而增長(zhǎng),越早發(fā)現(xiàn),修復(fù)成本越低。當(dāng)你想要更新你的項(xiàng)目,只要?jiǎng)邮痔峤淮a到你的代碼倉(cāng)庫(kù),剩余的更新部署操作就只管交由CI服務(wù)器來(lái)完成就好,這次使用的CI工具是JenKins。
- 搭建Jenkins持續(xù)集成服務(wù)器可以分為兩大步驟,一是在服務(wù)器安裝好所需的軟件,二是配置我們的持續(xù)集成項(xiàng)目
-
安裝所需的各種軟件
-
安裝啟動(dòng) Jenkins
- 從Jenkins官方網(wǎng)站下載最新的rpm包
執(zhí)行命令 rpm -ivh xxx.rpm 安裝Jenkins //啟動(dòng)JenKins /etc/init.d/jenkins start 瀏覽器輸入 http://xxx服務(wù)器地址:8080/ //默認(rèn)端口號(hào)是8080
Jenkins啟動(dòng)1.pngJenKins啟動(dòng).png-
JenKins默認(rèn)端口號(hào)是8080,這與Tomcat默認(rèn)端口號(hào)沖突,所有我們可以把Jenkins的端口號(hào)改成我們自己定義的端口號(hào) 9090
-
修改端口號(hào)的文件為 /etc/sysconfig/jenkins,字段為JENKINS_PORT
執(zhí)行命令進(jìn)行修改,如果碰到無(wú)法啟動(dòng)Jnekins, 無(wú)法啟動(dòng)(如遇此Starting Jenkins bash: /usr/bin/java: No such file or directory錯(cuò)誤 )修改 /etc/init.d/jenkins 加入 /opt/jdk1.8.0_181/bin/java原因 是Java的環(huán)境變量沒(méi)有找到,一般使用centos服務(wù)默認(rèn)安裝openjdk,如果自己卸載openJdk并重新安裝sun的JDK,則也需要在該文件中加入路徑,如圖所示 vim /etc/sysconfig/jenkins //添加Java地址 vim /etc/init.d/jenkins
修改Jenkins端口.png添加Java地址.png -
-
-
修改端口無(wú)法啟動(dòng)的情況,有可能是服務(wù)器防火墻沒(méi)有添加端口的監(jiān)聽(tīng),導(dǎo)致無(wú)法訪問(wèn)
vim /etc/sysconfig/iptables 查看是否監(jiān)聽(tīng)端口(如果配置了自己定義的端口,需要先訪問(wèn)該端口一次才能看到監(jiān)聽(tīng)) netstat -ntlp //重啟防火墻配置(不重啟端口還是無(wú)法生效) service iptables restart
只需要在訪問(wèn)jenkins服務(wù)器的網(wǎng)址url地址后加上exit。例如我jenkins的地址http://localhost:8080/,那么我只需要在瀏覽器地址欄上輸入http://xxx:9090/exit 網(wǎng)址就能關(guān)閉jenkins服務(wù).
-
重啟Jenkies
//xxx:8080 是搭建Jenkins服務(wù)器地址 http://xxx:8080/restart
重新加載配置信息
```
http://localhost:8080/reload
```
-
安裝jdk
```
查看Java相關(guān)的包信息:
rpm -qa|grep java (或rpm -qa|grep jdk,rpm安裝后,包名里沒(méi)有Java)
卸載
yum -y remove java [包名]
例如
yum –y remove java java-1.8.0-openjdk-1.8.0.131-3.b12.el7_3.x86_64
jdk 卸載方法 https://blog.csdn.net/xyj0808xyj/article/details/52444694
//解壓到指定目錄
tar -zxvf jdk-8u181-linux-x64.tar.gz -C /opt/
//編輯配置文件
vim /etc/profile
export JAVA_HOME=/opt/jdk1.8.0_181
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$CLASSPATH
//更新配置文件
source /etc/profile
```
-
安裝Tomcat
官網(wǎng)下載 Tomcat8.5
直接解壓到服務(wù)器(注意這里指的服務(wù)器是項(xiàng)目部署的服務(wù)器,應(yīng)該是和部署JenKins的服務(wù)器不同)
-
強(qiáng)制關(guān)閉 tomcat 命令
//強(qiáng)制關(guān)閉 ps -ef|grep tomcat //殺掉無(wú)法關(guān)閉進(jìn)程 kill -9 XXXX
-
安裝 git (安裝在部署JenKins服務(wù)器上)
安裝依賴 yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel asciidoc yum install gcc perl-ExtUtils-MakeMaker 如果已經(jīng)安裝了git,但是版本太老,可以先卸載 yum remove git 下載git包解壓 tar -vxf git-2.15.1.tar.gz -C /opt 進(jìn)入git 目錄 cd /opt/git-2.18.0/ 執(zhí)行以下命令 make prefix=/usr/local/git all make prefix=/usr/local/git install echo "export PATH=$PATH:/usr/local/git/bin" >> /etc/profile //配置環(huán)境變量 source /etc/profile //跟新配置文件 git --version 查看git版本
- 安裝 maven(安裝在部署JenKins服務(wù)器上)
-
- 后臺(tái)項(xiàng)目為spring-boot搭建,需要安裝maven
- 下載 [maven 3.5.4](http://maven.apache.org/download.cgi)
```
執(zhí)行以下命令
tar -zxvf apache-maven-3.3.9-bin.tar.gz -C /opt
在/etc/profile文件末尾增加以下配置
M2_HOME=/opt/tyrone/maven (注意這里是maven的安裝路徑)
export PATH=${M2_HOME}/bin:${PATH}
重載/etc/profile這個(gè)文件
source /etc/profile
```
[圖片上傳失敗...(image-ae6fb0-1535116185320)]
- GitLab服務(wù)器配置
-
- 由于公司已經(jīng)搭建好Gitlab服務(wù)器,所以我也沒(méi)有配置過(guò)Gitlab,不過(guò)Gitlab配置網(wǎng)上已經(jīng)有很多資料,可以自行百度。
-
Jenkins配置新建項(xiàng)目配置
-
Jenkins配置
第一次進(jìn)入Jnekins,首先根據(jù)提示找到安裝服務(wù)器的密碼
如果服務(wù)器可以聯(lián)網(wǎng),則選擇他推薦的插件直接安裝,如果服務(wù)器無(wú)法連接外網(wǎng),只是在公司內(nèi)網(wǎng)環(huán)境,則可以離線下載插件再上傳到我們服務(wù)器的Jenkin中,離線插件下載地址,這種方式需要耐心,因?yàn)樾枰惭b的插件可不止一兩個(gè),如果你的服務(wù)器不能上網(wǎng),我這有一份下載好的插件,可以自行去下載(下載地址)
-
在Jenkins系統(tǒng)管理模塊的系統(tǒng)配置中配置我們的Gitlab,需要登錄到Gitlab中獲取APIToken
系統(tǒng)配置GitLab.png獲取API Token.pngGitLab API Token配置 .png -
生成ssh key(在部署Jenkins服務(wù)器上生成)
-
配置SSH KEY ,用于后續(xù)項(xiàng)目可以通過(guò)Jenkins部署到應(yīng)用服務(wù)器
輸入命令,一路回車 ssh-keygen -t rsa 現(xiàn)在你的私鑰被放在了~/.ssh/id_rsa 這個(gè)文件里,而公鑰被放在了 ~/.ssh/id_rsa.pub 這個(gè)文件里 可以將私鑰配置到JneKins的系統(tǒng)設(shè)置中,配置框選項(xiàng)是需要Jenkins安裝SSH插件的,如下圖所示 公鑰則配置到各個(gè)應(yīng)用服務(wù)器的這個(gè)目錄下/root/.ssh/authorized_keys,沒(méi)有authorized_keys則創(chuàng)建這個(gè)文件,如下圖所示 最后測(cè)試應(yīng)用服務(wù)器是否都能成功連接,如下圖所示
ssh私鑰配置.png公鑰復(fù)制到應(yīng)用服務(wù)器authorized_keys.png測(cè)試配置公鑰的應(yīng)用服務(wù)器是否連接成功.png-
接下來(lái)還是系統(tǒng)管理模塊中的全局工具配置 Jenkins的 JDK、git和maven。前面我們已經(jīng)把這些工具都給安裝了,現(xiàn)在配置到Jenkins中,如下圖所示
配置Jenkins jdk git.png配置Jenkins maven.png
-
-
新建項(xiàng)目配置
- 新建一個(gè)maven項(xiàng)目(沒(méi)有maven項(xiàng)目選項(xiàng)則需要下載對(duì)應(yīng)插件)
新建maven項(xiàng)目.png-
首先配置源碼管理,如圖
新建項(xiàng)目源碼管理配置.png -
配置項(xiàng)目構(gòu)建觸發(fā)器
配置項(xiàng)目構(gòu)建觸發(fā)器.png -
配置maven項(xiàng)目編譯
配置maven項(xiàng)目編譯.png 項(xiàng)目構(gòu)建成功后部署應(yīng)用服務(wù)器的配置
項(xiàng)目構(gòu)建成功后部署應(yīng)用服務(wù)器的配置.png-
Tomcat重啟腳本(應(yīng)當(dāng)放在與Tomcat目錄同路徑下)
#! /bin/sh echo '####################開(kāi)始自動(dòng)部署####################' export JAVA_HOME=/usr/local/jdk1.8.0_181 path=`pwd` #當(dāng)前路徑 tomcatPath=/data/XXXX/tomcat_gxxmt_8080 #指定tomcat文件目錄名稱 cd ../$tomcatPath/bin #進(jìn)入tomcat的bin目錄 PID=$(ps -fu `whoami`|grep tomcat|grep -v grep|awk '{print $2}') if [ -z "$PID" ];then echo "no tomcat process" else ./shutdown.sh #停止tomcat服務(wù) fi cd ../webapps #進(jìn)入tomcat的webapps目錄 rm -rf XXXX-api echo '####################刪除完成####################' #rm -fr gxxmt-api.war #刪除test文件目錄 #mv gxxmt-api.war gxxmt-api.war.$(date +%Y%m%d) #備份webapps下的test16 cp $path/test.war ./ #復(fù)制test.war到webapps路徑下 #cd /var/lib/jenkins/workspace/gxxmt-api/gxxmt-api/target/ #cp gxxmt-api.war /data/gxxmt/tomcat_gxxmt_8080/webapps/ cd ../bin ./startup.sh #啟動(dòng)tomcat服務(wù) echo '####################部署結(jié)束####################'
項(xiàng)目構(gòu)建成功并發(fā)布到了對(duì)應(yīng)服務(wù)器執(zhí)行對(duì)應(yīng)腳本,這里就可以看到JenKins的靈活性,可以配置多臺(tái)發(fā)布的應(yīng)用服務(wù)器的多個(gè)Tomcat,靈活自動(dòng)部署應(yīng)用服務(wù)器配置
-
項(xiàng)目構(gòu)建編譯部署成功
項(xiàng)目構(gòu)建編譯部署成功.png
-
-
集成部署遇到的問(wèn)題
-
ERROR: Exception when publishing, exception message [Exec timed out or was interrupted after 120,000 ms](執(zhí)行腳本沒(méi)有正常退出,導(dǎo)致部署超時(shí))
錯(cuò)誤1.png
-
```
nohup sh /data/gxxmt-api/restart.sh
//當(dāng)我們使用nohup命令的的時(shí)候,日志會(huì)被打印到nohup.out文件中去。
//如果我們不做任何處理,會(huì)隨著每次的重新啟動(dòng),nohup.out會(huì)越來(lái)越大
//。所以我在我執(zhí)行的腳本中添加了
cp /dev/null nohup.out
```
-
在jenkins項(xiàng)目配置SSH Publishers勾選了Exec in pty,表示執(zhí)行完腳本立即退出
錯(cuò)誤1解決勾選Exec in pty.png - jenkins主目錄遷移,jenkins默認(rèn)主目錄一般都是安裝在系統(tǒng)盤,運(yùn)行一段時(shí)間后項(xiàng)目部署的歷史版本,日志文件,工作控件都會(huì)占用大量的系統(tǒng)空間,這樣就會(huì)引發(fā)系統(tǒng)盤磁盤空間不足,首先我們可以修改jenkins主目錄
//更改主目錄 vim /etc/sysconfig/jenkins JENKINS_HOME="/data/jenkins" 復(fù)制 /var/lib/jenkins/ 目錄到 /data目錄下 修改目錄用戶權(quán)限 chown -R jenkins:jenkins /data/jenkins 重啟 /etc/sysconfig/jenkins restart
主目錄修改成功.png
-
其次我們還可以在項(xiàng)目配置中設(shè)置丟棄歷史構(gòu)建
設(shè)置丟棄歷史構(gòu)建.png -
錯(cuò)誤信息:Url is blocked: Requests to the local network are not allowed,意思為Gitlab 設(shè)置Jenkins的webhook地址無(wú)法設(shè)置
WebHook地址無(wú)法設(shè)置.png -
升級(jí)新版Gitlab,要允許WebHook,需要在在Gitlab的Admin賬戶中,在settings標(biāo)簽下面,找到OutBound Request,勾選上Allow requests to the local network from hooks and services ,保存更改即可解決問(wèn)題(如下圖所示)
Gitlab 允許WebHook.png Gradle 編譯Android 項(xiàng)目 /lib64/libc.so.6: version `GLIBC_2.14’ not found,系統(tǒng)是CentOS 6.9,最高支持glibc的版本為2.12,而研發(fā)程序要2.14版本,所以需要升級(jí)。
```
//查看系統(tǒng)版本
cat /etc/redhat-release
//查看glibc庫(kù)版本
strings /lib64/libc.so.6 |grep GLIBC_
//下載glibc庫(kù) 并安裝
#下載
wget http://ftp.gnu.org/gnu/glibc/glibc-2.14.tar.gz
wget http://ftp.gnu.org/gnu/glibc/glibc-ports-2.14.tar.gz
#解壓
tar -xvf glibc-2.14.tar.gz
tar -xvf glibc-ports-2.14.tar.gz
#創(chuàng)建相關(guān)目錄
mv glibc-ports-2.14 glibc-2.14/ports
mkdir glibc-build-2.14
cd glibc-build-2.14/
#生成C編譯的環(huán)境
yum -y install gcc
#編譯C
../glibc-2.14/configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin
make
# 安裝剛才編譯好的 libc.so
makeinstall
# 查看glibc庫(kù)版本
strings /lib64/libc.so.6 |grep GLIBC_
```
最后
到此,我們的持續(xù)集成服務(wù)器已經(jīng)搭建完成,這時(shí)候你只要?jiǎng)邮痔峤灰幌麓a到你前面構(gòu)建觸發(fā)器設(shè)置的分支(一般為主分支),剩余的項(xiàng)目構(gòu)建,部署等一系列重復(fù)繁瑣的工作就交由Jenkins幫我們自動(dòng)完成就可以了,省時(shí)又方便。文章中如果有錯(cuò)誤,請(qǐng)大家給我提出來(lái),大家一起學(xué)習(xí)進(jìn)步,如果覺(jué)得我的文章給予你幫助,也請(qǐng)給我一個(gè)喜歡或者關(guān)注。
-
參考鏈接: