CI/CD 是什麼?他們之間的差別在哪裡?

古古

2025/05/05


大家在工作上可能常常會聽到 CI/CD、持續集成、持續部署…等等的名詞,但是卻不清楚這些名詞背後所代表的意義是什麼,因此這篇文章我們就來介紹一下,到底什麼是 CI/CD,以及他們之間的區別吧!

什麼是 CI/CD? #

所謂的 CI/CD,他其實要拆分成兩個名詞來看,分別是 CI 和 CD:

  • CI(Continuous Integration,持續集成)
  • CD(Continuous Delivery,持續交付)

所以雖然 CI 和 CD 長得很像,但是他們實際上所負責的是完全不同的流程!所以接下來我們就分別來看一下,CI 到底是負責什麼部分、而 CD 又是負責哪些部分。

CI(持續集成) #

所謂的 CI,就是指「計畫需求、實作程式、建置程式、測試程式」這四個步驟的統稱,而 CI 的終極目標,就是要讓這四件事可以被「自動化」執行,重點在「自動化」。

舉例來說,不管你是前端工程師、後端工程師、還是 Android/iOS 工程師,只要你的工作內容是「寫程式完成客戶的需求」(客戶可以是企業用戶,也可以是一般使用者),那麼你就是屬於開發者(Developer),而 Developer 的日常任務,其實就是大家常常在做的釐清需求、寫程式、測試程式而已。

所以 CI 並不是一個什麼新的流程,他只是希望可以把 Developer 日常的工作整合在一起,讓大家在「釐清需求 → 寫程式 → build code → 測試程式」這段路可以做得更順暢一點而已。

因此在 CI 的流程中:

  1. 首先會先從 plan(計畫)開始,也就是先釐清需求為何
  2. 釐清好需求之後,接著就進到 code 的環節,開始去實作程式
  3. 等到程式實作完之後,這時候就可以進到 build 環節來 build code(建置程式),通常前端會用 webpack 來 build code、後端則是用 Maven 和或是 Gradle 來 build
  4. build 完程式之後就會進到 test 環節,此時就可以運行單元測試、或是運行自動化測試,確保我們所 build 出來的 code 是能正常運行的

因此大家也可以觀察一下,當你 push code 到你們公司的 GitHub、GitLab、BitBucket 等…雲端時,常常就會觸發一些 job 去 build code、去執行單元測試,而這些自動化執行的 job,其實都是 CI 的一環!!

也因為有了這些自動化 build code、自動化執行單元測試的 job,所以我們作為 Developer 不僅可以省去反覆手動操作的時間,也可以確保我們所撰寫的程式是已經被驗證過的,不會 merge 一份有問題的程式回 master branch。

所以到這裡,CI 的任務就完成了,因此簡單來說,CI 只要好好守護 Developer 們能夠把程式 build 完、把測試程式 run 完,CI 就功成身退了,接下來就是要進到 CD 的戰場了!

CD(持續交付) #

在我們進入 CD 的介紹前,大家可以先回想一下,你作為 Developer(前後端均可),是否還記得當你的 Pull Request 被 merge 之後,到底發生了什麼事嗎?如果你沒辦法很明確的說出後續每一個步驟在幹嘛,其實是非常正常的,因為「部署程式」這件事情,在職責上確實不歸 Developer 管。

一般在分工比較細的大公司來說,會將工程師區分成兩種人:Developer(開發工程師)和 Operations(維運工程師),其中 Developer 就是負責寫程式,達成 PM 的需求,而 Operations 則是負責部署程式,將 Developer 寫的程式部署到 server 上,讓使用者可以真的用到這個程式。

所以所謂的 CD,就是指 Operations 中的「發佈程式、部署程式、維運程式、監控程式運行狀態」這四個步驟的統稱,而 CD 的終極目標,一樣是要讓這四件事可以被「自動化」運行(這裡的自動化有一點微妙的差別,等等會介紹)。

因此在 CD 的流程中:

  1. 首先會從 release 開始,也就是當 Developer 的程式被 merge 之後,維運工程師就可以開始來處理發版的部分
  2. 發佈完成之後,接著就會進到 deploy 的環節,將這份程式部署到 server 上
  3. deploy 完成之後會進到 operate 環節,管理程式是否有正常運行
  4. 最終則是 monitor 環節,持續監控程式的運行狀態,時時刻刻確保服務在線,不會中斷

所以在 CD 的流程中,可以看到幾乎全部都是在做部署程式、維護 server 的相關操作,而這裡擴展下去就可以講非常非常廣了。

舉例來說,如果今天 server 選擇部署在 AWS 上,那麼如何更好的管理和運用 AWS 上的服務,就是 CD 要處理的部分,如果今天換成使用另一個雲端服務 GCP,那麼 CD 又會需要跟著改。

又或是說,假設今天是使用 Docker + Kubernetes 來部署程式,那麼如何打包 image、如何設定環境變數、如何使用 Kubernetes 調度 pod…等等,這些也是 CD 要處理的部分。

因此 CD 在玩法上可以說是更加的多樣化,追求的已經不僅僅是「把程式弄到 server 上去 run」這麼簡單而已,而是要追求「又快、又好擴展、又安全、又省錢」這種巔峰造極的境界了。

也因為如此,近幾年的部署流程其實也是各種飛速發展,其中最熱門的大概就是 Docker + Kubernetes 這類的容器化部署了,大家如果對這方面有興趣的話,可以參考我之前寫的 Docker 介紹,或是搜尋網路上各位大大們的 Docker 教學。

