主頁 > .NET開發 > .NETCore下CI/CD之自動化測驗

.NETCore下CI/CD之自動化測驗

2020-09-21 22:32:58 .NET開發

前言

為了呼應《中國.NET開發者峰會2019上海站》,作為演講嘉賓,我希望和各位同行建立更多的互動,為此,我特地將部分演講內容,整理成文章先行發布,本文從零開始,一步一步的引導,從安裝JDK/Tomcat/jenkins 到建立第一個 CI/CD 專案,確保按照本文指引,能快速的在 CentOS 下,將 .NET Core 通過 jenkins 進行持續集成/持續部署,通過 jenkins,實作集成測驗自動化,最終達到,快速構建專案,執行單元測驗,生成測驗報告,發送測驗報告等作業,讓測驗作業伴隨著 CI/CD 的持續進行而不斷的對輸出進行測驗和校正,真正實作讓本地單元測驗在 CI/CD 中發揮其巨大的威力,

大會詳情介紹請看文章末尾介紹,

安裝JDK

首先安裝Java環境,在Centos7上,搜索倉庫內的包包

yum search java | grep --color OpenJDK

可以看到一堆顏色鮮艷的Java包包,接下來執行安裝openjdk

yum install java-1.8.0-openjdk java-1.8.0-openjdk-devel

安裝完成后,執行命令

java -version
# 輸出 OpenJDK 64-Bit Server VM (build 25.222-b10, mixed mode) 表示安裝成功

安裝 Tomcat

安裝Tomcat的話,直接下載Tomcat的zip包,下載地址:http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.27/bin/apache-tomcat-9.0.27.tar.gz 到官網下載是個好習慣,認準這只貓;然后上傳到服務器,解壓
比如我目前上傳到目錄: /usr/local/,執行解壓命令,然后洗掉壓縮包

tar -zxf apache-tomcat-9.0.27.tar.gz tomcat
rm -f apache-tomcat-9.0.27.tar.gz

實際上,按照一般情況下,直接執行下面的命令可以直接運行 Tomcat

/usr/local/tomcat/bin/startup.sh

但是作為測驗要盡量貼近實際環境的極客追求來說,我們要把 Tomcat 作為系統服務,在系統開關機的時候隨系統啟動,那么就需要多做點小作業,不需要擔心,下面的作業一共就花了2分鐘左右

首先,我們需要指定 Tomcat.PID 行程檔案,進入 /usr/local/tomcat/bin,編輯檔案

vi /usr/local/tomcat/bin/setenv.sh
// 輸入
CATALINA_PID="$CATALINA_BASE/tomcat.pid"
JAVA_OPTS="-server -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=1024m -Xms512M -Xmx1024M -XX:MaxNewSize=256m"
// 保存,退出編輯

增加 tomcat 賬戶并賦予權限

getent group tomcat || groupadd -r tomcat
getent passwd tomcat || useradd -r -d /opt -s /bin/nologin -g tomcat tomcat
chown -R tomcat:tomcat /usr/local/tomcat

防止Jeknins報錯,先打個預防針,創建 .jenkins 目錄

mkdir /opt/.jenkins
chown -R tomcat:tomcat /opt/.jenkins

撰寫系統服務檔案

進入目錄 cd /usr/lib/systemd/system,執行 ls -l,可以看到很多服務檔案,然后我們直接執行下面的命令新建并編輯檔案 tomcat.service

vi tomcat.service

tomcat.service 輸入以下內容

[Unit]
Description=tomcat
After=syslog.target network.target remote-fs.target nss-lookup.target
 
[Service]
Type=forking
Environment = "JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.222.b10-1.el7_7.x86_64" 
PIDFile=/usr/local/tomcat/tomcat.pid
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh
ExecReload=/bin/kill -s HUP $MAINPID
PrivateTmp=true
User=tomcat
Group=tomcat
 
[Install]
WantedBy=multi-user.target

// 保存,退出

系統服務檔案創建完成,輸入命令3連

systemctl enable tomcat.service
systemctl start tomcat.service
system status tomcat.service

如果以上的命令沒有報錯,那么恭喜你,你已經成功部署了 Tomcat 服務,接下來就是部署 jenkins 到 Tomcat

部署并運行jenkins

下載 jenkins 的war 包包,地址:https://jenkins.io/zh/download/ ,由于我們使用 Tomcat 托管,直接選擇 Generic Java package(.war)下載即可

