從零開始針對 .NET 應用的 DevOps 運營實踐 - 運行環境搭建

一、Overview

最近的一段時間,在公司裏我都在進行基於 Jenkins 和 SonarQube 配合已有的 Gitlab 搭建部門的持續集成環境的工作,雖然之前有使用過 GitHub Actions 和 Azure DevOps,但是從頭開始搭建這樣的一套 DevOps 環境還是學習到了一些新的知識點,因此,藉着這個中秋國慶假期的機會,分享下整個工具鏈的搭建過程,如果你也有相似的需求的話,希望可以對你有所幫助

二、Contents

  1. 從零開始針對 .NET 應用的 DevOps 運營實踐 - 運行環境搭建

三、Step by Step

3.1、一些概念

DevOps, Development 和 Operations,從名稱上就可以看出,這一名詞包含了軟件的開發與運營。當然,這裏提到的 DevOps 是一種方法論,更多的是爲了打破開發與運營人員之間的壁壘,用來促進開發人員、運營人員以及 QA 人員之間的溝通與協作。通過引入 DevOps 中使用的各種工具,我們可以通過自動化的方式,完成軟件系統的構建、測試、發佈,從而降低因人工操作所造成的不確定性,提升軟件的交付速度、系統質量

在踐行 DevOps 方法論時,經常會提到三個概念,持續集成、持續交付、持續部署,這裏藉由 Redhat 上介紹相關概念的一張圖片來說明三者之間的聯繫

ci cd workflow

  • 持續集成(Continuous Integration):在傳統的軟件開發過程中,將個人開發的代碼與整個項目代碼的合併一般都會置於比較靠後的階段,而持續集成強調的是開發人員提交了新代碼之後,立刻進行構建、單元測試。根據測試的結果,確定新代碼和原有代碼能否正確地集成在一起
  • 持續交付(Continuous Delivery):持續交付是一種自動化的軟件交付手段,在持續集成的基礎上,代碼庫中的代碼已經做好了部署到正式環境的準備,在目前的通用做法中,將構建之後的代碼通過持續交付變更部署到測試環境、預發佈環境中,實現對持續集成的擴展,出於業務方面的考慮,我們可以手動選擇是否部署到正式環境
  • 持續部署(Continuous Deployment):作爲對持續交付的延伸,持續部署能夠自動的將最終的代碼部署到生產環境中,完成整個的 CI/CD 流程

雖然目前的需求僅僅是爲了實現持續集成,完成對於系統的自動化代碼檢查、自動化單元測試,但是因爲後續的功能對於我們完整的實施 DevOps 方法論也是必須的,所以在這幾篇的博客內容中,我也會完成對於後續功能的實踐分享

3.2、前期調研

與持續集成的場景存在一些的差異,我們在實際的開發中,並不會在新的功能分支上按照每個開發人員再建立單獨的分支,因此,這裏的持續集成更多的想要實現的是當開發人員提交代碼到 Gitlab 時,自動觸發代碼檢查以及單元測試,產出代碼檢查報告、單元測試報告、以及整個項目的測試覆蓋率

因此,基於目前的需求,整個系統主要依賴於三個主要的軟件系統,Gitlab、Jenkins、以及 SonarQube,當然,這裏缺少了一個 bug 管理工具,因爲我們部門人數不是很多,目前是和別的部門共用的 Redmine 進行的項目管理,所以本次並沒有納入到我們的需求範圍內,當然, bug 管理也是推行 DevOps 中不可缺少的一部分

在挑選組件時,本着不給自己和別人挖坑的原則,優先考慮使用人數多的軟件系統。因此,作爲事實上的開源 CI/CD 工具的標準,毫無疑問選擇 Jenkins,而對於代碼的自動化檢查,結合我們需要實現私有化部署,滿足對多種開發語言的支持、能夠與 CI/CD 工具進行有效結合的需求,這裏最終選擇的是 SonarQube

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

在選定好使用的軟件後,就需要完成環境的配置,Jenkins 與 SonarQube 都是基於 Java 的軟件,因此在安裝軟件之前,需要我們在服務器上完成 Java 環境的配置,同時,基於我們的系統現狀,需要在服務器上安裝好 .NET Framework、.NET Core、Git 以及 Node

對於 Git、Node、.NET SDK 的安裝,下載安裝包後,一直 next 即可,加上這裏主要針對的是 .NET 程序員,以及我們的服務器是斷網的,所以這裏主要列舉的是兩個相對來說稍微複雜的環境配置,一個是對於 MSBuild 工具的離線下載,另一個則是 Java 環境的配置

3.3、MSBuild 安裝

因爲在整個過程中會涉及到對應用程序的編譯生成,對於 .NET Core 應用,完全可以採用 .NET Core CLI 中的各種命令來實現,而對於 .NET Framework 程序來說,則需要一個執行應用程序生產的平臺,MSBuild 就是這樣的一個工具,我們在開發過程中使用 Visual Studio 進行程序編譯時,其實也是會借用 MSBuild 來進行的

