Skip to main content

持續性整合與發佈 (Continuous Integration / Continuous Delivery) 之相關應用

為什麼我們需要 CI / CD ?

現今許多軟體公司皆以敏捷式或其變形之開發方法為圭臬,其優點為:在比較小且快速的循環中,持續驗證系統開發結果,小部分小部分地儘早確認,期望開發產出能符合原始需求,或依據產出進行快速修正。要實現這個目標,需要完成自動化工作,這仰賴許多軟體工具,包含:原始碼版本控制系統(Git or SVN)等等。

本文著重其中一個重要的過程:CI (Continuous Integration) 與 CD (Continuous Delivery & Continuous Deployment),也就是持續性整合與持續性發布及部署。

什麼是持續性整合(CI)呢?持續性整合的目的為:針對軟體系統每個變動,能持續且自動地進行驗證。此驗證可能包含了:

  • 建置 (build)
  • 測試 (test)
  • 程式碼分析 (source code analysis)
  • 其他相關工作

驗證完成後,進一步可以整合自動化發佈或部署 (Continuous Delivery / Continuous Deployment) 。透過此流程可以確保軟體品質,不會因為一個錯誤變動而產生錯誤結果或崩潰(Crash)。此流程中的各類工具,也會產生一些回饋給開發者或其他角色,包含網頁/報表等等,用來追蹤並改善軟體潛藏的問題。

工具的選擇

Jenkins

談到 CI,最廣為人知且老牌的工具是 Jenkins。Jenkins的功能完整,也提供了上千個外掛 (Plugins) 來對應各種開發語言與工具。Jenkins目前已發展到了 2.x 版,新版本中對於 Pipeline 概念及容器 (Container) 整合也趨於完整,是一套可以自訂運用的系統。但也因為其功能強大、客製程度高,上手需要一些時間。然而一旦流程被定義,並整合好相關環境,它可以發揮持續性整合威力,大幅增加開發生產力。

Sonarqube

在靜態程式碼分析部分,也有許多免費或付費軟體工具可以選擇。其中一個對於語言支援完整,且易於整合的工具是 Sonarqube,它是一個開源且免費的軟體工具,概念是 Continuous Inspection,能持續地對於程式碼做檢驗。它提供了程式碼品質分析、弱點掃描、計算技術債天數等等多樣化的功能,並以容易閱讀的網頁介面呈現,對於程式碼生命週期(Life Cycle) 提供了可窺得全貌的檢視,促成軟體的改善與成長。

原始碼控制管理系統 (Source Control Management)

對CI/CD而言,一個好的 Source Control Management 系統也是絕對必要的。目前業界最知名的莫過於 GitHub。不過如果公司內部使用需要私有原碼庫(private repository),則必須選用 GitHub Enterprise,費用上會比較高。另一個廣為人知的選擇是 Atlassian 的 BitBucket 服務。此兩者都可以支援各種開發所需的工作流程,無論是 Git Flow, Protected Branch Flow, 或是 GitHub Flow。這兩者服務屬於雲端平台(SaaS),如果公司政策上必須使用 On-Premise Git 服務,可以在內部架設 GitLab 來使用。GitLab也提供了完整的開發流程支援,並提供已整合的 GitLab CI, Docker Registry 等等,對於一些輕量快速開發方法,也會是一個好的選擇。

PS. BitBucket 其實也提供私有解決方案:BitBucket Server,而GitLab 同時也提供 GitLab.com Cloud Service, 提供了不限數量且完全免費的私有原碼庫。

Slack

一般而言,CI/CD的狀態,需要自動化串連並主動通知相關人員。目前業界領導的付費平台是Slack,免費的則有Telegram等通知平台。

建立 CI / CD 流程雛形

利用以上工具, 可以快速打造CI雛形。以下利用一個循序圖來說明 91APP 的部份實務運作方式:

我們結合了 Git Flow + Protected Branch Flow 的開發流程,流程如下:

  1. 開發者 (Developer) 先開立 (create) 一個功能分支 (feature branch)。
  2. 開發者提交一個 Pull Request, SCM 系統會自動觸發 Jenkins 進行建置以及測試。這個觸發通常是經由 Webhook 來實現。
  3. 在軟體建置完成後,在 Jenkins 增加一個步驟來送出原碼掃描 (Code Scan) 的請求給 Sonarqube 系統。Sonarqube 則在完成程式碼掃描後將結果寫回 SCM 系統。
  4. 由於我們在 SCM 上連結了 Slack,每個步驟完成(成功或失敗)的通知便可以送到 Slack 群組。
  5. 原碼審核者 (Reviewer) 可以到 SCM 上查看這個Pull Request的相關訊息,搭配 Code Scan的結果決定是否將這個分支合併 (merge) 回主線(develop/master branch)。
  6. 分支合併可以觸發另一個 CI 工作,使 Jenkins 將主線建置後部署到測試環境提供給其他人員進行測試。

未來演進

  • CI 系統進一步可以引進 pipeline 的概念:將線性流程轉變為樹狀流程。例如:在一個 commit 中,自動化建置不同環境不同版本,產生各種產生物 (Artifacts),滿足測試及部署需要。
  • 如 Docker 這類容器技術,也能與 CI 產生有效的整合。容器可以提供一致且隔離的獨立環境,避免因環境使得系統產生不一致的結果,也可以把容器映像 (container image) 作為 CI 建置後的產生物,供測試部署使用。
  • 發佈或部署的後續整合,也會是未來發展的重點。如:結合 Ansible / Chef / Puppet 這類管理工具來支援部署環境的變化,提供 Blue-Green Deployment, Canary Release, 或是 A/B Testing 等等機制以滿足業務面需求。

結語

91APP 作為台灣品牌獨立雲端 SaaS 的領導品牌,在各種系統自動化耕耘持續投入,也才得以快速在各方面成長。我們擁有業界最先進知識與實作環境,如果您對電商、對雲端、對大型及大流量網站架構有興趣,也歡迎一起加入我們

搶攻行動商機,現在就加入 7,000 家已在網路開店的品牌行列!
分享至:
從事多樣化的開發工作,喜好嘗試新技術,期許用 coding 創造價值,讓這個世界更好一點點。

掌握最新電商脈動,加入 91APP 品牌全通路學院!

免費獲得最新市場趨勢、行銷技巧與資源,直接送達您的信箱。

完全免費,可隨時取消。
搶攻行動商機,現在就加入 7,000 家已在網路開店的品牌行列!