主頁 > 軟體工程 > 如何設計一條穩定的應用交付流程?|云效工程師指北

如何設計一條穩定的應用交付流程?|云效工程師指北

2022-04-19 08:25:22 軟體工程

大家好,我叫王泊,負責云效應用交付AppStack的開發,把應用部署到各個環境、一步步進行集成測驗,最終發布到生產環境,是程式員作業中必不可少的組成部分;而云原生技術引入的容器化、IaC(基礎設施即代碼,Infrastructure as Code)等等技術與理念,為持續交付的程序提供了規范化的可能,但也引入了讓人不時埋首于組態檔的小山里的麻煩,我們不妨從一次略有波折、稍顯隱患的集成部署案例開始,看看如何著手設計一條更為穩定的應用交付流程,

 

640 (1).png

 

一次波折的部署

許多個迭代后,面對陪風扇一起嘎吱嘎吱轉著的流水線,程式員阿偉會回憶起把系統部署到預發環境、提交最后一輪驗收,然后被打回來的那個并不遙遠的下午,當時他有一個酷炫的Java SpringBoot應用要上線,實作了酷炫的“在不同部署環境下、發送帶環境路由標簽的業務訊息”的介面:

 

1.png

 

日常環境的鏡像構建、部署和驗收測驗一路OK,但是在再次構建部署到預發環境后,阿偉發現訊息丟了:預發環境的消費方并沒有消費到訊息,經過一系列不管黑屏白屏康到bug就是好屏的排查,發現問題起源于在預發環境使用的SpringBoot組態檔application-staging.yaml中漏配了routing.env屬性,應用啟動時使用了預設配置application.yaml中的兜底值,導致訊息tag打錯,

具體的問題倒是解決了,不過多少會留下點顧慮:以后寫配置項的時候,免不了翻來覆去diff一下,是不是漏了什么,會不會導致各個環境里的產物有微妙的結構差異引發bug……

舊交付方式的潛在問題

仍然以SpringBoot應用為例,一部分開發者將應用從傳統的虛機部署遷移到Kubernetes上的容器化部署時,會使用類似下面的思路:

 

640 (2).png

 

框架提供了為不同環境撰寫不同application.yaml組態檔的機制,用以達到環境差異化部署的效果,我們不難構陷出小故事的主人公阿偉也使用了類似的思路:

● 使用application.yaml提供所有環境的共性(和一部分兜底)配置;
● 各環境的差異化配置由單獨的application-xxx.yaml給出,覆寫兜底配置;各差異化配置不作特別的規范要求,允許屬性取值不同,也允許引入某個環境特有的屬性值;
● 為不同環境的鏡像撰寫不同的Dockerfiles, 環境配置方面的差異主要在于啟動應用時指定的引數不同,

一個典型的工程目錄看起來像是這樣:

 

640 (3).png

 

看起來很規整,但其實也引入了一些問題:

● 環境差異化配置需要靠人工核對來減少錯漏,撰寫application.yaml這類基準配置的時候也需要慎重考慮提供什么樣的兜底值,一旦有差錯則排查成本相對高;
● Dockerfile往往沒有很大的差異,但構建出來的產物是和具體環境強系結的,沒辦法復用;多次編譯可能因為某些隱患(最典型的比如依賴版本不嚴格)導致不同環境下的交付內容并不一致,有引入bug、招致線上問題的風險,
  ○ 比如在日常環境下完成構建后,某個(可能是間接)依賴的快照包被更新了(可能是不規范的快照包更新,也可能是安全包之類選擇傾向于讓接入方無感升級而使用快照版本當作release);此后部署到預發環境時,構建參考了新版本的依賴包,導致日常環境下的測驗驗收結論可信度下降,

單應用逐環境晉級方案的考量

吃一塹長一智,我們不妨幫阿偉的應用發布方案列出下面的考量:

● 產物對環境中立:環境差異化配置在部署時注入,一份鏡像可以用于所有環境的部署,
● 環境配置統一:所有環境使用同樣格式的配置模板和差異化的值注入,避免“兜底+覆寫”引入的配置模板差別,

具體來說,在“日常-預發-生產”的整條集成發布流程中,使用的鏡像和編排只有一份;鏡像中的SpringBoot應用里,也只使用application.yaml,不再引入其他差異化配置,

