一、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
腳本的內容:
腳本使用的是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 |
效果如下圖:
添加構建的執行腳本(注意不是在構建完執行的那塊加):
運行job,build完後會執行deploy腳本:
查看遠程的tomcat是否發佈完成:
當然一般也不會直接在一個工程下面直接加發布腳本,工程要是build不成功呢,或是這次build有問題
有人一直build的呢,會不會一直執行這個發佈,同城都是再建一個視圖,這個權限只有某些人有
build完後再執行這個deploy job 做發佈,加一個視圖,再加一個自由構建風格的job
(pool很多的話可以加多個)做腳本運行發佈的job。
首先copy一個視圖:
配置腳本路徑,只做腳本發佈:
再次運行發佈,會直接發佈現在jenkins target目錄下現存的war包,發佈完的效果: