Jenkins環境搭建部署實現代碼自動化發佈


一、jenkins代碼自動部署


1.配置免密鑰通信

實現自動化部署首先要解決的是免密碼傳輸,配置jenkins至測試服務器之間免密鑰ssh登錄

測試免密鑰ssh登錄

 

在測試服務器上編寫一個測試腳本,檢測是否可以執行成功,正式環境可以寫一個自動化部署的腳本


2.jenkins新建部署代碼項目

 
 

在構建這裏選擇執行shell命令 

點擊立即構建 

控制檯輸出日誌:成功

這樣就實現了使用jenkins代碼的自動化部署

實際情況中我們通常使用版本控制系統管理代碼,svn 或者 git

 

二、gitlab利用webhook實現push代碼後jenkins自動構建


jenkins服務器:192.168.239.134

gitlab服務器: 192.168.239.136

PS:如果gitlab與jenkins在同一臺服務器,需要更改其中一個的端口,默認都是8080

之前部署了gitlab的代碼託管平臺和jenkins代碼發佈平臺,通常是開發後的代碼先推到Gitlab上管理,然後在Jenkins裏

通過腳本構建代碼發佈。這種方式每次在發版的時候,需要人工去執行jenkins上的構建動作,有時顯得過於繁瑣

於是就想到了Gitlab的Webhook功能,通過Webhook的相關設置,可以實現代碼Push後

自動去觸發jenkins上的構建動作,這樣就不需要人工干預去執行發版操作了

提前將jenkins本機的key添加到gitlab賬戶上

 

jenkins安裝gitlab hook plugin插件

 

在auto_deploy項目工程裏設置代碼的git下載路徑並關聯構建的分支

查看jenkins生成回調地址,在任務構建觸發器下獲取回調URL

下面的URL那一行只有gitlab hook plugina插件下載成功後才能顯示 

設置代碼發佈的推送腳本

 注意:這裏使用192.168.239.136的test用戶是與jenkins服務器已經配置了ssh免密鑰登錄

複製代碼

#!/bin/bash
SOURCE_DIR=/root/.jenkins/workspace/${JOB_NAME}/DEST_DIR=/var/www/html/REMOTE_IP=192.168.239.136/usr/bin/rsync -e "ssh -p 22" -avpgolr --delete-before --exclude=.git $SOURCE_DIR test@$REMOTE_IP:$DEST_DIR

通過上面的git將代碼下載到jenkins本機jobs裏對應任務的workspace下,jenkins部署路徑是/root/.jenkins/workspace/,腳本中${JOB_NAME}是jenkins的內置變量
也可以指定下載目錄,加--exclude忽略哪些文件不需要進行rsync傳輸
#!/bin/bash
SOURCE_DIR=/data/git_tmpdata
再通過rsync將下載的代碼分發到遠程目標機器上

複製代碼

 在192.168.239.136上創建/var/www/html/目錄並授權test用戶

 mkdir /var/www/html/ -p && chmod -R test.test /var/www/html/

 在gitlab上添加webhooks(注意這裏是管理員用戶才能添加)

 

Add Webhook添加完成後,在下方點擊 test進行測試

 

如果返回Hook successfully executed.表示配置成功。
這樣,下次push代碼後,就會自動觸發jenkins上相關的構建工程進行自動發佈了!無需人工干預

 

 

在gitlab上push一個文件hello.py,然後測試下是否自動發佈了

 

在jenkins上查看輸出信息

在目標機器192.168.239.136的/var/www/html/目錄下發現hello.py文件已經發布過來了

 


三、用jenkins 自動部署發佈

  

#注意:jenkins路徑會有差異,不用在意這個,同一個版本部署2次,發現了2個不同的目錄結構,很詫異。


jenkins build玩war包的存放目錄:/data/jenkins/workspace/simple/target 

自動發佈的腳本存放路徑:/data/jenkins/jobs/simple

wKioL1j1ezDSPALnAAEERyHSQvM960.png

腳本的內容:

腳本使用的是scp命令,當然也可以使用wget等。

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
[root@localhost simple]# cat deploy_prod.sh 
#!/bin/bash
back_time=`date +"%Y-%m-%d-%H-%M-%S"`#備份的時間
all_ip=192.168.121.135
for_ip=`awk 'BEGIN{iplist="'$all_ip'";split(iplist,ip,",");for (s in ip) {print ip[s]}}'`  #awk數組轉換
for dest_ip in ${for_ip[*]};do
    echo $dest_ip
done
src=/data/jenkins/workspace/simple/target#下面就是重啓scp的過程
war_name="SimpleWeb-1.0.1-SNAPSHOT"
function stop_tomcat () {
    Tomcat_id=`ssh $dest_ip lsof -i:8080 | awk 'NR==2''{print $2}'`
if [ ! Tomcat_id  ];then
    echo "tomcat id 不存在"
else
    ssh $dest_ip "/bin/kill -9 $Tomcat_id"
fi
}
function start_tomcat () {
    ssh $dest_ip "cd /data/tomcat/bin && /bin/sh startup.sh"
}
if [ -f $src/${war_name}.war ];then
    stop_tomcat
    ssh $dest_ip "cd /data/tomcat/webapps && cp ${war_name}.war{,-${back_time}};cd /data/tomcat/webapps && /bin/rm -rf ${war_name}.war"
    ssh $dest_ip "cd /data/tomcat/webapps && /bin/rm -rf ${war_name}"
    scp $src/${war_name}.war $dest_ip:/data/tomcat/webapps
    start_tomcat 
fi

數組轉換防止出現多ip發佈:

1
2
3
4
[root@localhost simple]# all_ip=192.168.121.131,192.168.121.135
[root@localhost simple]# awk 'BEGIN{iplist="'$all_ip'";split(iplist,ip,",");for (s in ip) {print ip[s]}}'
192.168.121.131
192.168.121.135

效果如下圖:

wKioL1j1ewiAXsOzAADiGAk0FOo625.png


添加構建的執行腳本(注意不是在構建完執行的那塊加):


wKiom1j1e3OipN3HAABO9IMztPU464.png


運行job,build完後會執行deploy腳本:

wKiom1j1e8jAg6R7AAAo4i456CU534.png

查看遠程的tomcat是否發佈完成:

wKiom1j1fA7yxpImAAEIt36ZKd4684.png


 當然一般也不會直接在一個工程下面直接加發布腳本,工程要是build不成功呢,或是這次build有問題

有人一直build的呢,會不會一直執行這個發佈,同城都是再建一個視圖,這個權限只有某些人有

build完後再執行這個deploy  job 做發佈,加一個視圖,再加一個自由構建風格的job

(pool很多的話可以加多個)做腳本運行發佈的job。


首先copy一個視圖:

wKiom1j1fFeBYfwBAAErMvhX3Wk500.png

配置腳本路徑,只做腳本發佈:

wKioL1j1fJGwbmdEAAFENxUNV8Y368.png

再次運行發佈,會直接發佈現在jenkins target目錄下現存的war包,發佈完的效果:

wKiom1j1fQODSZKYAAA9dQqZ4Sg275.png






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章