鍍金池/ 問(wèn)答/Python  Linux/ 自動(dòng)化部署與更新flask項(xiàng)目

自動(dòng)化部署與更新flask項(xiàng)目

我自己寫(xiě)了flask一個(gè)應(yīng)用,已經(jīng)成功部署上線了。使用的是uwsgi與nginx
1.我的做法在github上有一個(gè)私有的代碼庫(kù),每次本地開(kāi)發(fā)完之后就將代碼更新到遠(yuǎn)程庫(kù)中
2.然后登陸服務(wù)器,服務(wù)器上項(xiàng)目的代碼庫(kù)一開(kāi)始是從遠(yuǎn)程庫(kù)中克隆下來(lái)的,所以每次需要更新代碼前需要先git pull,
3.然后我需要進(jìn)入這個(gè)項(xiàng)目的虛擬環(huán)境,運(yùn)行uwsgi --relaod uwsgi.pid
這樣才算是真正完成更新
請(qǐng)問(wèn)各位大神有沒(méi)有什么更好的方式

回答
編輯回答
孤巷

簡(jiǎn)單說(shuō)下思路

第一步,在服務(wù)器上創(chuàng)建一個(gè)git遠(yuǎn)程倉(cāng)庫(kù)

cd /home/username
mkdir -p repositories/projectname.git
cd repositories/projectname.git
git init --bare .

第二步,在服務(wù)器上編寫(xiě)post-receiveGit Hooks)自動(dòng)部署腳本

touch /home/username/repositories/projectname.git/hooks/post-receive
chmod +x /home/username/repositories/projectname.git/hooks/post-receive

實(shí)際可能需要更加復(fù)雜的邏輯,這里只做說(shuō)明

#!/bin/bash
/usr/bin/git --work-tree=/var/www/projectname --git-dir=/home/username/repositories/projectname.git checkout -f
/home/username/.virtualenvs/virtualenvname/bin/python /home/username/.virtualenvs/virtualenvname/bin/uwsgi --reload /path/to/uwsgi.pid

備注:用戶username必須擁有/var/www/projectname目錄的讀寫(xiě)權(quán)限

第三步,在本地添加遠(yuǎn)程倉(cāng)庫(kù)

cd /path/to/projectdir
git remote add production username@myhostname:/home/username/repositories/projectname.git
# 本地代碼提交后,更新到遠(yuǎn)程倉(cāng)庫(kù)
git push production master
# 遠(yuǎn)程倉(cāng)庫(kù)接收完成后,將執(zhí)行post-receive腳本,以達(dá)到自動(dòng)化部署的目的
2017年1月3日 09:31
編輯回答
尐潴豬

想用成熟的方案的話可以使用Jenkins,不過(guò)需要在一臺(tái)服務(wù)器上先部署Jenkins,有點(diǎn)占內(nèi)存的,簡(jiǎn)單一點(diǎn)的方案可以使用GitHub webhooks,然后寫(xiě)一個(gè)專(zhuān)門(mén)用來(lái)更新服務(wù)的flask應(yīng)用,只有一個(gè)接口,用來(lái)執(zhí)行關(guān)閉服務(wù),更新代碼,運(yùn)行測(cè)試,重啟服務(wù)的任務(wù),直接用os.system或者subprocess.call調(diào)用命令就可以。

2017年3月9日 02:07