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