近日,Serverless 開發者平臺 Serverless Devs 重磅釋出基於 Serverless 架構的輕量級 CI/CD 框架——Serverless-cd。Serverless-cd 是一款執行在 Serverless 架構上的功能強大而靈活,安全,低成本的CI/CD開源框架。該框架基於 Serverless Devs 開發者工具打造,透過 Serverless-cd開發者可以快速構建企業內部應用管理PaaS平臺。
開發者更想關注業務價值的創造
Serverless Devs 是CNCF 沙箱孵化專案,2020年由阿里雲開源,它是一個開源開放的 Serverless 開發者平臺,Serverless Devs 也是業內首個支援主流 Serverless 服務 / 框架的雲原生全生命週期管理的平臺,致力於為開發者打造 Serverless 應用開發一站式服務,幫助解決目前的工具鏈之困,讓開發者一鍵體驗多雲產品,極速部署 Serverless 專案。
Serverless Devs 專案為應用的開發,除錯,部署,運維,監控提供全生命週期的解決方案。在實際使用中,應用部署和交付對於開發者來說仍然是一個難題。開發者希望更專注於應用的開發和價值的創造——也就是關注程式碼編寫和應用的構建,而非應用部署和交付。
在 Serverless-cd 專案釋出之前,Serverless Devs 專案透過整合的方式,整合了主流的 CI/CD 工具:https://github.com/Serverless-Devs/cicd,如 Jenkins、Github、Gitlab 等,但使用這些傳統的 CI/CD 工具一般會面臨如下幾個問題:
- 資源利用率低:需要提前準備構建機器,在沒有構建任務時,機器資源浪費;
- 任務排隊:如果資源準備不充足,在業務構建的高峰期間, 任務排隊時間過長;
- 隔離性差:如果某個任務執行過程中消耗大量計算/儲存資源,導致其他任務失敗;
安全問題:
- 使用平臺提供的CICD服務:程式碼和構建機器不在同一個網路環境,不得不開放公網訪問,引起安全問題。
ECS虛機部署:多個應用同時在一個例項構建,某個惡意應用可以訪問其他的應用的程式碼
CI/CD 流水線的 2個特點
CI/CD 流水線有兩個顯著的特點:
- 事件驅動
無論是接收 Webhook 自動觸發,還是呼叫 Open Api 手動觸發,對於 CICD 系統來說都是被動接收指令進行消費
- 業務明顯波峰波谷
觸發 CI/CD 構建的高峰一般在上班的時間段中,下班後以及晚上構建任務比較少。同時有些任務執行非常耗時,有些任務又需要大量的CPU&記憶體資源,很難提前進行有效的容量預估。
- 機器資源準備過少:由於資源不足導致任務執行失敗,或者多個任務進行資源搶佔,一直無法執行。
機器資源準備過多:無法充分利用,造成資源閒置浪費。
基於Serverless架構的CI/CD優勢
在 Serverless 架構下,CI/CD 可以具備以下優勢
- 自動彈性
Serverless 平臺會為每個構建任務分配一個全新的例項,保證每個任務之間互不影響。再也不用擔心資源不足導致任務失敗,也避免了由於資源不足導致任務一直排不上隊的情況。
- 按價值付費
在業務波谷(晚上或者下班後)期,只有少量甚至沒有任務執行,資源就出現了閒置和浪費。Serverless 的理念是幫助客戶按實際產生的價值付費,只有實實在在的發生了構建行為,才會產生費用。
- 免運維
Serverless 彈性是按照請求進行水平擴容的,開發者無需關注底層資源排程和運維的工作,可以心無旁騖的實現業務開發和價值創造。
Serverless-cd 技術架構
Serverless-cd 是完全遵循 Serverless 架構最佳實踐,在規範和生態層面參考 Github Action 的實現。下面是Serverless-cd 部署 Serverless Devs 應用的一段 YAML:
name: "Deploy Express application to FC"
steps:
- run: npm i @serverless-devs/s -g --registry=https://registry.npmmirror.com
- run: s -v
- run: echo ${{secrets.ALIYUN_ACCOUNTID}}
- run: echo ${{secrets.ALIYUN_AK}}
- run: echo ${{secrets.ALIYUN_SK}}
- run: s config add --AccountID ${{secrets.ALIYUN_ACCOUNTID}} --AccessKeyID ${{secrets.SIMPLE_ALIYUN_AK}} --AccessKeySecret ${{secrets.SIMPLE_ALIYUN_SK}} -a default -f
- run: s deploy --use-local -y
Serverless-cd 採用的是經典的 Master Worker 模型,採用事件驅動的架構,整體的架構如下圖:
觸發方式
觸發器承擔事件驅動中的生產者的角色,Serveless-cd暫時提供了三種觸發方式:
- 透過Webhook自動觸發:
開發者可以配置對應的觸發條件:比如Push到Master分支,發起Merge Request。這是一種非常敏捷的開發和交付的方式
- 透過Open api觸發:
Serverless cd平臺的所有的能力都提供開放了Open api。以便開發者更好的構建企業內部的PaaS平臺
- 透過CLI觸發:
從技術的角度來看Serverless-Devs本質是一個CLI工作,提供了元件化的能力,所謂的元件化也就是透過熱更新的機制,讓開發者根據自己的需求進行擴充。Serverless-cd透過自定義元件,讓開發者可以透過透過命令列直接操作。
當然我們也在計劃接入更多的觸發型別,比如 cloudevents 觸發, 定時觸發等
Serverless(FaaS) 平臺
FaaS平臺是整個平臺的核心部分,承擔事件驅動中的消費者角色,採用的是經典的 Master Worker 模型。
Master Worker 模型在 Serverless 架構的優勢
傳統的Master Woker部署,為了保證Master節點的高可用,需要部署三個節點搭配負載均衡以及健康檢查,來保證Master節點高可用。在Serverless架構中,例項會根據請求自動彈性擴容,Master節點天然具備高可用能力,無論在可靠性,還是靈活性都有較大的優勢
Master 函式作用
Master 函式本質是一個 HTTP 型別函式,作為整體流量的入口,同時也是整個系統的大腦,承擔著非常重要職責。
- 安全保障
- 公網金鑰校驗
Master 暴露的 URL 地址是可以公網訪問的,為了防範惡意請求,serverless-cd 系統在下發 URL 的同時也會下發簽名規則。如果是惡意的請求,就無法透過校驗,來保證系統的安全性 - VPC 繫結
也支援繫結VPC環境,程式碼倉庫和serverless-cd 服務繫結在同一個VPC環境,透過Webhook觸發。公網使用者無法直接訪問,從網路上保證了絕對的安全
- 過濾請求
我們每天在 Git Repository 會觸發各種事件,比如新建 ISSUE,PUSH 程式碼,發起 Merge Request 等。這些動作都會透過 Webhook 觸發,開發者可以配置規則過濾相關事件。下面是一個示例:代表在 GitHub 平臺提交到Master 的程式碼才會觸發
triggers:
github:
events:
- eventName: "push"
filter: 'body.ref in ["refs/heads/master"]'
- 路由轉發
Master 函式負責將請求分發給 Worker 函式,Worker 函式所有的行為都由 Master 函式控制
Worker函式作用
Worker 函式本質是一個事件(Event)函式,只和 Master 函式通訊,唯一的職責是處理 Pipeline,可以長時間執行。
自定義 pipeline
serverless-cd 支援三種方式自定義 pipeline
shell 指令碼
shell 指令碼是最容易理解也是使用最廣泛的
name: "shell example"
steps:
- run: echo Hello world
zx 指令碼
google/zx 允許開發者透過javascript語法來編寫您的Shell指令碼
name: "zx example"
steps:
- script: 'const listFile = await $`ls -la`; console.log(listFile)',
使用自定義應用(NPM Package)進行擴充套件
Serverless-cd也支援封裝通用的NPM包進行擴充套件:比如釘釘通知,企業微信通知,OSS檔案上傳等通用能力,都可以透過自定義應用擴充套件。自定義應用本質是釋出在NPM倉庫的包。
name: "zx example"
steps:
- run: @serverless-cd/dingding
快速體驗
提前準備
serverless-cd 部署完全是基於雲進行,依賴相關雲產品也是Serverless化。
- 函式計算FC:整個系統的計算能力執行在FC上
- 日誌服務SLS:分散式日誌儲存服務,更好的定位和發現問題
- 物件儲存OSS:用於儲存日誌資訊
表格儲存Tablestore: 應用和任務的雲資料資訊儲存
本地部署
- 下載安裝 Serverless Devs:
npm install @serverlesss-devs -g
(版本必須大於2.1.7),詳細操作引導請參考Serverless Devs 安裝文件 - 配置密匙資訊:
s config add
, 詳細操作引導請參考配置阿里雲秘鑰 - 初始化專案:
s init serverless-cd
進入專案並部署:
cd serverless-cd && s deploy
Serverless-cd RoadMap
開源共建
Serverless-cd 是業界首個基於 Serverless 架構的 CI/CD 的探索,歡迎大家關注我們的開源地址:https://github.com/Serverless-Devs/serverless-cd 。Serverless-cd 剛剛開源,還有大量的細節和工作,期待與更多開發者一起共建 Serevrless 生態,讓開發者可以心無旁騖的專注業務開發和價值創造。
PS: Serverless給前端帶來了一片嶄新的天地,筆者是一名前端開發者同學,在此呼籲更多前端同學可以一起共建Serverless生態
更多內容關注 Serverless 微信公眾號(ID:serverlessdevs),彙集 Serverless 技術最全內容,定期舉辦 Serverless 活動、直播,使用者最佳實踐。