反正總而言之,CD 的任務就是要守護 Operations(維運工程師),讓維運工程師可以用最有效率的方式去部署和管理 server,同時也努力幫老闆省下最多的成本就對了!

補充:Continuous Delivery 和 Continuous Deployment 的差別 #

了解了 CD 的概念之後,這裡也補充一下前面提到的「有點微妙的自動化」的部分。

在 CD 中,又可以細分成 Continuous Delivery(持續交付)和 Continuous Deployment(持續部署),他們兩個之間的差別就在於「部署到 production 正式環境這一步,是否需要人工手動操作」。

  • Continuous Delivery(持續交付):部署到 production 環境需要人工手動操作
  • Continuous Deployment(持續部署):全自動化,不需人工介入

像是在前面的 CI 和 CD 的介紹中,一直有提到 CI 和 CD 的終極目標是「自動化」執行,但是會不會自動化過了頭,反而導致我們所交付的程式有問題呢?

舉例來說,假設當你所寫的程式被 merge 回 master branch 之後,假設就這樣自動化一路部署到 production 環境,中間完全沒有任何人再對他進行壓力測試、或是沒有進行服務的整合測試,可能就會出現意料之外的問題。

還有一個問題是,有時候功能的發佈是會需要搭配商業策略的,譬如說 iOS 的新功能常常會在 iPhone 發表會上宣布,這就是一種為了商業策略而延遲發版的行為。

因此一般在實務上,Continuous Delivery(持續交付)會是比較常見的做法(即是部署到 production 環境時需要人工手動操作),並且在 CI/CD 流程中的 CD,在正式的定義上也是指 Continuous Delivery(持續交付)的意思。

CI/CD 總結 #

所以總結上述的介紹,所謂的 CI/CD 其實是指 CI 和 CD 這兩個不同的流程:

  • CI(持續集成):為「計畫需求、實作程式、建置程式、測試程式」這四個步驟的統稱, 目標是將這些步驟自動化運行,守護 Developer(開發工程師)直到把程式 merge 進 master branch
  • CD(持續交付):為「發佈程式、部署程式、維運程式、監控程式運行狀態」這四個步驟的統稱, 目標是將這些步驟自動化運行(部署到 production 環境除外),守護 Operations(維運工程師)部署和管理 server

所以透過 CI 和 CD 的輔助,Developer 和 Operations 就可以在各自的流程中加快效率,進而達到「持續寫程式 → 持續集成程式 → 持續發版 → 持續交付 → 持續監控程式運行狀態 → 回頭繼續寫程式」的完美循環了!!!

PS: 注意看上面這張圖,遠看他其實就是一個無限大的符號 ∞,表示 CI/CD 是一個能夠無限運行下去的完美循環。

補充:什麼是 DevOps? #

了解了 CI/CD 的概念之後,最後我們再來加碼補充一下什麼是 DevOps 吧!

其實 DevOps 這個職位是在 CI/CD 出現之後才興起的職缺,因為在 CI/CD 的流程中,Developer(開發工程師)和 Operations(維運工程師)是需要非常緊密的合作,才能夠達到最高的效率的。

舉例來說,如果 Operations 在後期的部署階段需要使用 Docker + Kubernetes 來部署,那麼 Developer 在前期就需要將程式盡可能地縮小,配合容器化的概念來實作程式,因此即使後面的部署流程和 Developer 沒有關係,但是 Developer 在開發上仍舊會被 Operations 影響,需要互相配合。

而 Operations 其實也是會反過來被 Developer 影響,像是如果 Developer 亂切服務、每個專案的設置都不一樣…等等,這些也是會造成 Operations 在後期的部署和管理上的困難。

因此這時候,就有人提出了一個想法:如果我們雇用一個超超超級強的人,他又懂 Developer 又懂 Operations,既會寫 code 又會部署,這樣他是不是就可以一人分飾兩角,在寫 code 時就預先避免掉後期部署可能會造成的影響、並且在後期部署時也不要反向影響 code 的架構,這樣不就天下太平了嗎?

沒錯,就是因為這個想法,所以 DevOps 這個職位就誕生了(DevOps 即是 Developer + Operations 的組合字,左半邊的 CI 是 Dev,右半邊的 CD 是 Ops)。

所以對於 DevOps 來說,他真的是包山包海,什麼都來一點,左手寫 code 右手部署,DevOps 就是 Developer 團隊和 Operations 團隊的橋樑,由他來串起整個 CI/CD 的全貌。

不過當然啦,即使上面的願景很好,但實際在工作中每個 DevOps 專精的領域還是會有點不太一樣(有的比較會寫 code、有的比較會部署),目前台灣比較常見的 DevOps 好像都是偏部署的居多,這方面我也還在學習中,如果有更多內容後續再和大家分享~

結語 #

這篇文章我們先分別介紹了 CI 和 CD 的流程是什麼、以及他們各自要守護的人是誰,並且也補充了 DevOps 職位的存在意義,希望可以讓大家對 CI/CD 有更多的認識。

如果你對後端技術有興趣的話,也歡迎免費訂閱《古古的後端筆記》電子報,每週二為你送上一篇後端技術分享,那我們就下一篇文章見啦!

補充:我開設的 Spring Boot 零基礎入門Spring Security 零基礎入門GitHub 免費架站術 已在 Hahow 平台上架啦!輸入折扣碼「HH202505KU」即可享 85 折優惠。

免費訂閱《古古的後端筆記》電子報

每週二學習後端技術,和 3400 人一起變強💪