這樣做看起來限制了一些靈活性,但核心考慮在于:通常情況下很難規范組態檔和編排的具體格式;一旦存在“一份配置兜底+多份差異化調整”的情況,理解應用代碼邏輯和部署細節的成本會變高,維護、驗證應用邏輯所需理解的內容也隨組態檔的增加而線性增長,即使是應用的設計者或是owner,也難免隨著時過境遷而忘記一些細節(“我當時為什么要加這個環境變數來著”),更不用提中途加入進行功能迭代的其他開發人員了,

 

640 (4).png

 

實際部署到Kubernetes集群中時,環境變數通過編排中容器的環境變數注入,接下來需要統一Deployment編排——如果為不同的環境使用多份編排檔案,仍然會引入無意義的重復,這里我們可以使用Helm chart的形式,諸如鏡像、環境變數等等在構建部署時才能決定的差異化配置,都可以通過values配置進行注入:

 

640 (5).png

 

需要定制化的部分,則是CICD系統中動態生成Values.yaml配置的腳本,這部分的復雜性相對容易控制,具體的實作則根據使用的CICD工具不同而略有差異,我們將會在后文中看到一個概略的示例,

方案改造例

現在可以回到阿偉的服務上進行改造了,

Step 1: 統一application.yaml和Dockerfile

首先我們要壓縮服務中的SpringBoot application yaml配置,只留下一份:

 

2.png

 

這里使用了占位符${DEPLOY_ENV},要求環境變數提供routing.env的值,

Dockerfile則可以去掉所有環境差異化的環境變數定義、統一為一份配置,并假定環境變數都已經正確注入,

Step 2: 撰寫Helm chart

從創建一份空的helm chart開始:

 

3.png

 

接下來,可以把原先的編排檔案按照helm模板的格式簡單改寫,放置到cool-service-chart/templates/目錄下,以Deployment為例:

 

4.png

 

我們使用.Values.image這一helm占位符將鏡像注入容器,環境變數注入的方式則有多種——變數較少的情況下可以在pod template中直接定義name和value;不過如果考慮到更長遠的擴展性,也可以采用關注點分離的方式,單獨定義一份ConfigMap用于定義環境變數;這樣做的好處,則是添加環境變數的開發者無需理解Deployment的具體結構,甚至只需要理解“往ConfigMap的資料定義里寫一個鍵值對就能實作環境變數注入”就可以了,

基于這些考慮,我們定義容器使用下面的ConfigMap提供鍵值對、注入環境變數:

 

5.png

 

Chart里的模板撰寫完成后,記得推送到一個git庫里,方便后面使用,

Step 3: 撰寫Values.yaml生成腳本

在準備好Helm chart的靜態模板部分之后,需要為CICD工具撰寫部署時生成Values.yaml的腳本,我們不妨假設阿偉的團隊選擇使用Jenkins建設CICD流水線:

 

6.png

 

這里我們主要關注chart-complete.sh,它需要完成如下的任務:

● 從git倉庫克隆chart庫的主干;
● 從環境變數中,生成values.yaml.

 

7.png

 

如果已經搭建了helm倉庫,這里也可以選擇把生成好的chart推到倉庫,

總結

在單一應用逐環境晉級部署的程序中,往往會涉及到針對環境定制的差異化配置;為了避免Dockerfile、組態檔等冗余帶來的治理成本及bug隱患,我們可以利用云原生IaC的優勢,基于統一的制品和編排定義,將環境的差異化配置項延遲到部署時注入,這樣,在各個環境中所部署的代碼是完全一致的,提高了集成的可信程度及測驗效率,

當然,從頭搭建CICD體系往往也需要一定的試錯;云效應用交付AppStack提供了符合前述實踐的編排管理、環境治理和差異化配置能力,可以通過集成云效流水線Flow,快速搭建出整條晉級流程,歡迎大家嘗試,若有識訓,就點個贊吧!

點擊下方鏈接,免費體驗應用交付平臺 AppStack,

https://www.aliyun.com/product/yunxiao/appstack?channel=yy_practice

 

lQLPDhtDba1KT2_NBDjNB4CwgwE-eOLUK_gCPyXeUECTAA_1920_1080.png

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

標籤:其他

上一篇:如何設計一條穩定的應用交付流程?|云效工程師指北

下一篇:JFrame不與ActionListener一起出現

標籤雲
其他(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)

