<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          分享一個(gè)CI/CD的自動(dòng)部署想法

          共 3014字,需瀏覽 7分鐘

           ·

          2022-03-07 10:19

          這里是Z哥的個(gè)人公眾號

          每周五11:45 按時(shí)送達(dá)

          當(dāng)然了,也會(huì)時(shí)不時(shí)加個(gè)餐~

          我的第「221」篇原創(chuàng)敬上



          大家好,我是Z哥。
          最近工作中正好在設(shè)計(jì)一個(gè)方案,以支持 CD 環(huán)節(jié)的第一個(gè)部署節(jié)點(diǎn)可以完全自動(dòng)部署,并且整個(gè)環(huán)節(jié)中盡量減少人為干預(yù)的節(jié)點(diǎn)。
          之前也沒有這塊的實(shí)戰(zhàn)經(jīng)驗(yàn),摸著石頭過河,想了一個(gè)方案,在這里分享給大家,歡迎你一起討論,相互學(xué)習(xí)。

          我目前所在的公司 CI/CD 流程是這樣的。

          fee55679d0adc41a3f7a29e9461955c6.webp


          相信大多數(shù)公司的 CI/CD 流程和上圖差別不大,基本上都是一個(gè)逐漸推進(jìn)的直線節(jié)點(diǎn)。

          在這個(gè)節(jié)點(diǎn)不斷推進(jìn)的過程中,數(shù)據(jù)庫和配置的變更如何自動(dòng)化,往往是面臨的最大問題。

          我這次要做的事就是在圖中的 QA 環(huán)境之前增加一個(gè) Alpha 環(huán)境,并且該環(huán)境的部署需要完全自動(dòng)化進(jìn)行。
          那么自動(dòng)部署過程中,我們有哪些原則可以被提煉出來,可以指導(dǎo)我們將這件事做成,并且往正確的方向持續(xù)進(jìn)行呢?
          我的理解是以下兩點(diǎn):
          • 在自動(dòng)部署之前,盡可能提前檢測出部署后會(huì)導(dǎo)致該程序的上下游甚至整個(gè)系統(tǒng)不可用的風(fēng)險(xiǎn)。比如,通過靜態(tài)代碼檢測。

          • 部署之后,盡可能廣地識別上下游以及整個(gè)系統(tǒng)的異常,及時(shí)回滾。比如,通過冒煙測試。


          基于此原則,我構(gòu)思的方案是這個(gè)樣子:

          13b74d4497fe17f0b1583c85243350b3.webp


          在具體實(shí)施層面,覺得需要做以下幾件事,優(yōu)先級從高到低排列:
          1. 配置和數(shù)據(jù)庫變更文件的標(biāo)準(zhǔn)制定

          2. 能夠識別配置和數(shù)據(jù)庫變更文件的新增

          3. 能夠?qū)?gòu)建的鏡像、變更文件打包到一起通知到運(yùn)維與 DBA(條件允許的話,直接在系統(tǒng)層面打通)

          4. 在部署 Alpha 環(huán)境前的可用性檢測。

          5. 每個(gè)程序提供健康檢查接口,用于檢測部署結(jié)果。

          6. 自動(dòng)化的冒煙測試。用于檢測 Alpha 環(huán)境的可用性,并觸發(fā)回滾。


          要做的細(xì)節(jié)工作還不有不少,但是核心工作就這么多。我們再來展開一下其中的每一件事。

          /01 配置和數(shù)據(jù)庫變更文件的標(biāo)準(zhǔn)制定/
          首先,自動(dòng)化的前提是先標(biāo)準(zhǔn)化,為了實(shí)現(xiàn)自動(dòng)化,我們需要先將標(biāo)準(zhǔn)確定好。針對變更文件的標(biāo)準(zhǔn),我大致想了下是這個(gè)樣子。

          01? 文件存放目錄定義
          • 方案1:分別在 gitlab 倉庫里定義 infra_changes_conf 、 infra_changes_db 、deploy_dependencies 文件夾。

          • 【建議】方案2:在 gitlab 倉庫里定義infra_changes文件夾,其中統(tǒng)一存放配置和 DB 變更、依賴描述文件,用不同的前綴區(qū)分。



          02? 文件名的定義
          文件名格式為:[conf/db/depend]_JiraID_自增序號。Jira ID 是Jira上的故事、任務(wù)、Bug 的 ID。示例:
          • conf_XXXProject-2564_1.yaml

          • conf_XXXProject-2564_2.yaml

          • db_XXXProject-2564_1.yaml

          • db_XXXProject-2564_2.yaml

          • depend_XXXProject-2564_1.yaml

          • depend_XXXProject-2564_2.yaml


          文件名最后的自增序號一般用于兩種場景:
          • 前一次構(gòu)建并發(fā)布 Alpha 環(huán)境成功,但因功能需求,需要額外增加配置并發(fā)新版。


          • 配置或者 db 變更需要區(qū)分程序運(yùn)行前還是運(yùn)行后。



          03? 文件內(nèi)容的格式
          conf_ 文件內(nèi)容格式為 YAML 格式,結(jié)構(gòu)如下:
          runtime: before|after  #程序運(yùn)行前 or 運(yùn)行后store_type: config_map|apollo|nacos|... #配置的存儲(chǔ)類型service_name: xxxxxx  #服務(wù)名remove_keys:  - key1  - key2.a.b  #多級key 以 Properties 格式定義add_keys:  -    key1: value1    key2.a.b: value2update_keys:  -    key1: value1    key2.a.b: value2

          同樣的,db_ 文件內(nèi)容格式為 YAML 格式,它支持兩種模式,結(jié)構(gòu)分別如下:
          runtime: before|after #程序運(yùn)行前or運(yùn)行后db_type: mysql|mongodb|dynamodb|... #數(shù)據(jù)庫的類型ddls:  - sql1  - sql2dmls:  - sql1  - sql2

          depend_ 文件內(nèi)容格式同樣為 YAML 格式,結(jié)構(gòu)如下
          jira_ids:  - XXXProject-2564  - XXXProject-2564

          相信你從文件格式中也能明白每一個(gè)屬性的意義吧?


          /02 識別配置和 DB 變更文件的新增/
          聰明的你可能已經(jīng)根據(jù)前面的《文件名的定義》部分內(nèi)容猜到了,就是通過 Jira ID 來識別。具體操作方式是:
          1. 研發(fā)將配置、DB變更文件與代碼一起提交到Gitlab 倉庫。

          2. 如果檢測到 Gitlab 的 commit 信息中帶 Jira ID,那么會(huì)觸發(fā)構(gòu)建,并且將該鏡像與 commit 中的 Jira ID 關(guān)聯(lián)。

          3. 然后根據(jù) Jira ID 去找 infra_changes 目錄中與該 Jira ID 相關(guān)的變更文件,將它們與鏡像放到一起。



          /03? 將構(gòu)建的鏡像、變更文件打包到一起通知到運(yùn)維與 DBA /
          如果運(yùn)維和DBA已經(jīng)有相關(guān)的自動(dòng)化操作系統(tǒng)的話,可以直接在系統(tǒng)層面進(jìn)行打通。否則的話,直接發(fā)出一個(gè)飛書或者釘釘消息就好了。

          /04? 部署 Alpha 環(huán)境前的可用性檢測/
          這個(gè)目前能想到的好像只有靜態(tài)代碼掃描了。

          /05? 每個(gè)程序提供健康檢查接口,用于檢測部署結(jié)果/
          健康檢查的作用在于,在部署完之后,通過調(diào)用每個(gè)系統(tǒng)的健康檢查接口來快速得到某個(gè)程序的自檢結(jié)果。畢竟只靠冒煙測試的話,整個(gè)效率會(huì)比較低。
          具體的檢查項(xiàng):
          比如數(shù)據(jù)庫連接是否正常,所依賴的外部系統(tǒng)是否已經(jīng)就緒等等。

          /06? 自動(dòng)化的冒煙測試/
          這個(gè)大家應(yīng)該都知道,就不展開了。

          大體上就這么多。等后面實(shí)際運(yùn)用起來之后應(yīng)該還會(huì)有一些迭代變化,到時(shí)候如果我覺得值得分享的話,再來和大家分享。
          好了,總結(jié)一下。
          這篇呢,Z 哥和你分享了我在目前團(tuán)隊(duì)中正在做的一個(gè)與 CI/CD 相關(guān)的事情。
          為了確保整個(gè)自動(dòng)化過程的盡可能穩(wěn)定,我們需要基于兩個(gè)原則不斷思考和打磨整個(gè)過程。他們分別是:
          • 在自動(dòng)部署之前,盡可能提前檢測出部署后會(huì)導(dǎo)致該程序的上下游甚至整個(gè)系統(tǒng)不可用的風(fēng)險(xiǎn)。比如,通過靜態(tài)代碼檢測。

          • 部署之后,盡可能廣的識別上下游以及整個(gè)系統(tǒng)的異常,及時(shí)回滾。比如,通過冒煙測試。



          在具體的實(shí)踐過程中,主要有以下六個(gè)步驟:
          1. 配置和數(shù)據(jù)庫變更文件的標(biāo)準(zhǔn)制定

          2. 能夠識別配置和數(shù)據(jù)庫變更文件的新增

          3. 能夠?qū)?gòu)建的鏡像、變更文件打包到一起通知到運(yùn)維與 DBA(條件允許的話,直接在系統(tǒng)層面打通)

          4. 在部署 Alpha 環(huán)境前的可用性檢測。

          5. 每個(gè)程序提供健康檢查接口,用于檢測部署結(jié)果。

          6. 自動(dòng)化的冒煙測試。用于檢測 Alpha 環(huán)境的可用性,并觸發(fā)回滾。


          希望對你有所啟發(fā)。
          如果你有什么關(guān)于CI/CD的好想法,歡迎和我交流哈~



          推薦閱讀:


          原創(chuàng)不易,如果你覺得這篇文章還不錯(cuò),就「點(diǎn)贊」或者「在看」一下吧,鼓勵(lì)我的創(chuàng)作 :)


          也可以分享我的公眾號名片給有需要的朋友們。

          如果你有關(guān)于軟件架構(gòu)、分布式系統(tǒng)、產(chǎn)品、運(yùn)營的困惑

          可以試試點(diǎn)擊「閱讀原文

          瀏覽 57
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  青青操色| 来个欧美操逼的 | 国产女人操逼 | 亚洲AⅤ首页 | 日韩激情成人网 |