Python項目自動化部署之一:舉個栗子
本文主要講述一下我司
(一個成長中的創業公司)目前的代碼發布流程用到了哪些工具。發布工具:Jenkins
我們用的發布工具是很多公司都在用的Jenkins。
舉個栗子圖,在Jenkins Server上可以一鍵發布後端伺服器代碼:按下 Build按鈕 以後,
發生的事情如下:- 在 Jenkins伺服器 上觸發預先配置的 Bash腳本
- git命令獲取到最新的代碼版本,切換合適的分支
- 執行代碼風格檢測和單元測試自從使用了付費版GitLab後,本功能已切換至GitLab CI了
- 安全檢查通過以後,使用fab命令部署代碼
發布命令:Fabric
這裡的fab命令用的就是Python的Fabric庫,
這個庫類似ansible,主要包含兩套功能:- 本地命令集成。這點大概跟 Java 的
ant
,gradle
,或者是 JS 的npm run
有類似功能。都是可以把數個操作集成到一條簡單的工作流命令里。 - 遠程ssh工具。Fabric里基於ssh,
實現了一套方便的遠程命令介面,
比如這麼一段代碼就可以把配置上傳到遠程伺服器:
from fabric.api import * # NOQA# 不用試了,這裡的兩個都是假的domain,對應放上ssh的host/user即可env.hosts = [www.kezaihui.com, zaihuiwebserver-814613977.cn-north-1.elb.amazonaws.com.cn]env.user = saberdef update_supervisor_config(): put(./supervisor/*.conf, /etc/supervisor/conf.d/, use_sudo=True) run(supervisorctl update, use_sudo=True)
但Fabric有個比較蛋疼的地方就是它只支持Python2,
假如要用Python3的話,可以使用Fabric的一個fork分支Fabric3,Fabric3與Fabric大部分功能等價。
只想用裡面本地命令集成這部分功能的話,
還有一個庫叫Invoke也提供了類似的功能。這個庫主要是名字特別帥,dota2裡面的卡爾就叫Invoker(祈求者)。進程管理:Supervisor
在正式環境中,
為了保證伺服器進程的魯棒性,我們使用了 supervisor 來監控進程狀態。一個簡單的 nginx supervisor 的配置會長這樣子:
[program:nginx]command=/usr/sbin/nginxautostart=trueautorestart=truestdout_logfile=/var/log/supervisor/nginx.logstderr_logfile=/var/log/supervisor/nginx_error.log
把配置文件放到 /etc/supervisor/conf.d/nginx.conf
以後,
$ supervisorctl update # supervisorctl 是 supervisor 的命令行工具,更新一波配置nginx STARTING pid 1000, uptime 0:00:00$ supervisorctl status # 查看進程狀態nginx RUNNING pid 1000, uptime 0:12:34$ kill -9 1000 # 模擬各種波動,幹掉 nginx 進程$ supervisorctl status # 再次查看進程狀態,可以發現 supervisor 自動重啟了nginx STARTING pid 1020, uptime 0:00:00
總結
負責發版的工程師,
可能只在頁面上點下了Build
的一個按鈕,實際上的流程是這樣的:
- Jenkins 觸發了配置好的 Bash腳本。
- 裡面 Bash 腳本跑了 fab 命令。
- fab 命令執行了代碼上傳的工作,本質上是通過 ssh 執行命令。
- 最終用 supervisor 開啟/重啟了進程服務。
- 發版完成。
以上大概就是我司目前自動化部署的簡陋介紹。
升級之路漫漫,還是有很多東西要學習/實踐/掌握的呀。原文鏈接,作者 @蘇子岳
本文版權屬於再惠研發團隊,歡迎轉載,轉載請保留出處。
推薦閱讀:
※多台雲主機的如何實現一鍵自動部署發布?
※一位老極客的眼中的開發和部署
※docker 必備 — marathon 基礎教程
※各位有什麼提高前端部署速度的經驗呢?