一.基礎知識
GitLab:是一個基于Git實現(xiàn)的在線代碼倉庫托管軟件虎敦,是用來提供代碼托管的。我們可以用在企業(yè)內(nèi)部網(wǎng)絡搭建私服痢畜。
jenkins:基于Java開發(fā)的一種持續(xù)集成工具虫几,用于監(jiān)控持續(xù)重復的工作。在提供一個開放易用的軟件平臺赘艳,使軟件的持續(xù)集成變成可能酌毡。
maven:項目管理工具,在這里我們可以執(zhí)行maven命令來幫我們打包
jdk: Java 語言的軟件開發(fā)工具包
tomcat:輕量級應用服務器
git:版本控制器
在日常開發(fā)中蕾管,以前的流程是需要把項目從gitlab上復制到本地枷踏,再打成war包,然后部署到tomcat服務器上運行掰曾。開發(fā)項目的過程中會經(jīng)常部署測試環(huán)境來驗證旭蠕,重復以上操作會顯得很繁瑣,浪費大量時間旷坦,所以使用jenkins來實現(xiàn)持續(xù)集成掏熬,對整個開發(fā)項目的過程有著重要的戰(zhàn)略意義。我們開發(fā)軟件為了什么秒梅?對旗芬,簡化步驟,提高開發(fā)效率捆蜀,節(jié)省時間疮丛。
請叫我靈魂畫師~
前提:這次整合,我是只使用2臺機器辆它,服務器A裝jenkins誊薄,jdk,maven娩井,服務器B裝gitlab和tomcat暇屋,其實應該是要個服務器C裝tomcat,這樣思路就更清楚了洞辣,具體情況各位根據(jù)實際需求來定哈咐刨。
1)B服務器上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的設置
inet_protocols = all
inet_interfaces = all
2. yum 配置鏡像加速
我推薦清華大學鏡像源 :?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://<你的服務器地址或域名>:<你想要設置的端口號>'
unicorn['port'] = <你想要設置的端口號>
prometheus['listen_address'] = 'localhost:<你想要設置的端口號>'
sudo gitlab-ctl reconfigure # 重新配置服務;
6. 重啟gitlab
gitlab-ctl restart
打開http://<你的服務器IP>:<80>联予,會彈出一個設置初始密碼的界面啼县,按照要求輸入初始密碼,就會跳轉到登錄頁面沸久。gitlab管理員用戶名為root季眷。
我這邊是自己創(chuàng)建了用戶,下圖是注冊卷胯,完成后登陸子刮。
7. 服務器A上配置免密碼登錄
客戶端命令行生成ssh
ssh-keygen -t rsa
它會生成公鑰id_rsa.pub和私鑰id_rsa,存放在.ssh目錄下窑睁。復制公鑰到Gitlab的用戶設置中的SSH Keys中挺峡,點擊保存。操作如下圖所示
有人問這樣做的目的是什么担钮?問得好橱赠!這樣我們就能建立服務器A跟gitLab的安全連接,我們就可以通過git將gitlab倉庫里的代碼拉下來或者推送到倉庫箫津。
2)A服務器上安裝jdk
centOS安裝jdk有三種狭姨,隨便選一種都可以,網(wǎng)上一大堆鲤嫡。我選中的是手動解壓安裝包送挑。
卸載系統(tǒng)自帶的jdk(此步驟建立在centOS7自帶jdk1.8的情況,可以跳過暖眼,也可以自己安裝想要的jdk)
查看當前系統(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*
當結果出現(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ù)選擇對應的包)
然后使用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)境變量值的結尾沒有任何符號,不同值之間用:隔開(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. 關閉防火墻
systemctl stop firewalld.service
systemctl disable firewalld.service
3. 配置文件
vi /etc/sysconfig/jenkins
#修改下面內(nèi)容
JENKINS_USER="root"
...
端口設置成為被占用的
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構建時需要的環(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
按照提示將代碼復制到下面,然后點繼續(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
升級完就應該沒問題了。
4. 配置jdk溶弟,maven女淑,git
首先我們要配置jenkins編譯所需要的jdk,maven辜御,順便把git也配置了鸭你。最后點擊保存。
注意:jdk home和maven home 可以輸入vim /etc/profile看到,直接復制粘貼就行袱巨。git的話輸入whereis git就可以查到了阁谆,一般是git/bin/git這個結尾的。
5. 在jenkins上系統(tǒng)設置gitlab和git
安裝Gitlab插件瓣窄,Gitlab Hook插件笛厦,Git插件。打開設置俺夕,選擇插件管理裳凸。點擊可選插件,然后在搜索框里輸入就可以了劝贸,搜索到后點擊直接安裝姨谷。沒看懂的可以看我第六那個步驟。
安裝完之后映九,點擊系統(tǒng)設置梦湘。
找到Gitlab這個配置。
這邊需要添加憑證件甥,我選用的類型是gitlab API token捌议。
從哪里獲取呢?打開gitlab引有,用戶設置里面有個訪問令牌選項瓣颅。
成功后會如下顯示。然后復制這個令牌譬正,保存在你自己知道的地方宫补,不保存就以后就看不到了。
接著把剛才復制的訪問令牌粘貼到添加的憑證那里去曾我,點擊添加粉怕,然后前面的下拉框里選擇你剛才添加的憑證。
配置完gitlab后要配置git抒巢,2個選項一填就可以了贫贝,用戶名和郵箱。好了蛉谜,配置結束平酿。
6. 在jenkins上創(chuàng)建一個maven項目
點擊新建Item,或者開始創(chuàng)建一個新任務悦陋,然后選擇新建maven項目蜈彼。很多人說沒有,比如下圖俺驶。
那是因為沒有安裝一個Maven插件幸逆。在可選插件里輸入Maven Integration棍辕,點擊安裝,不好意思我安裝的比較快还绘,沒來得及截圖楚昭。已經(jīng)在我安裝列表里了。
返回到主頁面拍顷,點擊新建抚太,任務名字隨便起谨究,選擇構建一個maven項目囊扳,最后點擊確定。
7. 配置源碼管理
這里我們用來讓jenkins連接gitlab倉庫的蒂阱。
首先打開gitlab踏揣,新建一個倉庫庆亡。這里我喜歡叫倉庫,但它翻譯成項目捞稿。用過github的朋友應該喜歡叫倉庫吧又谋。隨意啦,強迫癥娱局。
寫倉庫名字彰亥,設置私有的,描述可寫可不寫衰齐,然后創(chuàng)建剩愧。
倉庫列表中就有了你新建的倉庫,點擊它進入倉庫娇斩。
復制倉庫url。
注意:一開始這個倉庫是空的穴翩,我這邊是剛才上傳了個helloworld的maven項目犬第,用來測試下git能不能上傳代碼到這個倉庫,大家試下芒帕,后面jenkins配置需要這倉庫主分支不能為空歉嗓。
我是自己windows上安裝了git,通過配置idea中的git來push代碼背蟆,當然也需要生成ssh鑰匙在gitlab上添加sshkey鉴分。(前面步驟一開始我生成的ssh鑰匙是在我安裝jenkins的那臺服務器A上操作的,和這邊的是兩回事)带膀。不懂的朋友可以百度下window安裝git和生成ssh鑰匙志珍。
總結下:因為我們平時寫代碼是在windows下的idea里進行pull和push的,所以這邊生成ssh鑰匙并配置是為了能讓我們在idea上傳代碼push到服務器B的gitlab里垛叨。而前面那個在jenkins服務器上生成ssh鑰匙并配置是為了讓服務器A能和服務器B的gitlab安全連接伦糯,也就是可以pull和push。
切回jenkins,在源碼管理里敛纲,粘貼url上去喂击,第二個是添加分支,點擊添加淤翔,類型選擇用戶名和密碼翰绊,輸入你gitlab用戶名和密碼。其實類型可以選擇ssh秘鑰驗證旁壮,gitlab訪問令牌啊什么的监嗜,看你喜歡。
添加完證書后選擇證書寡具,如果不報紅色的字就說明ok秤茅,報的話說明錯誤。
注意:第三步中童叠,jenkins job默認對master分支進行構建框喳,你也可以自定義分支。這要求你的Gitlab代碼倉庫中要存在這個分支厦坛,一般來說五垮,就是要向代碼倉庫提交一次更改,請 自行完成(Gitlab項目剛創(chuàng)建時是空的杜秸,一個分支也沒有放仗,這樣的話,自動構建時會出錯)撬碟,這也就是上面先試試上傳代碼到gitlab是否成功的原因啦诞挨。
8. 配置構建觸發(fā)器
如下圖所示操作。我選了當一個push到gitlab的時候就會自動構建呢蛤,使用鉤子webhook惶傻,構建URL是jenkins上創(chuàng)建的那個maven項目。記住這個url其障,后面會用到银室!
點擊高級,出現(xiàn)下圖所示。
生成的口令其實就是webhook的安全令牌励翼,等會配置gitlab的時候要用到蜈敢。
打開gitlab,配置鉤子汽抚。點擊設置抓狭,然后集成。把上面記下來的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. 構建后操作
我使用的是tomcat熱部署酌畜。首先要安裝Deploy to container插件!G溥础桥胞!, 該功能是“將成功編譯的War/Jar包部署到遠程的應用服務器上考婴。
我們先來配置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目錄下,所以如下圖所示易茬。
好了 我們可以開始正片了!
## 六:檢驗成果
注意<袄稀3槔场!=径瘛J愁怼!I场E吧搿O蟊谩!U宓稹E蓟荨!@噬:瞿酢!P淮病P忠弧!:
這邊先講下识腿,我是建立在tomcat已經(jīng)啟動的情況下操作的出革,所以我沒有寫那個第10步。
commit push 渡讼,自動構建骂束,成功。
成功了硝全。
那么有些人想要在tomcat沒有啟動的情況下怎么辦呢栖雾?那肯定是要寫腳本來啟動tomcat。具體看模塊七血淚坑伟众!
## 七:血淚坑
失敗的例子1析藕。
我在構建后操作里使用Deploy war/ear to a container,上面的步驟都有顯示凳厢,也就是tomcat熱部署账胧,然后又在Post Steps里寫了腳本,就是關閉tomcat和開啟tomcat先紫。但是構建會報錯治泥。
參考了這篇文章,但是沒什么用遮精,依然構建報錯居夹。報錯跟下面鏈接里的一樣,我就不貼出來了本冲。
https://blog.csdn.net/weixin_33767813/article/details/86028814
后來我看了下准脂,tomcat熱部署 用tomcat manager 本來就有很多漏洞,所以我決定舍棄熱部署檬洞。
失敗的例子2狸膏。
舍棄熱部署,改用Send build artifacts over SSH添怔,構建成功湾戳,tomcat啟動失敗贤旷,那種我也不知道怎么解決。我看網(wǎng)上是說在執(zhí)行的腳本上加一句export BUILD_ID=dontkillme砾脑,因為jenkins是會殺掉tomcat進程的幼驶。但是還是沒用!
成功的例子拦止。
我們需要執(zhí)行shell腳本县遣,先關閉tomcat,然后啟動tomcat汹族。注意萧求,這邊tomcat是裝在服務器B的,所以先要實現(xiàn)服務器A免登錄服務器B顶瞒。
方法:先在服務器B的/root/.ssh下創(chuàng)建文件authorized_keys,然后把服務器A的生成的ssh公鑰(id_rsa.pub)復制到那個文件上榴徐。
注意 authorized_keys 文件的權限必須是600,如果權限不對會影響登錄耗帕。所以最后輸入指令:chmod 600 authorized_keys 就可以了。注意空格袱贮!
如下圖在postSteps中輸入shell命令。意思是ssh連接服務器B攒巍,執(zhí)行B服務器(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í)行腳本結束"
下圖是restart.sh的腳本內(nèi)容柒莉,這個文件是放在tomcat那臺服務器上的闻坚,也就是服務器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這個插件,然后在全局設置里設置Publish over SSH雳殊,密碼是你jenkins所在的服務器生成ssh鑰匙時設置的喷市,沒有設置就不填威恼,Key里填的是你的私鑰寝并。
這邊填的是ssh連接的主機IP腹备,名字隨便取镀岛,賬號名稱就寫root友驮,路徑寫/就行,因為這是全局配置卸留,下面每個項目都有路徑配置耻瑟,會重合一起,注意拼接喳整。填完后測試下連接,成功就ok框都。
接著回到jenkins項目的配置里瞬项,找到構建后操作,把前面步驟中配置好的Deploy war/ear to a container 刪掉囱淋,我們不用tomcat熱部署妥衣。我們使用Send build artifacts over SSH皂吮。配置如下税手。
這樣就可以了,點擊保存艺挪,然后看下構建效果吧兵扬。腳本執(zhí)行成功了口蝠,這樣tomcat開啟了津坑。
大功告成疆瑰。其實方法有很多種,熱部署肯定是行得通的寸五,但是沒做出來。謝謝大家閱讀播歼。有什么錯誤幫我指出來掰读,我們一起討論