如何从零开始搭建 CI/CD 流水线
來源 | Saurabh Kulshrestha
譯者 | 徐進
持續(xù)集成和持續(xù)部署成為現(xiàn)代 DevOps 趨勢下的重要環(huán)節(jié),很多角色崗位都要求 CI/CD 的相關技能。本文介紹了什么是 CI/CD 流水線,以及如何從零構建 CI/CD 流水線
在當前 DevOps 的趨勢下,持續(xù)集成(CI)和持續(xù)部署(CD)具有支柱性地位,那么能夠成功搭建 CI/CD 流水線就至關重要了。我們可能會在各種角色的崗位描述中發(fā)現(xiàn)關于「持續(xù)集成」和「持續(xù)部署」技能的要求,比如:數(shù)據(jù)工程師、云解決方案架構師、數(shù)據(jù)科學家等。為了在開發(fā)團隊和運營團隊之間搭建橋梁,CI/CD 流水線實現(xiàn)了應用程序的自動構建、自動測試和自動部署。本文中,我們將介紹什么是 CI/CD 流水線,以及它是如何工作的。
什么是 CI/CD 流水線?
CI 代表持續(xù)集成(Continuous Integration),CD 代表持續(xù)交付(Continuous Delivery)和持續(xù)部署(Continuous Deployment)。也可以將它們看作是類似于軟件開發(fā)生命周期的過程。
現(xiàn)在我們來看一下它是如何工作的。
如上圖所示,該流水線展示了一個軟件在其最終交付給客戶或者投入上線之前,它在其生命周期內各個階段中的移動過程。
接下來我們具體看一下該 CI/CD 流水線。假如我們要構建一款 Web 應用程序,并將它部署在一個現(xiàn)場 Web 服務器上。同時我們有一組開發(fā)人員,他們主要負責編寫代碼,并將代碼構建為 Web 應用程序。假設現(xiàn)在開發(fā)團隊已經(jīng)將代碼提交到版本控制系統(tǒng)(如:Git,SVN)中了。
構建階段
接下來,代碼將會經(jīng)歷構建階段,這也是 CI/CD 流水線的第一階段。在此之前,開發(fā)者已經(jīng)將他們的代碼加上合適的標簽,并提交到版本控制系統(tǒng)中了。
假如我們采用的是 Java 語言,那么還需要先進行代碼編譯。因此,代碼在通過版本控制階段之后,會先在構建階段予以編譯。該階段會從代碼庫的各個分支中獲取到所有的功能代碼,合并后最終通過一個編譯器來編譯它們。這整個過程都被稱為「構建階段」。
測試階段
構建階段結束后,將會繼續(xù)進入到代碼的「測試階段」。在這個階段中,我們會進行各種各樣的測試,單元測試就是其中之一。在該階段中,我們會測試代碼中多個組件間的關系或者單個組件的功能,同時也會進行軟件的可用性測試。
部署階段
測試階段完成后,就要進入「部署階段」了。在該階段,代碼將會被部署到準生產(chǎn)環(huán)境服務器(staging server)或者測試環(huán)境服務器(test server)中。同時在該階段中,我們既可以查看程序代碼,也可以在模擬器中運行該應用程序。
自動測試階段
只要我們的代碼部署成功,我們就可以運行另一組可用性測試了。該階段結束后,如果所有的測試都通過了,那么就可以將其部署到生產(chǎn)環(huán)境中了。
部署到生產(chǎn)環(huán)境
另外值得一提的是我們可能在每一個階段的執(zhí)行過程中遇到一些錯誤。在這種情況下,我們可以將錯誤郵件發(fā)回到開發(fā)團隊中,以便他們能夠及時修復這些錯誤。當開發(fā)團隊修復完成后,就可以將代碼重新提交到版本控制系統(tǒng)中,然后再次從頭開始執(zhí)行該流水線。
如果在執(zhí)行測試的過程中遇到了任何錯誤,那么這些錯誤也將反饋給開發(fā)團隊,等他們修復完成后,同樣會再次觸發(fā)該流水線,進行新一輪的持續(xù)迭代。
度量和驗證階段
因此,整個生命周期將會繼續(xù)迭代下去,直到我們得到可以直接部署到生產(chǎn)環(huán)境中的代碼或者產(chǎn)品。除此之外,在生產(chǎn)環(huán)境中我們還需要對代碼進行度量和驗證,以實時監(jiān)控應用的線上運行狀態(tài)。
到目前為止,我們已經(jīng)了解了 CI/CD 流水線及其工作原理,接下來我們將繼續(xù)介紹什么是 Jenkins ,以及如何使用 Jenkins 部署示例代碼,并自動化整個過程。
終極 CI 工具 - Jenkins
我們的目標是要將軟件開發(fā)生命周期的整個過程都自動化,從開發(fā)人員向代碼庫中提交代碼開始,到將此代碼投入生產(chǎn)環(huán)境中使用為止。
為了使整個軟件開發(fā)流程處于 DevOps 模式或自動化模式,我們就需要對 CI/CD 流水線進行自動化。因此,我們還需要一款自動化工具來做這件事情,它就是 Jenkins。
Jenkins 為我們提供了各種接口和工具,用以實現(xiàn)軟件開發(fā)整個過程的自動化。
首先,我們需要擁有一個可以供開發(fā)人員提交代碼的倉庫。同時,Jenkins 也提供了前端展示的頁面,我們可以使用該前端頁面來定義整個流水線的作業(yè)(job)和任務(task)。對于某一個應用程序而言,我們的目標就是通過特定的工具實現(xiàn)其持續(xù)集成和持續(xù)交付的自動化流程。
Jenkins 會從 Git 代碼倉庫中拉取各個分支的代碼,然后將其移動到 “代碼提交階段”。拉取到各個分支的代碼之后,Jenkins 就會將其繼續(xù)移動到“構建階段”,該階段會對代碼進行編譯工作。如果是像 Java 這類語言的話,我們還可以在 Jenkins 中選用 maven 之類的構建工具,通過 maven 對代碼進行編譯。之后在部署過程中,還可以將編譯好的代碼進行一系列的測試,同時這些測試也會由 Jenkins 監(jiān)督執(zhí)行。
之后,Jenkins 就會將代碼移動到準生產(chǎn)環(huán)境,并使用 Docker 進行部署。在準生產(chǎn)環(huán)境中會運行一系列單元測試和可用性測試。如果能夠通過所有的測試,Jenkins 就會將它繼續(xù)移動到生產(chǎn)環(huán)境中。
這就是 Jenkins 在持續(xù)集成和持續(xù)交付中所發(fā)揮的作用,它幾乎能夠自動化所有的事情。現(xiàn)在,我們還需要一個和生產(chǎn)環(huán)境一致的環(huán)境用以部署代碼,它就是 Docker。
Docker
Docker 就像是一個虛擬的環(huán)境,我們可以在其中創(chuàng)建一個服務器。我們可能需要花費一點時間在 Docker 中部署整個服務器以及我們想要測試的工件。那么,這里我們遇到的問題就是:
我們?yōu)槭裁匆褂?Docker 呢?
如前所述,通過 Docker 我們可以在幾秒鐘的時間內運行整個服務器集群。同時我們還有 Docker 鏡像的注冊中心,可以用來永久地存儲構建出的 Docker 鏡像。因此,我們在任何時候都能復制出一份 Docker 鏡像并運行它。
構建 CI/CD 流水線
第 1 步:在虛擬機中打開終端。通過命令 “systemctl Start Jenkins”、“systemctl enable Jenkins” 和 “systemctl Start Docker” 來啟動 Jenkins 和 Docker。
注意:如果提示 “privileges error” 錯誤的話,就在命令前面加上 sudo。
第 2 步:在瀏覽器中打開在指定端口運行的 Jenkins。通過點擊 “New Item” 來創(chuàng)建一個 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” 來創(chuàng)建一個新的 Job。
第 8 步:選擇 “freestyle project” 并填寫項目的名稱(如下以 “Job2” 為例),并點擊 OK 確認。
第 9 步:選擇 “Source Code Management”(源代碼管理),并提供一個 Git 倉庫地址。然后再點擊 “Apply” 和 “Save” 按鈕確認。
第 10 步:點擊 “Build” 選項,并在下面的菜單中選擇 “Select Execute Shell”。
第 11 步:輸入 shell 命令。如下示例腳本將會開始代碼的集成階段,并構建出 Docker 容器。
第 12 步:通過點擊 “New Item” 來創(chuàng)建一個新的 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 構建完成后需要執(zhí)行的任務(如下示例中為 Job2),并點擊 Save 按鈕保存。
第 20 步:點擊選擇 Job2,進入 Job2 后再選擇 Configure 選項。
第 21 步:點擊 Post-build Actions 選項,并在下面的菜單中選擇 Build other projects。
第 22 步:填寫在 Job2 構建完成后需要執(zhí)行的任務(如下示例中為 Job3),并點擊 Save 按鈕保存。
第 23 步:接下來我們將通過點擊 “+” 號創(chuàng)建一個流水線視圖。
第 24 步:選擇 “Build Pipeline View” 并填寫視圖的名稱(如下以 CI CD Pipeline 為例)。
第 25 步:選擇 “Initial Job”(如下以 Job1 為例),并點擊 OK 按鈕確認。
第 26 步:點擊 Run 按鈕來啟動 CI/CD 流水線的流程。
第 27 步:在流水線成功運行完成之后,我們可以在瀏覽器中打開 localhost:8180/sample.text 進行驗證。此時該應用程序已處于運行狀態(tài),并且瀏覽器中會顯示出此文本文件的具體內容。
到目前為止,我們已經(jīng)學習了如何使用 Docker 和 Jenkins 來創(chuàng)建 CI/CD 流水線。之所以要采用 DevOps 模式,目的就是為了可以更快速更可靠的構建出高質量的軟件,同時還能夠加深團隊之間的溝通和協(xié)作。
英文原文:https://medium.com/edureka/ci-cd-pipeline-5508227b19ca
總結
以上是生活随笔為你收集整理的如何从零开始搭建 CI/CD 流水线的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GitHub上读北大:覆盖AI高数等13
- 下一篇: 单日2000W+订单,如何忙中不错?美团