下載完成,直接將該 jenkins.war 包上傳到 Tomcat 服務器目錄 /usr/local/tomcat/webapps/ 下,這個時候你應該喝杯咖啡;稍等一會,Tomcat 馬上就把 jenkins 做好了,大概在1分鐘后,訪問 jenkins 站點的地址

http://172.16.1.202:8080/jenkins

在 CentOS上,正常情況下,你是無法訪問該地址的,需要打開 Tomcat 這只貓貓的偵聽埠:8080,執行下面的命令,完成防火墻的設定

firewall-cmd --zone=public --add-port=8080/tcp --permanent
firewall-cmd reload

再次訪問 jenkins 的地址,你應該看到下面這個界面:

首次訪問,按照提示,直接復制密碼 cat /opt/.jenkins/secrets/initialAdminPassword 到輸入框中進入 jenkins,稍后還需要創建用戶,一并設定完成即可

等待 jenkins 初始化完成,可選擇安裝推薦的插件

請耐心等待插件安裝完成....

設定賬號密碼

Jenkins已就緒

安裝 .NET Core 環境

相信來到這個環節,大家都松了一口氣,畢竟安裝 sdk/runtime 這種事情,微軟已經幫我們把腳本寫好了,直接 copy 使用即可,訪問 https://dotnet.microsoft.com/download/linux-package-manager/centos7/sdk-current

sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm

// 本文演示還是使用 2.2
sudo yum install dotnet-sdk-2.2

安裝完成,按照國際慣例,輸入 dotnet --version,輸出版本號即為安裝成功

創建一個.NET Core 的解決方案,包含單元測驗

一個相對標準的解決方案結構如下,解決方案中必須包含 src/test 兩個基礎專案,表示該專案有單元測驗,沒有單元測驗的專案是不完整的,這應當成為一種良好的編程規范,專案建立完成,我們本地執行單元測驗看看結果,

dotnet test

其中,Ron.XUnitTest 專案使用了托管測驗主機的方式運行單元測驗,默認的測驗結果檔案是 .trx 格式,在 jenkins 上執行發送測驗報告的時候, jenkins 將無法決議,為了使用測驗結果檔案,我們還必須參考另外一個 nuget 包:XunitXml.TestLogger,該組件賦予我們將 dotnet test 的結果檔案轉換為 xUnitXml 檔案的能力,

控制臺輸出結果如下:

一共有12項測驗,其中全部通過,本地測驗已經通過,接下來我們就開始使用 jenkins 構建 .NET Core 程式,

jenkins配置郵件通知

為了實作發送測驗報告的功能,我們需要在 jenkins 中配置郵件服務器,點擊 Manage Jenkins -> Configure System -> Email notification

配置系統管理員郵件地址

配置 Smtp 服務器

創建第一個 CI/CD 專案

創建任務

點擊 “開始創建一個新任務”,輸入任務名稱,選擇自由風格的專案,點擊確定,然后馬上就進入了任務詳細配置的界面,

原始碼管理,選擇 git

由于我的測驗專案托管在 GitHub 上,所以我填入 GitHub 的專案地址:https://github.com/lianggx/RonTest.git,身份驗證,我選擇添加一個認證資訊,

撰寫構建腳本

接下來,直接拉到底部,在構建選項這里選擇“增加構建步驟”,選擇 “執行 shell”,輸入構建腳本,

echo '==============準備開始構建=================='
pwd

cd src/Ron.Blogs
sudo dotnet restore
sudo dotnet build
sudo dotnet publish --framework netcoreapp2.2 -o /data/sites/RonTest

echo '==============構建完成=================='

撰寫測驗腳本

再次增加一個構建步驟,“執行 shell”,輸入腳本

sudo dotnet test test/Ron.XUnitTest/Ron.XUnitTest.csproj --logger:"xunit;LogFileName=TestResult.xml"

這里有一個細節,就是在執行命令的時候帶了一個引數 --logger:"xunit;LogFileName=TestResult.xml",表示輸出測驗結果為 xunit 格式的 xml 檔案,該檔案將在下面的測驗報告環節使用,

演示到了這里,有點走不下去,因為我們要決議測驗報告,但是這個時候我們需要去安裝一個插件,否則無法決議

安裝 jenkins 必須插件

回傳 jenkins 首頁,依次點擊 Manage Jenkins -> Manage Plugins -> Available(可選插件),搜索 TestComplete xUnit ,勾選,選擇直接安裝即可,

發送測驗報告配置

