標籤:

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 基礎教程
各位有什麼提高前端部署速度的經驗呢?

TAG:Python | 部署 |