熱門瀏覽
  • Git本地庫既關聯GitHub又關聯Gitee

    創建代碼倉庫 使用gitee舉例(github和gitee差不多) 1.在gitee右上角點擊+,選擇新建倉庫 ? 2.選擇填寫倉庫資訊,然后進行創建 ? 3.服務端已經準備好了,本地開始作準備 (1)Git 全域設定 git config --global user.name "成鈺" git c ......

    uj5u.com 2020-09-10 05:04:14 more
  • CODING DevOps 代碼質量實戰系列第二課,相約周三

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。**《DevOps 代碼質量實戰(PHP 版)》**為 CODING DevOps 代碼質量實戰系列的第二課,同時也是本系列的 PHP ......

    uj5u.com 2020-09-10 05:07:43 more
  • 推薦Scrum書籍

    推薦Scrum書籍 直接上干貨,推薦書籍清單如下(推薦有順序的哦) Scrum指南 Scrum精髓 Scrum敏捷軟體開發 Scrum捷徑 硝煙中的Scrum和XP : 我們如何實施Scrum 敏捷軟體開發:Scrum實戰指南 Scrum要素 大規模Scrum:大規模敏捷組織的設計 用戶故事地圖 用 ......

    uj5u.com 2020-09-10 05:07:45 more
  • CODING DevOps 代碼質量實戰系列最后一課,周四發車

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。 **《DevOps 代碼質量實戰(Java 版)》**為 CODING DevOps 代碼質量實戰系列的最后一課,同時也是本系列的 ......

    uj5u.com 2020-09-10 05:07:52 more
  • 敏捷軟體工程實踐書籍

    Scrum轉型想要做好,第一步先了解并真正落實Scrum,那么我推薦的Scrum書籍是要看懂并實踐的。第二步是團隊的工程實踐要做扎實。 下面推薦工程實踐書單: 重構:改善既有代碼的設計 決議極限編程 : 擁抱變化 代碼整潔代碼 程式員的職業素養 修改代碼的藝術 撰寫可讀代碼的藝術 測驗驅動開發 : ......

    uj5u.com 2020-09-10 05:07:55 more
  • Jenkins+svn+nginx實作windows環境自動部署vue前端專案

    前面文章介紹了Jenkins+svn+tomcat實作自動化部署,現在終于有空抽時間出來寫下Jenkins+svn+nginx實作自動部署vue前端專案。 jenkins的安裝和配置已經在前面文章進行介紹,下面介紹實作vue前端專案需要進行的哪些額外的步驟。 注意:在安裝jenkins和nginx的 ......

    uj5u.com 2020-09-10 05:08:49 more
  • CODING DevOps 微服務專案實戰系列第一課,明天等你

    CODING DevOps 微服務專案實戰系列第一課**《DevOps 微服務專案實戰:DevOps 初體驗》**將由 CODING DevOps 開發工程師 王寬老師 向大家介紹 DevOps 的基本理念,并探討為什么現代開發活動需要 DevOps,同時將以 eShopOnContainers 項 ......

    uj5u.com 2020-09-10 05:09:14 more
  • CODING DevOps 微服務專案實戰系列第二課來啦!

    近年來,工程專案的結構越來越復雜,需要接入合適的持續集成流水線形式,才能滿足更多變的需求,那么如何優雅地使用 CI 能力提升生產效率呢?CODING DevOps 微服務專案實戰系列第二課 《DevOps 微服務專案實戰:CI 進階用法》 將由 CODING DevOps 全堆疊工程師 何晨哲老師 向 ......

    uj5u.com 2020-09-10 05:09:33 more
  • CODING DevOps 微服務專案實戰系列最后一課,周四開講!

    隨著軟體工程越來越復雜化,如何在 Kubernetes 集群進行灰度發布成為了生產部署的”必修課“,而如何實作安全可控、自動化的灰度發布也成為了持續部署重點關注的問題。CODING DevOps 微服務專案實戰系列最后一課:**《DevOps 微服務專案實戰:基于 Nginx-ingress 的自動 ......

    uj5u.com 2020-09-10 05:10:00 more
  • CODING 儀表盤功能正式推出,實作作業資料可視化!

    CODING 儀表盤功能現已正式推出!該功能旨在用一張張統計卡片的形式,統計并展示使用 CODING 中所產生的資料。這意味著無需額外的設定,就可以收集歸納寶貴的作業資料并予之量化分析。這些海量的資料皆會以圖表或串列的方式躍然紙上,方便團隊成員隨時查看各專案的進度、狀態和指標,云端協作迎來真正意義上 ......

    uj5u.com 2020-09-10 05:11:01 more
最新发布
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:41:12 more
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:35:34 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:05:44 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:00:18 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:20:31 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:55 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:18:51 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:00 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:17:55 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:12:06 more