因此,最簡單的辦法,就是在服務器上安裝 VS 即可,當然,這個過於簡單粗暴了,以及在服務器上安裝我們開發使用的 IDE 也過於浪費,所以這裏還是會選擇獨立的安裝 MSBuild

與 VS 相似,MSBuild 也有不同的版本,爲了避免一些莫名其妙的問題,在 MSBuild 的版本選擇上,最好選擇與你們開發時用的 VS 匹配的版本,因爲我們在開發中會使用到了 VS 2017 和 VS 2019 這兩個版本,所以這裏我會安裝兩個 MSBuild 到服務器上

對於 MSBuild,之前很多文章中說可以直接把你本地電腦中的 VS 所包含的 MSBuild,丟到服務器上就可以了,經過我的多次嘗試,在踩坑的路上越走越遠,這裏還是建議你通過 Visual Studio Build Tools 進行安裝

在 VS 的下載頁面,這裏是以 VS 2019 的下載頁面進行示例,在 Visual Studio 2019 工具這個內容塊中,找到生成工具這個下載項,下載即可

Visual Studio Build Tools

這裏你可以直接通過我給出的這兩個地址,直接下載對應的生成工具,打開軟件,找到 MSBuild 這個組件進行安裝即可

當然,這個下載完成的也只是一個在線安裝包,還是需要連接網絡進行下載的,如果你們的服務器也是沒有連接外網權限的話,這裏需要換個方式

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

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

整個命令包含了三個部分的內容

  • --layout:指定離線安裝文件所在的路徑
  • --add:指定需要下載的組件,因爲我們的系統是 Web 項目,爲了防止在 MSBuild 中生成出錯,所以這裏除了 MSBuild 還需要下載了一個 WebBuildTools
  • --lang:指定安裝包的語言

離線下載安裝包

同新版本的 VS 的安裝一樣,當我們輸入命令之後,會打開如下的頁面,等待安裝器的下載完成即可

下載安裝器

當下載器安裝完成後,會自動彈出一個新的控制檯頁面,坐和放寬,此時已經開始自動下載我們需要的組件,當全部組件下載完成時,按照提示的內容關閉彈出的頁面即可

組件安裝完成

找到你所指定的下載路徑,將整個文件夾拷貝到服務器上,然後點擊 vs_buildtools.exe 進行安裝,具體安裝的組件則可以通過右側的安裝詳細信息進行查看,如果你在使用中發現缺少你需要的,按照上面的方法添加新的參數即可

安裝 MSBuild

3.4、Java 環境配置

因爲 Jenkins 與 SonarQube 均是 Java 程序,並且 SonarQube 對 Java SDK 的版本有具體的要求,這裏我選擇的是 OpenJDK 11,你可以從此處(https://jdk.java.net/archive/) 獲取到 OpenJDK 的各個發行版本

下載 Java SDK

與 .NET SDK 不同,在習慣了一路 next 就可以安裝各種的操作後,在安裝 OpenJDK 時,需要手動的將 SDK 的路徑以及相關的環境變量添加到操作系統中

解壓下載完成的壓縮包到指定的路徑,例如這裏我的路徑是 E:\sdk\jdk-11.0.2,此時我們需要對環境變量進行配置,從而確保 Java 環境的正確安裝

右擊我的電腦,選擇屬性,打開系統信息頁面,點擊右側的高級系統設置,打開系統屬性彈窗,當然,你也可以通過 Windows 10 的搜索直接搜索環境變量關鍵字找到這個頁面

環境變量設置

點擊環境變量按鈕,在系統變量的類別下,我們執行如下的三步操作

  • 新建系統環境變量 JAVA_HOME,變量值爲解壓後的 OpenJDK 所在的路徑,例如我這裏配置的 E:\sdk\jdk-11.0.2

    新建 JAVA_HOME 變量

  • 新建系統環境變量值 CLASS_PATH,具體對應的值爲 %Java_Home%\lib;

    新建 CLASS_PATH 環境變量

  • 修改已經存在的 PATH 變量,將 %JAVA_HOME%\bin 添加到環境變量中

    修改 PATH 變量

至此,針對 Java 的環境配置已經完成,此時爲了避免一些奇怪的錯誤,建議你重啓下電腦。在重啓之後,可以通過 java --version 命令來查看是否已經配置成功,如果如下圖一樣可以顯示出 Java 的版本信息,則代表 Java 環境已經配置成功

Java 版本信息

3.5、總結

自此,目前使用到的軟件所需的環境就已經安裝配置完成了,在下一篇中就可以安裝我們主要使用到的兩個軟件 Jenkins 和 SonarQube,從而配合我們已經存在的 Gitlab,構建自己的 CI/CD 服務

四、References

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章