<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>

          從零開始針對(duì) .NET 應(yīng)用的 DevOps 運(yùn)營(yíng)實(shí)踐 - 運(yùn)行環(huán)境搭建

          共 4776字,需瀏覽 10分鐘

           ·

          2020-10-15 17:37


          一、Overview

          最近的一段時(shí)間,在公司里我都在進(jìn)行基于 Jenkins 和 SonarQube 配合已有的 Gitlab 搭建部門的持續(xù)集成環(huán)境的工作,雖然之前有使用過(guò) GitHub Actions 和 Azure DevOps,但是從頭開始搭建這樣的一套 DevOps 環(huán)境還是學(xué)習(xí)到了一些新的知識(shí)點(diǎn),因此,借著這個(gè)中秋國(guó)慶假期的機(jī)會(huì),分享下整個(gè)工具鏈的搭建過(guò)程,如果你也有相似的需求的話,希望可以對(duì)你有所幫助

          二、Contents

          1. 從零開始針對(duì) .NET 應(yīng)用的 DevOps 運(yùn)營(yíng)實(shí)踐 - 運(yùn)行環(huán)境搭建

          三、Step by Step

          3.1、一些概念

          DevOps,?Development 和?Operations,從名稱上就可以看出,這一名詞包含了軟件的開發(fā)與運(yùn)營(yíng)。當(dāng)然,這里提到的 DevOps 是一種方法論,更多的是為了打破開發(fā)與運(yùn)營(yíng)人員之間的壁壘,用來(lái)促進(jìn)開發(fā)人員、運(yùn)營(yíng)人員以及 QA 人員之間的溝通與協(xié)作。通過(guò)引入 DevOps 中使用的各種工具,我們可以通過(guò)自動(dòng)化的方式,完成軟件系統(tǒng)的構(gòu)建、測(cè)試、發(fā)布,從而降低因人工操作所造成的不確定性,提升軟件的交付速度、系統(tǒng)質(zhì)量

          在踐行 DevOps 方法論時(shí),經(jīng)常會(huì)提到三個(gè)概念,持續(xù)集成、持續(xù)交付、持續(xù)部署,這里借由?Redhat?上介紹相關(guān)概念的一張圖片來(lái)說(shuō)明三者之間的聯(lián)系

          • 持續(xù)集成(Continuous Integration):在傳統(tǒng)的軟件開發(fā)過(guò)程中,將個(gè)人開發(fā)的代碼與整個(gè)項(xiàng)目代碼的合并一般都會(huì)置于比較靠后的階段,而持續(xù)集成強(qiáng)調(diào)的是開發(fā)人員提交了新代碼之后,立刻進(jìn)行構(gòu)建、單元測(cè)試。根據(jù)測(cè)試的結(jié)果,確定新代碼和原有代碼能否正確地集成在一起

          • 持續(xù)交付(Continuous Delivery):持續(xù)交付是一種自動(dòng)化的軟件交付手段,在持續(xù)集成的基礎(chǔ)上,代碼庫(kù)中的代碼已經(jīng)做好了部署到正式環(huán)境的準(zhǔn)備,在目前的通用做法中,將構(gòu)建之后的代碼通過(guò)持續(xù)交付變更部署到測(cè)試環(huán)境、預(yù)發(fā)布環(huán)境中,實(shí)現(xiàn)對(duì)持續(xù)集成的擴(kuò)展,出于業(yè)務(wù)方面的考慮,我們可以手動(dòng)選擇是否部署到正式環(huán)境

          • 持續(xù)部署(Continuous Deployment):作為對(duì)持續(xù)交付的延伸,持續(xù)部署能夠自動(dòng)的將最終的代碼部署到生產(chǎn)環(huán)境中,完成整個(gè)的 CI/CD 流程

          雖然目前的需求僅僅是為了實(shí)現(xiàn)持續(xù)集成,完成對(duì)于系統(tǒng)的自動(dòng)化代碼檢查、自動(dòng)化單元測(cè)試,但是因?yàn)楹罄m(xù)的功能對(duì)于我們完整的實(shí)施 DevOps 方法論也是必須的,所以在這幾篇的博客內(nèi)容中,我也會(huì)完成對(duì)于后續(xù)功能的實(shí)踐分享

          3.2、前期調(diào)研

          與持續(xù)集成的場(chǎng)景存在一些的差異,我們?cè)趯?shí)際的開發(fā)中,并不會(huì)在新的功能分支上按照每個(gè)開發(fā)人員再建立單獨(dú)的分支,因此,這里的持續(xù)集成更多的想要實(shí)現(xiàn)的是當(dāng)開發(fā)人員提交代碼到 Gitlab 時(shí),自動(dòng)觸發(fā)代碼檢查以及單元測(cè)試,產(chǎn)出代碼檢查報(bào)告、單元測(cè)試報(bào)告、以及整個(gè)項(xiàng)目的測(cè)試覆蓋率

          因此,基于目前的需求,整個(gè)系統(tǒng)主要依賴于三個(gè)主要的軟件系統(tǒng),Gitlab、Jenkins、以及 SonarQube,當(dāng)然,這里缺少了一個(gè) bug 管理工具,因?yàn)槲覀儾块T人數(shù)不是很多,目前是和別的部門共用的 Redmine 進(jìn)行的項(xiàng)目管理,所以本次并沒(méi)有納入到我們的需求范圍內(nèi),當(dāng)然, bug 管理也是推行 DevOps 中不可缺少的一部分

          在挑選組件時(shí),本著不給自己和別人挖坑的原則,優(yōu)先考慮使用人數(shù)多的軟件系統(tǒng)。因此,作為事實(shí)上的開源 CI/CD 工具的標(biāo)準(zhǔn),毫無(wú)疑問(wèn)選擇 Jenkins,而對(duì)于代碼的自動(dòng)化檢查,結(jié)合我們需要實(shí)現(xiàn)私有化部署,滿足對(duì)多種開發(fā)語(yǔ)言的支持、能夠與 CI/CD 工具進(jìn)行有效結(jié)合的需求,這里最終選擇的是 SonarQube

          由于歷史原因,部門系統(tǒng)的框架版本橫跨了 VB.NET、.NET Framework 2.x,4.x 與 .NET Core,.NET 框架的程序涵蓋了 Web Form、MVC、Web API,排除掉已經(jīng)不維護(hù)的系統(tǒng),最終需求的范圍限定在支持 .NET Framework 4.x+ 以及 .NET Core 程序上。因此,這里只能選擇將 Jenkins 和 SonarQube 部署到 Windows 服務(wù)器上,如果你不需要兼容 .NET Framework 的程序,推薦你部署到 Linux 服務(wù)器上

          在選定好使用的軟件后,就需要完成環(huán)境的配置,Jenkins 與 SonarQube 都是基于 Java 的軟件,因此在安裝軟件之前,需要我們?cè)诜?wù)器上完成 Java 環(huán)境的配置,同時(shí),基于我們的系統(tǒng)現(xiàn)狀,需要在服務(wù)器上安裝好 .NET Framework、.NET Core、Git 以及 Node

          對(duì)于 Git、Node、.NET SDK 的安裝,下載安裝包后,一直 next 即可,加上這里主要針對(duì)的是 .NET 程序員,以及我們的服務(wù)器是斷網(wǎng)的,所以這里主要列舉的是兩個(gè)相對(duì)來(lái)說(shuō)稍微復(fù)雜的環(huán)境配置,一個(gè)是對(duì)于 MSBuild 工具的離線下載,另一個(gè)則是 Java 環(huán)境的配置

          3.3、MSBuild 安裝

          因?yàn)樵谡麄€(gè)過(guò)程中會(huì)涉及到對(duì)應(yīng)用程序的編譯生成,對(duì)于 .NET Core 應(yīng)用,完全可以采用 .NET Core CLI 中的各種命令來(lái)實(shí)現(xiàn),而對(duì)于 .NET Framework 程序來(lái)說(shuō),則需要一個(gè)執(zhí)行應(yīng)用程序生產(chǎn)的平臺(tái),MSBuild 就是這樣的一個(gè)工具,我們?cè)陂_發(fā)過(guò)程中使用 Visual Studio 進(jìn)行程序編譯時(shí),其實(shí)也是會(huì)借用 MSBuild 來(lái)進(jìn)行的

          因此,最簡(jiǎn)單的辦法,就是在服務(wù)器上安裝 VS 即可,當(dāng)然,這個(gè)過(guò)于簡(jiǎn)單粗暴了,以及在服務(wù)器上安裝我們開發(fā)使用的 IDE 也過(guò)于浪費(fèi),所以這里還是會(huì)選擇獨(dú)立的安裝 MSBuild

          與 VS 相似,MSBuild 也有不同的版本,為了避免一些莫名其妙的問(wèn)題,在 MSBuild 的版本選擇上,最好選擇與你們開發(fā)時(shí)用的 VS 匹配的版本,因?yàn)槲覀冊(cè)陂_發(fā)中會(huì)使用到了 VS 2017 和 VS 2019 這兩個(gè)版本,所以這里我會(huì)安裝兩個(gè) MSBuild 到服務(wù)器上

          對(duì)于 MSBuild,之前很多文章中說(shuō)可以直接把你本地電腦中的 VS 所包含的 MSBuild,丟到服務(wù)器上就可以了,經(jīng)過(guò)我的多次嘗試,在踩坑的路上越走越遠(yuǎn),這里還是建議你通過(guò) Visual Studio Build Tools 進(jìn)行安裝

          在 VS 的下載頁(yè)面,這里是以 VS 2019 的下載頁(yè)面進(jìn)行示例,在 Visual Studio 2019 工具這個(gè)內(nèi)容塊中,找到生成工具這個(gè)下載項(xiàng),下載即可

          這里你可以直接通過(guò)我給出的這兩個(gè)地址,直接下載對(duì)應(yīng)的生成工具,打開軟件,找到 MSBuild 這個(gè)組件進(jìn)行安裝即可

          • Visual Studio 2017 Build Tools:https://visualstudio.microsoft.com/zh-hans/thank-you-downloading-visual-studio/?sku=BuildTools&rel=15

          • Visual Studio 2019 Build Tools:https://visualstudio.microsoft.com/zh-hans/thank-you-downloading-visual-studio/?sku=BuildTools&rel=16

          當(dāng)然,這個(gè)下載完成的也只是一個(gè)在線安裝包,還是需要連接網(wǎng)絡(luò)進(jìn)行下載的,如果你們的服務(wù)器也是沒(méi)有連接外網(wǎng)權(quán)限的話,這里需要換個(gè)方式

          對(duì)于離線安裝,找到下載后的安裝器所在的路徑,打開 CMD,輸入下面的命令,即可按需下載需要的組件到指定的位置,例如這里我是將下載好的文件放在我桌面上的 msbuild 文件夾下的 offline 文件夾中

          Copy
          vs_buildtools.exe --layout C:\Users\danvi\Desktop\msbuild\offline --add Microsoft.VisualStudio.Workload.MSBuildTools --add Microsoft.VisualStudio.Workload.WebBuildTools --lang zh-CN

          整個(gè)命令包含了三個(gè)部分的內(nèi)容

          • --layout:指定離線安裝文件所在的路徑

          • --add:指定需要下載的組件,因?yàn)槲覀兊南到y(tǒng)是 Web 項(xiàng)目,為了防止在 MSBuild 中生成出錯(cuò),所以這里除了 MSBuild 還需要下載了一個(gè) WebBuildTools

          • --lang:指定安裝包的語(yǔ)言

          同新版本的 VS 的安裝一樣,當(dāng)我們輸入命令之后,會(huì)打開如下的頁(yè)面,等待安裝器的下載完成即可

          當(dāng)下載器安裝完成后,會(huì)自動(dòng)彈出一個(gè)新的控制臺(tái)頁(yè)面,坐和放寬,此時(shí)已經(jīng)開始自動(dòng)下載我們需要的組件,當(dāng)全部組件下載完成時(shí),按照提示的內(nèi)容關(guān)閉彈出的頁(yè)面即可

          找到你所指定的下載路徑,將整個(gè)文件夾拷貝到服務(wù)器上,然后點(diǎn)擊 vs_buildtools.exe 進(jìn)行安裝,具體安裝的組件則可以通過(guò)右側(cè)的安裝詳細(xì)信息進(jìn)行查看,如果你在使用中發(fā)現(xiàn)缺少你需要的,按照上面的方法添加新的參數(shù)即可

          3.4、Java 環(huán)境配置

          因?yàn)?Jenkins 與 SonarQube 均是 Java 程序,并且 SonarQube 對(duì) Java SDK 的版本有具體的要求,這里我選擇的是 OpenJDK 11,你可以從此處(https://jdk.java.net/archive/) 獲取到 OpenJDK 的各個(gè)發(fā)行版本

          與 .NET SDK 不同,在習(xí)慣了一路 next 就可以安裝各種的操作后,在安裝 OpenJDK 時(shí),需要手動(dòng)的將 SDK 的路徑以及相關(guān)的環(huán)境變量添加到操作系統(tǒng)中

          解壓下載完成的壓縮包到指定的路徑,例如這里我的路徑是?E:\sdk\jdk-11.0.2,此時(shí)我們需要對(duì)環(huán)境變量進(jìn)行配置,從而確保 Java 環(huán)境的正確安裝

          右擊我的電腦,選擇屬性,打開系統(tǒng)信息頁(yè)面,點(diǎn)擊右側(cè)的高級(jí)系統(tǒng)設(shè)置,打開系統(tǒng)屬性彈窗,當(dāng)然,你也可以通過(guò) Windows 10 的搜索直接搜索環(huán)境變量關(guān)鍵字找到這個(gè)頁(yè)面

          點(diǎn)擊環(huán)境變量按鈕,在系統(tǒng)變量的類別下,我們執(zhí)行如下的三步操作

          • 新建系統(tǒng)環(huán)境變量 JAVA_HOME,變量值為解壓后的 OpenJDK 所在的路徑,例如我這里配置的?E:\sdk\jdk-11.0.2

          • 新建系統(tǒng)環(huán)境變量值 CLASS_PATH,具體對(duì)應(yīng)的值為?%Java_Home%\lib;

          • 修改已經(jīng)存在的 PATH 變量,將?%JAVA_HOME%\bin?添加到環(huán)境變量中

          至此,針對(duì) Java 的環(huán)境配置已經(jīng)完成,此時(shí)為了避免一些奇怪的錯(cuò)誤,建議你重啟下電腦。在重啟之后,可以通過(guò)?java --version?命令來(lái)查看是否已經(jīng)配置成功,如果如下圖一樣可以顯示出 Java 的版本信息,則代表 Java 環(huán)境已經(jīng)配置成功

          3.5、總結(jié)

          自此,目前使用到的軟件所需的環(huán)境就已經(jīng)安裝配置完成了,在下一篇中就可以安裝我們主要使用到的兩個(gè)軟件 Jenkins 和 SonarQube,從而配合我們已經(jīng)存在的 Gitlab,構(gòu)建自己的 CI/CD 服務(wù)

          四、References

          • 在攜程,我們?nèi)绾螌?shí)踐 DevOps

          • The Product Managers’ Guide to Continuous Delivery and DevOps

          • CI/CD是什么?如何理解持續(xù)集成、持續(xù)交付和持續(xù)部署


          瀏覽 58
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

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

          手機(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>
                  老肥骚逼| 国产小说一区二区三区 | 国产探花视频在线播放 | 涩网站入口 | 国产又粗又细又黄视频 |