如何從零開始搭建 CI/CD 流水線
在當前 DevOps 的趨勢下,持續整合(CI)和持續部署(CD)具有支柱性地位,那麼能夠成功搭建 CI/CD 流水線就至關重要了。我們可能會在各種角色的崗位描述中發現關於「持續整合」和「持續部署」技能的要求,比如:資料工程師、雲解決方案架構師、資料科學家等。為了在開發團隊和運營團隊之間搭建橋樑,CI/CD 流水線實現了應用程式的自動構建、自動測試和自動部署。本文中,我們將介紹什麼是 CI/CD 流水線,以及它是如何工作的。
在介紹 CI/CD 流水線的工作原理之前,我們先了解一下什麼是 DevOps。
什麼是 DevOps?
DevOps 是一種軟體開發方法。它將持續開發、持續測試、持續整合、持續部署和持續監控貫穿於軟體開發的整個生命週期。當前幾乎所有的頂尖公司均採用了該方法,用以提高軟體開發質量,並縮短軟體開發生命週期。從而以達到每個公司對軟體產品的期望,交付出客戶最滿意的產品。
DevOps 生命週期
要想完整的理解 DevOps,我們還需要了解一下 DevOps 的生命週期。接下來,我將通過一張圖來展示 DevOps 的生命週期以及它和軟體開發生命週期之間的關係。
什麼是 CI/CD 流水線?
CI 代表持續整合(Continuous Integration),CD 代表持續交付(Continuous Delivery)和持續部署(Continuous Deployment)。也可以將它們看作是類似於軟體開發生命週期的過程。
現在我們來看一下它是如何工作的。
如上圖所示,該流水線展示了一個軟體在其最終交付給客戶或者投入上線之前,它在其生命週期內各個階段中的移動過程。
接下來我們具體看一下該 CI/CD 流水線。假如我們要構建一款 Web 應用程式,並將它部署在一個現場 Web 伺服器上。同時我們有一組開發人員,他們主要負責編寫程式碼,並將程式碼構建為 Web 應用程式。假設現在開發團隊已經將程式碼提交到版本控制系統(如:Git,SVN)中了。
構建階段
接下來,程式碼將會經歷構建階段,這也是 CI/CD 流水線的第一階段。在此之前,開發者已經將他們的程式碼加上合適的標籤,並提交到版本控制系統中了。
假如我們採用的是 Java 語言,那麼還需要先進行程式碼編譯。因此,程式碼在通過版本控制階段之後,會先在構建階段予以編譯。該階段會從程式碼庫的各個分支中獲取到所有的功能程式碼,合併後最終通過一個編譯器來編譯它們。這整個過程都被稱為「構建階段」。
測試階段
構建階段結束後,將會繼續進入到程式碼的「測試階段」。在這個階段中,我們會進行各種各樣的測試,單元測試就是其中之一。在該階段中,我們會測試程式碼中多個元件間的關係或者單個元件的功能,同時也會進行軟體的可用性測試。
部署階段
測試階段完成後,就要進入「部署階段」了。在該階段,程式碼將會被部署到準生產環境伺服器(staging server)或者測試環境伺服器(test server)中。同時在該階段中,我們既可以檢視程式程式碼,也可以在模擬器中執行該應用程式。
自動測試階段
只要我們的程式碼部署成功,我們就可以執行另一組可用性測試了。該階段結束後,如果所有的測試都通過了,那麼就可以將其部署到生產環境中了。
部署到生產環境
另外值得一提的是我們可能在每一個階段的執行過程中遇到一些錯誤。在這種情況下,我們可以將錯誤郵件發回到開發團隊中,以便他們能夠及時修復這些錯誤。當開發團隊修復完成後,就可以將程式碼重新提交到版本控制系統中,然後再次從頭開始執行該流水線。
如果在執行測試的過程中遇到了任何錯誤,那麼這些錯誤也將反饋給開發團隊,等他們修復完成後,同樣會再次觸發該流水線,進行新一輪的持續迭代。
度量和驗證階段
因此,整個生命週期將會繼續迭代下去,直到我們得到可以直接部署到生產環境中的程式碼或者產品。除此之外,在生產環境中我們還需要對程式碼進行度量和驗證,以實時監控應用的線上執行狀態。
到目前為止,我們已經瞭解了 CI/CD 流水線及其工作原理,接下來我們將繼續介紹什麼是 Jenkins ,以及如何使用 Jenkins 部署示例程式碼,並自動化整個過程。
終極 CI 工具 - Jenkins
我們的目標是要將軟體開發生命週期的整個過程都自動化,從開發人員向程式碼庫中提交程式碼開始,到將此程式碼投入生產環境中使用為止。
為了使整個軟體開發流程處於 DevOps 模式或自動化模式,我們就需要對 CI/CD 流水線進行自動化。因此,我們還需要一款自動化工具來做這件事情,它就是 Jenkins。
Jenkins 為我們提供了各種介面和工具,用以實現軟體開發整個過程的自動化。
首先,我們需要擁有一個可以供開發人員提交程式碼的倉庫。同時,Jenkins 也提供了前端展示的頁面,我們可以使用該前端頁面來定義整個流水線的作業(job)和任務(task)。對於某一個應用程式而言,我們的目標就是通過特定的工具實現其持續整合和持續交付的自動化流程。
Jenkins 會從 Git 程式碼倉庫中拉取各個分支的程式碼,然後將其移動到 “程式碼提交階段”。拉取到各個分支的程式碼之後,Jenkins 就會將其繼續移動到“構建階段”,該階段會對程式碼進行編譯工作。如果是像 Java 這類語言的話,我們還可以在 Jenkins 中選用 maven 之類的構建工具,通過 maven 對程式碼進行編譯。之後在部署過程中,還可以將編譯好的程式碼進行一系列的測試,同時這些測試也會由 Jenkins 監督執行。
之後,Jenkins 就會將程式碼移動到準生產環境,並使用 Docker 進行部署。在準生產環境中會執行一系列單元測試和可用性測試。如果能夠通過所有的測試,Jenkins 就會將它繼續移動到生產環境中。
這就是 Jenkins 在持續整合和持續交付中所發揮的作用,它幾乎能夠自動化所有的事情。現在,我們還需要一個和生產環境一致的環境用以部署程式碼,它就是 Docker。
Docker
Docker 就像是一個虛擬的環境,我們可以在其中建立一個伺服器。我們可能需要花費一點時間在 Docker 中部署整個伺服器以及我們想要測試的工件。那麼,這裡我們遇到的問題就是:
我們為什麼要使用 Docker 呢?
如前所述,通過 Docker 我們可以在幾秒鐘的時間內執行整個伺服器叢集。同時我們還有 Docker 映象的註冊中心,可以用來永久地儲存構建出的 Docker 映象。因此,我們在任何時候都能複製出一份 Docker 映象並執行它。
Docker 和 Jenkins 構建 CI/CD 流水線
第 1 步:在虛擬機器中開啟終端。通過命令 “systemctl Start Jenkins”、“systemctl enable Jenkins” 和 “systemctl Start Docker” 來啟動 Jenkins 和 Docker。
注意:如果提示 “privileges error” 錯誤的話,就在命令前面加上 sudo。
第 2 步:在瀏覽器中開啟在指定埠執行的 Jenkins。通過點選 “New Item” 來建立一個 Job。
第 3 步:選擇 “freestyle project” 並填寫專案的名稱(如下以 “Job1” 為例),並點選 OK 確認。
第 4 步:選擇 “Source Code Management”(原始碼管理),並提供一個 Git 倉庫地址。然後再點選 “Apply” 和 “Save” 按鈕確認。
第 5 步:點選 “Build” 選項,並在下面的選單中選擇 “Select Execute Shell”。
第 6 步:輸入 shell 命令。如下示例指令碼會構建已歸檔的檔案,並得到 war 格式的檔案。在此之後,它將會拉取最新的程式碼,然後,採用 maven 安裝所依賴的包。因此,在這個步驟中只是簡單的安裝了依賴並對應用程式進行了編譯。
第 7 步:通過點選 “New Item” 來建立一個新的 Job。
第 8 步:選擇 “freestyle project” 並填寫專案的名稱(如下以 “Job2” 為例),並點選 OK 確認。
第 9 步:選擇 “Source Code Management”(原始碼管理),並提供一個 Git 倉庫地址。然後再點選 “Apply” 和 “Save” 按鈕確認。
第 10 步:點選 “Build” 選項,並在下面的選單中選擇 “Select Execute Shell”。
第 11 步:輸入 shell 命令。如下示例指令碼將會開始程式碼的整合階段,並構建出 Docker 容器。
第 12 步:通過點選 “New Item” 來建立一個新的 Job。
第 13 步:選擇 “freestyle project” 並填寫專案的名稱(如下以 “Job3“ 為例),並點選 OK 確認。
第 14 步:選擇 “Source Code Management”(原始碼管理),並提供一個 Git 倉庫地址。然後再點選 “Apply” 和 “Save” 按鈕確認。
第 15 步:點選 “Build” 選項,並在下面的選單中選擇 “Select Execute Shell”。
第 16 步:輸入 shell 命令。如下示例將會檢查 Docker 容器檔案,並將它部署在 8180 埠上。點選 Save 按鈕儲存。
第 17 步:點選選擇 Job1 ,進入 Job1 後再選擇 Configure 選項。
第 18 步:點選 Post-build Actions 選項,並在下面的選單中選擇 Build other projects。
第 19 步:填寫在 Job1 構建完成後需要執行的任務(如下示例中為 Job2),並點選 Save 按鈕儲存。
第 20 步:點選選擇 Job2,進入 Job2 後再選擇 Configure 選項。
第 21 步:點選 Post-build Actions 選項,並在下面的選單中選擇 Build other projects。
第 22 步:填寫在 Job2 構建完成後需要執行的任務(如下示例中為 Job3),並點選 Save 按鈕儲存。
第 23 步:接下來我們將通過點選 “+” 號建立一個流水線檢視。
第 24 步:選擇 “Build Pipeline View” 並填寫檢視的名稱(如下以 CI CD Pipeline 為例)。
第 25 步:選擇 “Initial Job”(如下以 Job1 為例),並點選 OK 按鈕確認。
第 26 步:點選 Run 按鈕來啟動 CI/CD 流水線的流程。
第 27 步:在流水線成功執行完成之後,我們可以在瀏覽器中開啟 localhost:8180/sample.text 進行驗證。此時該應用程式已處於執行狀態,並且瀏覽器中會顯示出此文字檔案的具體內容。
到目前為止,我們已經學習瞭如何使用 Docker 和 Jenkins 來建立 CI/CD 流水線。之所以要採用 DevOps 模式,目的就是為了可以更快速更可靠的構建出高質量的軟體,同時還能夠加深團隊之間的溝通和協作。
英文原文: https://medium.com/edureka/ci-cd-pipeline-5508227b19ca