主頁 > 後端開發 > 你知道什么是CI/CD嗎?不懂?五分鐘讓你徹底理解!

你知道什么是CI/CD嗎?不懂?五分鐘讓你徹底理解!

2021-06-18 06:08:04 後端開發

在CI/CD和DevOps領域中,持續交付和持續部署是一個老生常談的話題,持續集成這個術語最早是在1994年由Grady Booch提出,微服務提出者Martin Flower在2014年發表的論文《Microservice》中也對軟體開發持續集成提供了可參考原則,持續集成是借助工具對軟體專案進行持續的自動化的編譯打包構建測驗發布,來檢查軟體交付質量的一種行為,而持續部署是基于持續交付的優勢自動將經過測驗的代碼推入生產環境的程序,下文從細節描述了持續集成和持續部署各階段的關鍵步驟,

本文將探討CI(持續集成)/CD(持續部署)流程中的各個階段;以及從快速、規模交付的視角探討為什么CI/CD流水線對于我們的組織是必不可少的,

CI/CD流水線作業流包括CI/CD流程開始時所有階段等一系列步驟,負責創建自動、連貫的軟體交付模型,

通過CI/CD流水線,軟體研發可以實作從代碼簽入、測驗、構建和部署直至生產階段都在流水線中向前推進,此概念之所以高大上,是因為一旦實施了流水線,就可以將其部分或全部自動化,從而加快開發流程并減少錯誤,換句話說,CI/CD流水線使企業可以更輕松地應對軟體的自動、快速、持續交付,

DevOps工程師經常會將CI/CD各階段的和其CI/CD流水線混淆,盡管不同的工具可以將每個復雜階段自動化完成分階段的CI/CD,但是整體CI/CD軟體鏈仍然可能由于不可避免的人工干預而中斷,因此我們首先需要了解CI/CD流程中的各個階段,以及從快速、規模交付的視角探討為什么CI/CD流水線對于我們的組織是必不可少的,

CI/CD 階段:理解參與者、流程、技術

企業應用程式開發參與者通常由開發人員,測驗人員/QA工程師,運維工程師以及SRE(站點可靠性工程師)或IT運營團隊組成,他們緊密合作,目標是高質量軟體交付,CI/CD是兩個獨立程序的組合:持續集成和持續部署,下面列出了每個步驟中的主要步驟:

持續集成

持續集成(CI)是構建軟體和完成初始測驗的程序,持續部署(CD)是將代碼與基礎設施相結合的程序,確保完成所有測驗并遵循策略,然后將代碼部署到預期環境中,當然,許多公司也有自己特有流程,但主要步驟如下,

CI:代碼提交階段

參與者:開發工程師,資料庫管理員(DBA),基礎架構團隊

技術:GitHub,GitLab,SVM,BitBucket

流程:代碼提交階段也稱為版本控制,提交是將開發人員撰寫的最新代碼變更發送到代碼存盤庫的操作,開發人員撰寫的代碼的每個版本都被無限期地存盤,在與合作者討論和審查變更之后,開發人員將撰寫代碼,并在軟體需求、特性增強、bug修復或變更請求完成后提交,管理編輯和提交變更的存盤庫稱為源代碼管理工具(配置管理工具),在開發人員提交代碼(代碼推送請求)后,代碼更改被合并到主線代碼分支中,這些主線代碼分支存盤在GitHub這樣的中央存盤庫中,

CI:靜態代碼檢查階段

參與者:開發工程師,資料庫管理員(DBA),基礎架構團隊

技術:GitHub,GitLab,SVM,BitBucket

流程:開發人員撰寫代碼并將其推送到存盤庫后,系統將自動觸發以啟動下一個代碼分析程序,開發程序中存在這種情況:提交的代碼可以構建成功,但在部署期間構建失敗,無論從機器還是人力資源的利用率而言,這都是一個緩慢而昂貴的程序,因此必須檢查代碼中的靜態策略,SAST(靜態應用程式安全性測驗):SAST是一種白盒測驗方法,可以使用SonarQube,Veracode,Appscan等SAST工具從內部檢查代碼,以發現軟體缺陷,漏洞和弱點(例如SQL注入等),這是一個快速檢查程序,其中檢查代碼是否存在語法錯誤,盡管此階段缺少檢查運行時錯誤的功能,但該功能將在以后的階段中執行,

將額外的策略檢查加入自動化流水線中可以顯著減少流程中稍后發現的錯誤數量,

CI:構建

參與者:開發工程師

技術:Jenkins,Bamboo CI,Circle CI,Travis CI,Maven,Azure DevOps

流程:持續集成程序的目標是提交的代碼持續構建為二進制檔案或構建產物,通過持續集成來檢查添加的新模塊是否與現有模塊兼容,不僅有助于更快地發現bug,還有助于減少驗證新代碼更改的時間,構建工具可以根據幾乎所有編程語言的源代碼創建可執行檔案或包(.exe,.dll,.jar等),在構建程序中,還可以生成SQL腳本,配合基礎設施組態檔一起進行測驗,簡而言之,構建階段就是編譯應用程式的階段,Artifactory存盤、構建驗證測驗和單元測驗也可以作為構建程序的一部分,

構建驗證測驗(BVT)/冒煙測驗/單元測驗:

創建構建后立即執行冒煙測驗,BVT將檢查所有模塊是否正確集成,以及程式的關鍵功能是否正常運行,這樣做的目的是拒絕嚴重損壞的應用程式,以使QA團隊不會在安裝和測驗軟體應用程式步驟浪費時間,

在完成這些檢查后,將向流水線中執行UT(單元測驗),以進一步減少生產中的故障,單元測驗可驗證開發人員撰寫的單個單元或組件是否按預期執行,

