今年4月份,開始本身的第二份工做,習慣了老東家如絲般的發佈體驗,一會兒感受來到了「原始社會」。 首先這是一篇長文,主要介紹本身在作自動發佈這個過程的一些思考。html
引用玉伯的Web研發模式演變來講,如今咱們處於 - Web1.0時代:前端
遇到這種狀況,首先會想到的確定是先後端分離。但考慮到目前的人員、技術儲備狀況,直接過渡到基於NodeJS的全棧式開發,阻力大,週期長,極可能會難產。vue
而咱們首要要解決的問題
是:java
因此咱們暫時先作到先後端物理分離
,大體如 - Web2.0時代node
咱們先從開發、發佈流程來看咱們最終但願的結果是什麼,而後再分析如何完成這一目標webpack
首先聊一下通常發佈的流程:git
這是一些純體力活,要保證步驟順序和正確性,容易出問題,並且沒有記錄和日誌,因此通常作權限控制,發佈個普通需求還要找對應的同窗發佈,變動麻煩github
因此發佈必須自動化
,網上搜前端自動化發佈,大多數的結果都是Jenkins + githook ( Jenkins+github 前端自動化部署)web
其核心原理主要是經過mongodb
可是若是我想要查看發佈記錄、回滾、控制發佈流程,看起來Jenkins就幫不上忙了(可能有對應的插件,沒深究)
一樣的發佈腳本,用node也能執行,因此咱們打算使用node來寫一個發佈集成服務
來代替Jenkins,它能夠作更細緻的控制:
因此咱們的發佈自動化主要作三個東西
該CLI是一套標準的前端開發生命週期命令,經過幾個子命令去完成前端開發流程的各個任務,包含了:
vue-cli init
,不過比較入門簡單(由於暫時業務的體量並不須要頻繁建立新項目)npm run dev
,也不是重點關於CLI的開發參考 - 如何用Node開發CLI 主要是:commander + inquirer
今後發佈就變成了一個命令的事
發佈平臺提供了比CLI更多的功能:
到了重頭戲,這裏就介紹一些概念
首先,最終代碼部署到服務器確定都是經過scp等命令來同步文件到服務器,由於權限問題,經過雲端統一管控是比較靠譜的。
而後,每一個人的機器環境都不同,有可能在A這構建成功,在B那卻構建失敗(好比A添加了一個依賴,但沒有保存dependencies),因此以統一的環境來編譯構建,能夠避免由於環境問題引發的構建問題。
最後,須要一個地方去統一管理髮布記錄,避免發佈衝突,記錄發佈日誌,方便回滾操做等。
每一個人都基於Master拉取自定義分支開發,最終經過發佈自動同步到Master分支,保證開發時都是基於最新的線上代碼,同時發佈時作衝突檢查,保證發佈安全。
發佈過程的分支變化以下:
在整個發佈過程,咱們的代碼要經過平常、預發測試才能最終上線,這個過程是須要佔用對應服務器並保持穩定,須要避免出現其餘同窗發佈覆蓋的狀況,因此咱們使用MongoDB來維護發佈記錄
,實現發佈控制和流程控制
發佈控制 當指定發佈環境有一個項目發佈時,該環境被佔用,其餘項目發佈會提示有其餘項目發佈,聯繫對應的發佈同窗
,雙方根據重要性來決定是否退出發佈讓後來的項目先上
流程控制 爲了保證最終上線的代碼是正確運行的,整個過程須要測試和Code Review,必須經過測試、審覈
才能進入下一個環節
發佈腳本須要執行上面提到一系列的過程,這須要一個等待的過程,咱們須要實時給發佈同窗提供發佈反饋(發佈流程、成功與否),並將相關信息保存到日誌。因此發佈過程經過soket.io創建socket連接,集成發佈服務有任何流程變化都會反饋
同步服務器可使用 scp 或 rsync 命令,關於它們的介紹和不一樣看這個
這兩個命令經過ssh同步,都須要在執行命令後輸入密碼,因此須要配合expect來實現自動同步
最終整個服務選用了:express + socket.io + mongodb,這裏就不贅述了