需求說(shuō)明
Git+Jenkins方式的版本上線部署是當(dāng)前較為熱門的版本上線方式,程序員通過(guò)Git客戶端將下好的代碼上傳至Git版本服務(wù)器后,運(yùn)維人員通過(guò)Jenkis服務(wù)器即可非常方便的完成對(duì)應(yīng)用服務(wù)器的版本服務(wù)器的版本升級(jí)工作
源代碼
#導(dǎo)入模塊
import wget
import os
import requests
import hashlib
import tarfile
#定義判斷是否有新版本的函數(shù)
def has_new_ver(ver_url,ver_fname):
'有新版本返回True,沒(méi)有返回False'
? ? #如果本地沒(méi)有版本文件則為True,判定為有新版本
? ? if not os.path.isfile(ver_fname):
return True
? ? #取出本地版本
? ? with open(ver_fname)as fobj:
local_ver=fobj.read()
#本地版本與網(wǎng)上版本比較,如果不一致返回True
? ? r =requests.get(ver_url)
#取出網(wǎng)上版本是文本類型的,所以用.text
? ? if local_ver != r.text:
#如果一致返回True,否則為False
? ? ? ? return True
? ? else:
return False
#定義判斷文件是否已損壞的函數(shù)
def file_ok(md5_url,fname):
'如果文件已損壞返回False,否則返回True'
? ? m=hashlib.md5()
with open(fname,'rb')as fobj:
while 1:
data = fobj.read(4096)
if not data:
break
? ? ? ? ? ? m.update(data)
#取出網(wǎng)上的md5值,進(jìn)行比較
? ? r=requests.get(md5_url)
if m.hexdigest() == r.text.strip():
return True
? ? else:
return False
#定義部署軟件的函數(shù)
def deploy(app_fname):
'部署軟件'
? ? deploy_dir='/var/www/deploy/'
? ? dest='/var/www/html/new'
? ? #解壓
? ? tar=tarfile.open(app_fname)
????tar.extractall(path=deploy_dir)
????tar.close()
#取出軟件目錄名
? ? app_dir=app_fname.split('/')[-1]
????app_dir=app_dir.replace('.tar.gz','')
????app_dir=os.path.join(deploy_dir,app_dir)
#如果目標(biāo)鏈接文件已存在,先刪除
? ? if os.path.exists(dest):
????os.remove(dest)
#創(chuàng)建軟連接
? ? os.symlink(app_dir,dest)
#編寫主函數(shù)
if __name__ =='__main__':
# 判斷是否有新文件,沒(méi)有則退出
? ? #下載地址版本路徑
? ? ver_url='http://192.168.1.102/deploy/live_ver'
? ? #本地版本文件路徑
? ? ver_fname='/var/www/deploy/live_ver'
? ? #判斷
? ? if? not has_new_ver(ver_url,ver_fname):
print("未發(fā)現(xiàn)新版本")
exit(1)
#下載新版本文件,并校驗(yàn).如果下載的文件已損環(huán),刪除它
? ? r=requests.get(ver_url)
#把額外的\n刪除,得到版本號(hào)
? ? ver=r.text.strip()
app_url='http://192.168.1.102/deploy/pkgs/website-%s.tar.gz'%ver
#將新的版本文件下載到指定路徑
? ? down_dir='/var/www/download'
? ? wget.download(app_url,down_dir)
#校驗(yàn),如果下載的文件已損壞,刪除它
? ? md5_url=app_url+'.md5'
? ? app_fname=app_url.split('/')[-1]
????app_fname=os.path.join(down_dir,app_fname)
????if not file_ok(md5_url,app_fname):
????????os.remove(app_fname)
????????print("文件已損壞!")
? ? ? ? ? ?exit(2)
#部署軟件
? ? deploy(app_fname)
#更新live_ver文件的版本
? ? if os.path.exists(ver_fname):
????????os.remove(ver_fname)
????????wget.download(ver_url,ver_fname)
運(yùn)行環(huán)境說(shuō)明
Jenkins服務(wù)器一臺(tái)可以獲取Git服務(wù)器上的版本庫(kù)
Git客戶端一臺(tái)且可上傳代碼到Git服務(wù)器
Git服務(wù)器一臺(tái),可以完成版本更新
服務(wù)器上需要添加腳本,如圖所示:
腳本代碼
deploy_dir=/var/www/html/deploy/pkgs
cp -r website-$webver $deploy_dir
cd $deploy_dir
rm -rf website-$webver/.git
tar czf website-$webver.tar.gz website-$webver
rm -rf website-$webve
md5sum website-$webver.tar.gz | awk '{print $1}' > website-$webver.tar.gz.md5
cd ..
[ -f live_ver ] && cat live_ver > last_ver
echo $webver > live_ver
創(chuàng)建相關(guān)的路徑和文件
mkdir /var/www/deploy
mkdir /var/www/download
touch /var/www/deploy/live_ver
對(duì)相關(guān)路徑賦予相關(guān)的權(quán)限
在jenkins服務(wù)器發(fā)布一個(gè)1.0版本
待進(jìn)度條執(zhí)行完畢后,運(yùn)行python腳本
Process finished with exit code
查看是否下載了對(duì)應(yīng)版本的tar包
cd /var/www/download/
ls
website-1.0.tar.gz
查看是否完解壓縮
cd /var/www/deploy/
ls
website-1.0
查看當(dāng)前的版本號(hào)
cat /var/www/deploy/live_ver
1.0
可以看到目前為1.0版本,腳本執(zhí)行成功,成功上線
上線2.0版本
在jenkins服務(wù)器上線2.0版本
待進(jìn)度條完成后,執(zhí)行腳本
Process finished with exit code 0
查看是否下載了對(duì)應(yīng)版本的tar包
cd /var/www/download/
ls
website-1.0.tar.gz?????website-2.0.tar.gz
查看是否完解壓縮
cd /var/www/deploy/
ls
website-1.0 ?????website-2.0
查看當(dāng)前的版本號(hào)
cat /var/www/deploy/live_ver
2.0
可以看到目前為1.0版本,腳本執(zhí)行成功,成功完成版本升級(jí)
訪問(wèn)頁(yè)面
firefox http://127.0.0.1/new/index.html