Serverless Devs 重大更新,基於 Serverless 架構的 CI/CD 框架:Serverless-cd

阿里巴巴雲原生發表於2022-11-29

近日,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 工具一般會面臨如下幾個問題:

  1. 資源利用率低:需要提前準備構建機器,在沒有構建任務時,機器資源浪費;
  2. 任務排隊:如果資源準備不充足,在業務構建的高峰期間, 任務排隊時間過長;
  3. 隔離性差:如果某個任務執行過程中消耗大量計算/儲存資源,導致其他任務失敗;
  4. 安全問題:

    1. 使用平臺提供的CICD服務:程式碼和構建機器不在同一個網路環境,不得不開放公網訪問,引起安全問題。
    2. ECS虛機部署:多個應用同時在一個例項構建,某個惡意應用可以訪問其他的應用的程式碼

      CI/CD 流水線的 2個特點

      CI/CD 流水線有兩個顯著的特點:

  5. 事件驅動

無論是接收 Webhook 自動觸發,還是呼叫 Open Api 手動觸發,對於 CICD 系統來說都是被動接收指令進行消費

  1. 業務明顯波峰波谷

觸發 CI/CD 構建的高峰一般在上班的時間段中,下班後以及晚上構建任務比較少。同時有些任務執行非常耗時,有些任務又需要大量的CPU&記憶體資源,很難提前進行有效的容量預估。

  • 機器資源準備過少:由於資源不足導致任務執行失敗,或者多個任務進行資源搶佔,一直無法執行。
  • 機器資源準備過多:無法充分利用,造成資源閒置浪費。

    基於Serverless架構的CI/CD優勢

    在 Serverless 架構下,CI/CD 可以具備以下優勢

  1. 自動彈性

Serverless 平臺會為每個構建任務分配一個全新的例項,保證每個任務之間互不影響。再也不用擔心資源不足導致任務失敗,也避免了由於資源不足導致任務一直排不上隊的情況。

  1. 價值付費

在業務波谷(晚上或者下班後)期,只有少量甚至沒有任務執行,資源就出現了閒置和浪費。Serverless 的理念是幫助客戶按實際產生的價值付費,只有實實在在的發生了構建行為,才會產生費用。

  1. 免運維

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 模型,採用事件驅動的架構,整體的架構如下圖:
image.png

觸發方式

觸發器承擔事件驅動中的生產者的角色,Serveless-cd暫時提供了三種觸發方式:

  1. 透過Webhook自動觸發:

開發者可以配置對應的觸發條件:比如Push到Master分支,發起Merge Request。這是一種非常敏捷的開發和交付的方式

  1. 透過Open api觸發:

Serverless cd平臺的所有的能力都提供開放了Open api。以便開發者更好的構建企業內部的PaaS平臺

  1. 透過CLI觸發:

從技術的角度來看Serverless-Devs本質是一個CLI工作,提供了元件化的能力,所謂的元件化也就是透過熱更新的機制,讓開發者根據自己的需求進行擴充。Serverless-cd透過自定義元件,讓開發者可以透過透過命令列直接操作。
當然我們也在計劃接入更多的觸發型別,比如 cloudevents 觸發, 定時觸發等

Serverless(FaaS) 平臺

FaaS平臺是整個平臺的核心部分,承擔事件驅動中的消費者角色,採用的是經典的 Master Worker 模型。

Master Worker 模型在 Serverless 架構的優勢

傳統的Master Woker部署,為了保證Master節點的高可用,需要部署三個節點搭配負載均衡以及健康檢查,來保證Master節點高可用。在Serverless架構中,例項會根據請求自動彈性擴容,Master節點天然具備高可用能力,無論在可靠性,還是靈活性都有較大的優勢

Master 函式作用

Master 函式本質是一個 HTTP 型別函式,作為整體流量的入口,同時也是整個系統的大腦,承擔著非常重要職責。

  1. 安全保障
  2. 公網金鑰校驗
    Master 暴露的 URL 地址是可以公網訪問的,為了防範惡意請求,serverless-cd 系統在下發 URL 的同時也會下發簽名規則。如果是惡意的請求,就無法透過校驗,來保證系統的安全性
  3. VPC 繫結

也支援繫結VPC環境,程式碼倉庫和serverless-cd 服務繫結在同一個VPC環境,透過Webhook觸發。公網使用者無法直接訪問,從網路上保證了絕對的安全

  1. 過濾請求

我們每天在 Git Repository 會觸發各種事件,比如新建 ISSUE,PUSH 程式碼,發起 Merge Request 等。這些動作都會透過 Webhook 觸發,開發者可以配置規則過濾相關事件。下面是一個示例:代表在 GitHub 平臺提交到Master 的程式碼才會觸發

triggers:
  github:
    events:
      - eventName: "push"
        filter: 'body.ref in ["refs/heads/master"]'
  1. 路由轉發

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化。

  1. 下載安裝 Serverless Devs:npm install @serverlesss-devs -g (版本必須大於2.1.7),詳細操作引導請參考Serverless Devs 安裝文件
  2. 配置密匙資訊:s config add, 詳細操作引導請參考配置阿里雲秘鑰
  3. 初始化專案:s init serverless-cd
  4. 進入專案並部署: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生態
image.png

更多內容關注 Serverless 微信公眾號(ID:serverlessdevs),彙集 Serverless 技術最全內容,定期舉辦 Serverless 活動、直播,使用者最佳實踐。

相關文章