譯\Node.js應用的持續部署

Node.js應用的持續部署

翻譯前

翻譯自:https://blog.risingstack.com/continuous-deployment-of-node-js-applications/css

正文

持續部署是...
不,讓咱們退一步來看持續集成、持續交付、持續部署的區別。html

持續集成

持續集成是一天屢次/持續地把開發的成果和主分支合併到一塊兒的過程。有助於:前端

  • 儘早捕獲異常
  • 防止「集成地獄」

大部分工做是靠自動測試完成的。node

持續交付

持續交付是隻將代碼部署到一個能夠被QA團隊或者客戶審查的環境。當改動被批准,他們才能夠被部署到生產環境。git

持續部署

你能夠把持續部署當作是持續交付的下一步。在這一步,傳遞到自動測試的變動會被自動地部署到生產環境。持續部署很是依賴於某些基礎設施,這些基礎設施將測試、集成、部署新功能的過程自動化。
在這篇文章裏,咱們將梳理這些自動化步驟、講述大部分的原則。
一個簡化的持續部署工做流以下:
github

從源代碼控制到生產環境

假設咱們要作這樣一件事,當一個新的功能將要被開發出來而且咱們想看到它運行在生產環境。咱們要看一下這個代碼變動從提交到在生產環境運行起來的所有聲明週期。docker

一切從一次提交開始

每次將代碼提交到主分支,都應該觸發一個包含測試的新構建。可是當添加新的功能時,你不會想在生產環境中看到半成品的功能。npm

功能開關

爲了解決這個問題,持續部署的建立通常伴隨着功能開關。功能開關是指一個切換功能,能夠容許開發者發佈包含未完成內容的產品版本。這些未完成的功能會被生產環境中的開關隱藏起來。瀏覽器

// 用一個僞造的例子來說述風格切換
// https://www.npmjs.org/package/feature-toggles

var featureToggles = require('feature-toggles');  
// 定義切換
var toggles = {  
    foo: true, 
    bar: false
};

// 把它們加載到模塊中
featureToggles.load(toggles);

// 檢查某個功能是否被開啓
if (featureToggles.isFeatureEnabled('foo')) {  
    // do something
}

當這個功能已經完成,這個功能開關能夠被移除。服務器

持續部署工具

可是在哪觸發一個新的構建呢?針對這個例子,你須要一個持續集成工具。已經有不少現成的工具,如 JenkinsTravisCodeshipStrider,其中Strider是用Node.js編寫的,Jenkins和Strider是開源的,能夠在你的基礎設施上進行操做。
當前,咱們在閉源項目使用Strider,開源項目使用Travis。
上述每一個工具都支持提交鉤子,因此如今就建立一個吧!如此一來,你的持續集成工具不用像日常同樣拉取代碼。

提交時構建

當你選的工具收到了一個新的提交通知,它會啓動一個新的構建。構建能夠包含不少步驟,有些能夠同時運行。說到Node.js應用,將經歷以下步驟:

  • 從NPM安裝依賴(公共的或者私有的)
  • 運行單元測試
  • 構建靜態資源,如css和JavaScript
  • 運行集成測試和端到端的測試
  • 建立發佈包(把node_modules文件夾也打包進去,這樣部署的時候就不用依賴NPM了)

自動化測試

自動化測試是構建步驟中最關鍵的部分。
你的模塊必須被單元測試覆蓋,你也須要有集成測試來檢查各部分可否協同工做。對於這類測試,你可使用mocha/tap/Jasmine和斷言庫,如chai.
基於你構建的應用是包含前端的仍是隻有API,你能夠選擇不一樣的端到端測試工具
若是你的程序沒有前端頁面,只有API,你能夠用hippiesupertest作端到端的測試。
當開發包含前端頁面的程序時,你還能夠對用戶界面進行測試。使用Protractor來測試AngularJS程序或者使用Nightwatch。爲了確保程序在全部支持的瀏覽器中運行,須要在Selenium集羣上運行端到端測試。也可使用Sauce Labs或者 Browserstack 服務。
我要不斷地強調這件事:沒有足夠的測試覆蓋率,持續集成將致使一系列的生產問題。

建立發佈包

若是全部的測試都已經經過,那麼就能夠從構建打包了。發佈包必須包含運行應用程序的每一個文件。因此你的成產服務不用再進行從新構建。
一個簡單的tar filename.tar *能夠作這件事。而後確保文件位置能夠被生產服務器訪問,這樣你才能獲取到它。如AWS的S3或者任何的其它存儲。

部署

因爲咱們剛建立的發佈包包含程序全部的靜態資源,咱們只須要進行以下操做:

  • 下載最新發布包
  • 解壓到一個新的文件夾
  • 更新symlink,讓它指向剛建立的文件夾
  • 重啓Node應用

毫無疑問,這些步驟必須自動化,無需任何手動操做。像Ansible、Chef或者Puppet能夠幫忙。

回滾

若是發生了錯誤,遲早會發生。確保有一個回滾的腳本。最快、最簡單的方式是將symlink指向到前一個構建並重啓node應用。

推薦閱讀:
具備可操做性的運行Node.js的建議。

相關文章
相關標籤/搜索