構建產物存盤:

一旦構建就緒,程式包就會存盤在稱為Artifactory或Repository工具的中央資料庫,隨著每天構建量的增加,跟蹤所有構建產物也會變得愈加困難,因此,一旦生成并驗證了構建產物,就將其發送到存盤庫進行存盤管理,諸如Jfrog Artifactory之類的存盤庫工具可用于存盤諸如.rar,.war,.exe,Msi等之類的二進制檔案,測驗人員可以從此處手動進行選擇,并在測驗環境中部署構建產物以進行測驗,

CI:測驗階段

參與者:測驗人員、QA

技術:Selenium,Appium,Jmeter,SOAP UI,Tarantula

程序:發布構建程序后的一系列自動測驗將驗證代碼的準確性,此階段可幫助避免生產中的錯誤,根據構建的大小,此檢查可能持續數秒至數小時,對于由多個團隊提交和構建代碼的大型組織,這些檢查在并行環境中運行,以節省寶貴的時間并盡早將錯誤通知開發人員,

測驗人員(或稱為QA工程師)基于用戶描述的測驗用例和場景設定自動化測驗用例,他們執行回歸分析、壓力測驗來檢查與預期輸出的偏差,測驗中涉及的活動有完整性測驗、集成測驗、壓力測驗,這是一個高層次測驗方法,在這個階段,可以發現開發人員忽視的某些代碼問題,

集成測驗:

集成測驗是使用Cucumber、Selenium等工具執行的,在這些工具中,單個應用程式模塊被組合起來并作為一組進行測驗,同時評估其是否符合指定的功能需求,在集成測驗之后,需要有人批準該組中的更新集應該移到下一個階段,這通常是性能測驗,這個驗證程序可能很麻煩,但它是整個程序的一個重要部分,驗證這個程序業界有很多優秀的方案,

性能和壓力測驗:

Selenium、JMeter等自動化測驗工具也可執行性能和壓力測驗,以檢查應用程式在面對高負載時是否穩定和性能良好,該測驗流程通常不會在每個更新提交上運行,因為完整的壓力測驗是長期運行的,當發布主要的新功能時,將對多個更新進行分組,并完成完整的性能測驗,在單個更新被轉移到下一階段的情況下,流水線可能將金絲雀測驗加入作為可選,

持續部署:Bake和部署

參與者:基礎架構工程師,SRE,運維工程師

技術:Spinnaker,Argo CD,Tekton CD

程序:在測驗階段完成之后,可以部署到服務器的標準代碼準備就緒,在部署到生產中之前,它們將被部署到產品團隊內部使用的測驗環境或beta環境,在將構建移至這些環境之前,構建必須經過Bake和Deploy的子階段,這兩個階段都是Spinnaker所支持存在的,

CD:Bake

Baking是指在生產時使用當前配置從源代碼創建不可變的鏡像實體,這些配置可能是資料庫更改和其他基礎結構更新之類的事情,Spinnaker可以觸發Jenkins執行此任務,并且某些組織更喜歡使用Packer,

CD:部署

Spinnaker自動將已bake的鏡像發送到部署階段,這是將服務器組設定為部署到集群的位置,與上述測驗程序類似,在部署階段將執行功能相同的程序,首先將部署移至測驗階段,然后最終移至生產環境,以進行批準和檢查,這個處理程序可以由Spinnaker等工具支持,

CD:驗證

這也是團隊優化整個CI/CD流程的關鍵位置,因為現在已經進行了如此多的測驗,所以失敗很少見,但是,此時必須盡快解決所有故障,以最大程度地減少對最終客戶的影響,團隊也應該考慮使流程的這一部分自動化,

使用藍綠部署、金絲雀分析、滾動更新等策略部署到產品,在部署階段,將監視正在運行的應用程式以驗證當前部署是否正確或是否需要回滾,

CD:監控

參與者:站點可靠性工程師(SRE)、運營團隊

技術:Zabbix、Nagios、Prometheus、Elastic Search、Splunk、Appdynamics、Tivoli

程序:為了使軟體發行版具有故障安全性和健壯性,在生產環境中跟蹤發行版的運行狀況至關重要,應用程式監視工具將跟蹤性能指標,例如CPU利用率和發行版延遲,日志分析器將掃描由底層中間件和作業系統產生的大量日志,以識別行為并跟蹤問題的根源,如果生產中出現任何問題,將通知利益相關者以確保生產環境的安全性和可靠性,此外,監視階段可幫助組織收集有關其新軟體更改如何為收入貢獻的情報,幫助基礎設施團隊跟蹤系統行為趨勢并進行容量規劃,

持續交付(CD):反饋和協作工具

參與者:站點可靠性工程師(SRE)、運營和維護團隊,

技術:JIRA、ServiceNow、Slack、電子郵件、Hipchat,

程序:DevOps團隊的目標是更快地持續發布,然后不斷減少錯誤和性能問題,這是通過不時地通過發送電子郵件向開發人員、專案經理提供有關新版本的質量和性能的反饋,通常情況下,反饋系統是整個軟體交付程序的一部分,因此,交付中的任何更改都會頻繁地錄入系統,以便交付團隊可以對它采取行動,

總結

企業必須評估一個整體的持續交付解決方案,該解決方案可以自動化或促進上述這些階段的自動化,

寫在最后

歡迎大家關注我的公眾號【風平浪靜如碼】,海量Java相關文章,學習資料都會在里面更新,整理的資料也會放在里面,

覺得寫的還不錯的就點個贊,加個關注唄!點關注,不迷路,持續更新!!!

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/288033.html

標籤:Java

上一篇:6、面向物件編程(中)

下一篇:Rabbitmq 延遲佇列實作定時任務,這才是正確的方式!

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more