一.基礎(chǔ)知識
GitLab:是一個基于Git實現(xiàn)的在線代碼倉庫托管軟件,是用來提供代碼托管的。我們可以用在企業(yè)內(nèi)部網(wǎng)絡(luò)搭建私服。
jenkins:基于Java開發(fā)的一種持續(xù)集成工具,用于監(jiān)控持續(xù)重復(fù)的工作。在提供一個開放易用的軟件平臺,使軟件的持續(xù)集成變成可能。
maven:項目管理工具,在這里我們可以執(zhí)行maven命令來幫我們打包
jdk: Java 語言的軟件開發(fā)工具包
tomcat:輕量級應(yīng)用服務(wù)器
git:版本控制器
在日常開發(fā)中,以前的流程是需要把項目從gitlab上復(fù)制到本地,再打成war包,然后部署到tomcat服務(wù)器上運行。開發(fā)項目的過程中會經(jīng)常部署測試環(huán)境來驗證,重復(fù)以上操作會顯得很繁瑣,浪費大量時間,所以使用jenkins來實現(xiàn)持續(xù)集成,對整個開發(fā)項目的過程有著重要的戰(zhàn)略意義。我們開發(fā)軟件為了什么?對,簡化步驟,提高開發(fā)效率,節(jié)省時間。
請叫我靈魂畫師~
前提:這次整合,我是只使用2臺機器,服務(wù)器A裝jenkins,jdk,maven,服務(wù)器B裝gitlab和tomcat,其實應(yīng)該是要個服務(wù)器C裝tomcat,這樣思路就更清楚了,具體情況各位根據(jù)實際需求來定哈。
1)B服務(wù)器上gitLab安裝
1. 安裝依賴
sudo yum install curl policycoreutils openssh-server openssh-clients policycoreutils-python
sudo systemctl enable sshd
sudo systemctl start sshd
sudo yum install postfix
sudo systemctl enable postfix
sudo systemctl start postfix
注意:sudo systemctl start postfix 如果報錯,如下面所示
Job for postfix.service failed because the control process exited with error code. See "systemctl status postfix.service" and "journalctl -xe" for details.
解決辦法:修改 vi /etc/postfix/main.cf的設(shè)置
inet_protocols = all
inet_interfaces = all
2. yum 配置鏡像加速
我推薦清華大學(xué)鏡像源 :?https://mirror.tuna.tsinghua.edu.cn/help/gitlab-ce
操作如下:vi /etc/yum.repos.d/gitlab_gitlab-ce.repo
[gitlab-ce]
name=Gitlab CE Repository
baseurl=https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el$releasever/
gpgcheck=0
enabled=1
3. 更新本地云緩存`
sudo yum makecache`
4. 安裝`
? sudo yum install gitlab-ce
5. 修改配置項
默認是80端口,如果想要修改端口號的話,打開gitlab.rb文件,修改如下:
sudo vim /etc/gitlab/gitlab.rb
#修改配置項
external_url 'http://<你的服務(wù)器地址或域名>:<你想要設(shè)置的端口號>'
unicorn['port'] = <你想要設(shè)置的端口號>
prometheus['listen_address'] = 'localhost:<你想要設(shè)置的端口號>'
sudo gitlab-ctl reconfigure # 重新配置服務(wù);
6. 重啟gitlab
gitlab-ctl restart
打開http://<你的服務(wù)器IP>:<80>,會彈出一個設(shè)置初始密碼的界面,按照要求輸入初始密碼,就會跳轉(zhuǎn)到登錄頁面。gitlab管理員用戶名為root。
我這邊是自己創(chuàng)建了用戶,下圖是注冊,完成后登陸。
7. 服務(wù)器A上配置免密碼登錄
客戶端命令行生成ssh
ssh-keygen -t rsa
它會生成公鑰id_rsa.pub和私鑰id_rsa,存放在.ssh目錄下。復(fù)制公鑰到Gitlab的用戶設(shè)置中的SSH Keys中,點擊保存。操作如下圖所示
有人問這樣做的目的是什么?問得好!這樣我們就能建立服務(wù)器A跟gitLab的安全連接,我們就可以通過git將gitlab倉庫里的代碼拉下來或者推送到倉庫。
2)A服務(wù)器上安裝jdk
centOS安裝jdk有三種,隨便選一種都可以,網(wǎng)上一大堆。我選中的是手動解壓安裝包。
卸載系統(tǒng)自帶的jdk(此步驟建立在centOS7自帶jdk1.8的情況,可以跳過,也可以自己安裝想要的jdk)
查看當(dāng)前系統(tǒng)jdk的版本:java -version。(如下圖的話則代表自帶,繼續(xù)下面步驟)
列舉匹配已安裝的java的軟件包:
yum list installed | grep java
卸載安裝的jdk
yum -y remove java-1.7.0-openjdk*?
yum -y remove java-1.8.0-openjdk*
當(dāng)結(jié)果出現(xiàn)了完畢!,就表示卸載成功。
輸入java -version 查看,驗證是否卸載成功。
2. 下載jdk1.8安裝包
jdk下載地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
下載 jdk-8u152-linux-x64.tar.gz(根據(jù)自己的系統(tǒng)位數(shù)選擇對應(yīng)的包)
然后使用Xftp將下載好的jdk-8u152-linux-x64.tar.gz上傳到CentOs上去,我選擇的是在usr下創(chuàng)建一個文件夾來專門放壓縮包。
3. 在user/local目錄下新建java文件夾
# cd /usr/local/
# mkdir java
# cd java
4.解壓
進到壓縮包所在的目錄,將jdk-8u152-linux-x64.tar.gz 解壓到我所創(chuàng)建的java文件中。
tar -zxvf jdk-8u152-linux-x64.tar.gz -C /usr/local/java
5.配置環(huán)境變量
export JAVA_HOME=/usr/local/java/jdk1.8.0_212
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
注釋:
JAVA_HOME指明JDK安裝路徑,就是剛才安裝時所選擇的路徑,此路徑下包括lib,bin,jre等文件夾(tomcat,Eclipse的運行都需要依靠此變量)。
PATH使得系統(tǒng)可以在任何路徑下識別java命令
特別注意:環(huán)境變量值的結(jié)尾沒有任何符號,不同值之間用:隔開(windows中用;)
6.使配置文件生效
source /etc/profile
7.測試配置是否成功
java -version
3 )Maven安裝
1. 獲取安裝包:鏡像。
wget https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.5.4/binaries/apache-maven-3.5.4-bin.tar.gz
2. 提前創(chuàng)建好maven文件夾,解壓tar包至maven文件夾
tar -zxvf apache-maven-3.5.4-bin.tar.gz -C /usr/local/maven
3.配置環(huán)境變量
修改 profile 文件
vim /etc/profile
export MAVEN_HOME=/usr/local/maven/apache-maven-3.5.4
export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$MAVEN_HOME/bin
修改完重載這個文件使文件立即生效,否則重啟計算機即可生效。
source /etc/profile
4. 驗證 版本
mvn? -v
顯示如下則代表成功
Apache Maven 3.5.4 (1edded0938998edf8bf061f1ceb3cfdeccf443fe; 2018-06-18T02:33:14+08:00)
Maven home: /usr/local/maven/apache-maven-3.5.4
Java version: 1.8.0_212, vendor: Oracle Corporation, runtime: /usr/local/java/jdk1.8.0_212/jre
Default locale: zh_CN, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-957.el7.x86_64", arch: "amd64", family: "unix"
4 )安裝jenkins
1. 安裝
wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
yum install -y jenkins
2. 關(guān)閉防火墻
systemctl stop firewalld.service
systemctl disable firewalld.service
3. 配置文件
vi /etc/sysconfig/jenkins
#修改下面內(nèi)容
JENKINS_USER="root"
...
端口設(shè)置成為被占用的
JENKINS_PORT="xxxx"
4. 啟動jenkins
systemctl daemon-reload
systemctl start jenkins
systemctl status jenkins
5 )安裝git
1. 獲取源碼包
wget https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.18.0.tar.gz
2. git構(gòu)建時需要的環(huán)境
yum groupinstall "Development Tools"
3. 安裝各種devel包
yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker
openssh-clients
4. 編譯并安裝,同時輸出執(zhí)行路徑到環(huán)境變量中
make prefix=/usr/local/git all
make prefix=/usr/local/git install
echo "export PATH=$PATH:/usr/local/git/bin" >> /etc/bashrc
source /etc/bashrc
5. 驗證能否正常運行:
git --version
1. 解鎖jenkins
按照提示將代碼復(fù)制到下面,然后點繼續(xù)。
2. 點擊左邊的安裝推薦的插件
好吧,等了好幾分鐘才裝完,耐心等待吧。
3. 創(chuàng)建管理員用戶,實例配置
注意!安裝配置jenkins的時候,會出現(xiàn)插件安裝失敗的情況。
原因:升級站點問題,站點位于國外,訪問起來比較吃力。
解決方式:更換為國內(nèi)的jenkins鏡像就可以了。
操作:系統(tǒng)管理>>管理插件>>高級
將 [升級站點] 更換為
http://mirror.xmission.com/jenkins/updates/current/update-center.json
隨后提交即可解決,如下圖。
如果是告訴你需要升級jenkins才能搞定,那就在線升級jenkins。
yum安裝的升級方法
1、service jenkins stop
2、yum update jenkins
3、service jenkins start
升級完就應(yīng)該沒問題了。
4. 配置jdk,maven,git
首先我們要配置jenkins編譯所需要的jdk,maven,順便把git也配置了。最后點擊保存。
注意:jdk home和maven home 可以輸入vim /etc/profile看到,直接復(fù)制粘貼就行。git的話輸入whereis git就可以查到了,一般是git/bin/git這個結(jié)尾的。
5. 在jenkins上系統(tǒng)設(shè)置gitlab和git
安裝Gitlab插件,Gitlab Hook插件,Git插件。打開設(shè)置,選擇插件管理。點擊可選插件,然后在搜索框里輸入就可以了,搜索到后點擊直接安裝。沒看懂的可以看我第六那個步驟。
安裝完之后,點擊系統(tǒng)設(shè)置。
找到Gitlab這個配置。
這邊需要添加憑證,我選用的類型是gitlab API token。
從哪里獲取呢?打開gitlab,用戶設(shè)置里面有個訪問令牌選項。
成功后會如下顯示。然后復(fù)制這個令牌,保存在你自己知道的地方,不保存就以后就看不到了。
接著把剛才復(fù)制的訪問令牌粘貼到添加的憑證那里去,點擊添加,然后前面的下拉框里選擇你剛才添加的憑證。
配置完gitlab后要配置git,2個選項一填就可以了,用戶名和郵箱。好了,配置結(jié)束。
6. 在jenkins上創(chuàng)建一個maven項目
點擊新建Item,或者開始創(chuàng)建一個新任務(wù),然后選擇新建maven項目。很多人說沒有,比如下圖。
那是因為沒有安裝一個Maven插件。在可選插件里輸入Maven Integration,點擊安裝,不好意思我安裝的比較快,沒來得及截圖。已經(jīng)在我安裝列表里了。
返回到主頁面,點擊新建,任務(wù)名字隨便起,選擇構(gòu)建一個maven項目,最后點擊確定。
7. 配置源碼管理
這里我們用來讓jenkins連接gitlab倉庫的。
首先打開gitlab,新建一個倉庫。這里我喜歡叫倉庫,但它翻譯成項目。用過github的朋友應(yīng)該喜歡叫倉庫吧。隨意啦,強迫癥。
寫倉庫名字,設(shè)置私有的,描述可寫可不寫,然后創(chuàng)建。
倉庫列表中就有了你新建的倉庫,點擊它進入倉庫。
復(fù)制倉庫url。
注意:一開始這個倉庫是空的,我這邊是剛才上傳了個helloworld的maven項目,用來測試下git能不能上傳代碼到這個倉庫,大家試下,后面jenkins配置需要這倉庫主分支不能為空。
我是自己windows上安裝了git,通過配置idea中的git來push代碼,當(dāng)然也需要生成ssh鑰匙在gitlab上添加sshkey。(前面步驟一開始我生成的ssh鑰匙是在我安裝jenkins的那臺服務(wù)器A上操作的,和這邊的是兩回事)。不懂的朋友可以百度下window安裝git和生成ssh鑰匙。
總結(jié)下:因為我們平時寫代碼是在windows下的idea里進行pull和push的,所以這邊生成ssh鑰匙并配置是為了能讓我們在idea上傳代碼push到服務(wù)器B的gitlab里。而前面那個在jenkins服務(wù)器上生成ssh鑰匙并配置是為了讓服務(wù)器A能和服務(wù)器B的gitlab安全連接,也就是可以pull和push。
切回jenkins,在源碼管理里,粘貼url上去,第二個是添加分支,點擊添加,類型選擇用戶名和密碼,輸入你gitlab用戶名和密碼。其實類型可以選擇ssh秘鑰驗證,gitlab訪問令牌啊什么的,看你喜歡。
添加完證書后選擇證書,如果不報紅色的字就說明ok,報的話說明錯誤。
注意:第三步中,jenkins job默認對master分支進行構(gòu)建,你也可以自定義分支。這要求你的Gitlab代碼倉庫中要存在這個分支,一般來說,就是要向代碼倉庫提交一次更改,請 自行完成(Gitlab項目剛創(chuàng)建時是空的,一個分支也沒有,這樣的話,自動構(gòu)建時會出錯),這也就是上面先試試上傳代碼到gitlab是否成功的原因啦。
8. 配置構(gòu)建觸發(fā)器
如下圖所示操作。我選了當(dāng)一個push到gitlab的時候就會自動構(gòu)建,使用鉤子webhook,構(gòu)建URL是jenkins上創(chuàng)建的那個maven項目。記住這個url,后面會用到!
點擊高級,出現(xiàn)下圖所示。
生成的口令其實就是webhook的安全令牌,等會配置gitlab的時候要用到。
打開gitlab,配置鉤子。點擊設(shè)置,然后集成。把上面記下來的jenkins項目url和webhook安全令牌寫進去。
取消掉ssl驗證,然后點擊add webhook。
點擊test中的第一個選項push events模擬push,看看是否成功。
下圖表示成功,如果報錯自己上網(wǎng)查下為何報錯,因為局域網(wǎng)的問題,需要在gitlab上登陸管理員賬號,配置里面有個選項就是說允許webhook發(fā)送本地指令之類的。
9. 配置build命令
使用maven命令來打包。
10. Post Steps
暫時不用寫,注意下面提到的模塊六檢驗成果中開頭提到的東西就行,再根據(jù)實際情況來定。
11. 構(gòu)建后操作
我使用的是tomcat熱部署。首先要安裝Deploy to container插件!!!, 該功能是“將成功編譯的War/Jar包部署到遠程的應(yīng)用服務(wù)器上。
我們先來配置tomcat遠程部署賬號,在tomcat目錄下conf文件內(nèi)tomcat-users.xml 文件增加以下配置。
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<role rolename="manager-jmx"/>
<role rolename="manager-status"/>
<user username="tomcat" password="tomcat" roles="manager-gui,manager-script,manager-jmx,manager-status"/>
在conf文件中的context.xml里context標簽中改成<Context antiResourceLocking="true">,這個是為了自動刪除之前舊版本的war包。
打開tomcat解壓目錄找到webapps/manager/META-INF里的context.xml ,需要注釋掉這個Value節(jié)點。
注意:配置完后驗證是否生效,啟動tomcat后點擊Manager App。輸入上面配置的用戶名密碼看看能不能進入。
選擇Deploy war/ear to a container,操作如下。因為jenkins從git上拉下來代碼并且打了war在jenkins的target目錄下,所以如下圖所示。
好了 我們可以開始正片了!
## 六:檢驗成果
注意!!!!!!!!!!!!!!!!!!!:
這邊先講下,我是建立在tomcat已經(jīng)啟動的情況下操作的,所以我沒有寫那個第10步。
commit push ,自動構(gòu)建,成功。
成功了。
那么有些人想要在tomcat沒有啟動的情況下怎么辦呢?那肯定是要寫腳本來啟動tomcat。具體看模塊七血淚坑!
## 七:血淚坑
失敗的例子1。
我在構(gòu)建后操作里使用Deploy war/ear to a container,上面的步驟都有顯示,也就是tomcat熱部署,然后又在Post Steps里寫了腳本,就是關(guān)閉tomcat和開啟tomcat。但是構(gòu)建會報錯。
參考了這篇文章,但是沒什么用,依然構(gòu)建報錯。報錯跟下面鏈接里的一樣,我就不貼出來了。
https://blog.csdn.net/weixin_33767813/article/details/86028814
后來我看了下,tomcat熱部署 用tomcat manager 本來就有很多漏洞,所以我決定舍棄熱部署。
失敗的例子2。
舍棄熱部署,改用Send build artifacts over SSH,構(gòu)建成功,tomcat啟動失敗,那種我也不知道怎么解決。我看網(wǎng)上是說在執(zhí)行的腳本上加一句export BUILD_ID=dontkillme,因為jenkins是會殺掉tomcat進程的。但是還是沒用!
成功的例子。
我們需要執(zhí)行shell腳本,先關(guān)閉tomcat,然后啟動tomcat。注意,這邊tomcat是裝在服務(wù)器B的,所以先要實現(xiàn)服務(wù)器A免登錄服務(wù)器B。
方法:先在服務(wù)器B的/root/.ssh下創(chuàng)建文件authorized_keys,然后把服務(wù)器A的生成的ssh公鑰(id_rsa.pub)復(fù)制到那個文件上。
注意 authorized_keys 文件的權(quán)限必須是600,如果權(quán)限不對會影響登錄。所以最后輸入指令:chmod 600 authorized_keys 就可以了。注意空格!
如下圖在postSteps中輸入shell命令。意思是ssh連接服務(wù)器B,執(zhí)行B服務(wù)器(192.168.31.222)上的restart.sh。
#!/bin/bash
echo "執(zhí)行腳本開始"
TOMCAT_HOME="/root/app/tomcat8.5.42"
ssh root@192.168.31.222? > /dev/null 2>&1 << eeooff
${TOMCAT_HOME}/bin/restart.sh
eeooff
echo done!
echo "執(zhí)行腳本結(jié)束"
下圖是restart.sh的腳本內(nèi)容,這個文件是放在tomcat那臺服務(wù)器上的,也就是服務(wù)器B。
#!/bin/bash
# export BUILD_ID=dontkillme
function shutdown_tomcat () {
? ? #tomcat_id=`jps | grep Bootstrap | awk '{print $1}'`
tomcat_id=`lsof -i:8765 | awk 'NR==2''{print $2}'`
if [ ! $tomcat_id ];then
echo "tomcat process in ${ip} is not exist."
else
echo "shoutdown ${ip} tomcat"
/bin/kill -9 $tomcat_id
fi
}
function start_tomcat () {
echo "start $ip tomcat"
/bin/sh /root/app/tomcat8.5.42/bin/catalina.sh start
/root/app/jdk1.8.0/bin/jps
}
function restart_tomcat () {
shutdown_tomcat
start_tomcat
}
restart_tomcat
echo "腳本執(zhí)行完畢"
接著需要安裝下Publish over SSH這個插件,然后在全局設(shè)置里設(shè)置Publish over SSH,密碼是你jenkins所在的服務(wù)器生成ssh鑰匙時設(shè)置的,沒有設(shè)置就不填,Key里填的是你的私鑰。
這邊填的是ssh連接的主機IP,名字隨便取,賬號名稱就寫root,路徑寫/就行,因為這是全局配置,下面每個項目都有路徑配置,會重合一起,注意拼接。填完后測試下連接,成功就ok。
接著回到j(luò)enkins項目的配置里,找到構(gòu)建后操作,把前面步驟中配置好的Deploy war/ear to a container 刪掉,我們不用tomcat熱部署。我們使用Send build artifacts over SSH。配置如下。
這樣就可以了,點擊保存,然后看下構(gòu)建效果吧。腳本執(zhí)行成功了,這樣tomcat開啟了。
大功告成。其實方法有很多種,熱部署肯定是行得通的,但是沒做出來。謝謝大家閱讀。有什么錯誤幫我指出來,我們一起討論