安裝完成后,再次進入任務配置頁,添加構建后操作,選擇:Publish xUnit test result report,Report Type 選擇 xUnit.NET-v2(default),Pattern 輸入測驗報告生成的路徑:

test/Ron.XUnitTest/TestResults/TestResults.xml

配置郵件接收人

繼續添加構建后操作步驟 E-mail notification

保存配置,立即構建!

構建成功,獲得報表

收到郵件通知

一個小細節

由于我是從安裝 CentOS 開始做起,在開始構建的時候還有一個錯誤,就是報:sudo: no tty present and no askpass program specified,如果有碰到的同學,請勿驚慌,編輯下面的檔案可解決問題

vi /etc/sudoers

// 定位到檔案末尾,增加兩個用戶的配置,保存即可
jenkins ALL = NOPASSWD:ALL
tomcat ALL = NOPASSWD:ALL

結束語

本文詳細介紹了從零開始,如何利用 jenkins 對 .NET Core 專案進行 CI/CD 下的集成自動化測驗,對于即將開展或者已經開展 CI/CD 化的專案具有一定的參考意義,篇幅較長,由于篇幅較長,難免有所疏漏,歡迎指正,
文章參考:https://www.cnblogs.com/ieinstein/p/7096650.html

中國.NET開發者峰會2019上海站

作為《中國.NET開發者峰會2019上海站》的演講嘉賓,我分享的主題《建立TDD的高效開發模型》,里面會提到本文的內容,由于本文篇幅較長,所以先放本節內容,在會上我也會做詳細的介紹,歡迎大家到上海現場交流,進入現場的方式請訪問下方的二維碼,獲取大會行程介紹,也請掃描下方的二維碼獲取,

大會資訊

2019年11月9日 09:00-18:00
大會地址:(上海楊浦)佳木斯路777號上海中谷小南國花園酒店
門票優惠:每張門票299, 購買團體票(大于10張)享受整單8折優惠,請通過郵箱聯系主辦方 [email protected]

報名方式

活動行:https://www.huodongxing.com/event/4514005355700

百格活動:https://www.bagevent.com/event/6069892

演講嘉賓介紹

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

標籤:.NET Core

上一篇:.NET Core 3.0 構建和部署

下一篇:.net core+topshelf+quartz創建windows定時任務服務

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

熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布
  • C#多執行緒學習(二) 如何操縱一個執行緒

    <a href="https://www.cnblogs.com/x-zhi/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2943582/20220801082530.png" alt="" /></...

    uj5u.com 2023-04-19 09:17:20 more
  • C#多執行緒學習(二) 如何操縱一個執行緒

    C#多執行緒學習(二) 如何操縱一個執行緒 執行緒學習第一篇:C#多執行緒學習(一) 多執行緒的相關概念 下面我們就動手來創建一個執行緒,使用Thread類創建執行緒時,只需提供執行緒入口即可。(執行緒入口使程式知道該讓這個執行緒干什么事) 在C#中,執行緒入口是通過ThreadStart代理(delegate)來提供的 ......

    uj5u.com 2023-04-19 09:16:49 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    <a href="https://www.cnblogs.com/huangxincheng/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/214741/20200614104537.png" alt="" /&g...

    uj5u.com 2023-04-18 08:39:04 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    一:背景 1. 講故事 前段時間協助訓練營里的一位朋友分析了一個程式卡死的問題,回過頭來看這個案例比較經典,這篇稍微整理一下供后來者少踩坑吧。 二:WinDbg 分析 1. 為什么會卡死 因為是表單程式,理所當然就是看主執行緒此時正在做什么? 可以用 ~0s ; k 看一下便知。 0:000> k # ......

    uj5u.com 2023-04-18 08:33:10 more
  • SignalR, No Connection with that ID,IIS

    <a href="https://www.cnblogs.com/smartstar/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u36196.jpg" alt="" /></a>...

    uj5u.com 2023-03-30 17:21:52 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:15:33 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:13:31 more
  • C#遍歷指定檔案夾中所有檔案的3種方法

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-03-27 14:46:55 more
  • C#/VB.NET:如何將PDF轉為PDF/A

    <a href="https://www.cnblogs.com/Carina-baby/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2859233/20220427162558.png" alt="" />...

    uj5u.com 2023-03-27 14:46:35 more
  • 武裝你的WEBAPI-OData聚合查詢

    <a href="https://www.cnblogs.com/podolski/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/616093/20140323000327.png" alt="" /><...

    uj5u.com 2023-03-27 14:46:16 more