NETCore下CI/CD之自动化测试 (详解篇)

news2025/1/11 17:46:54

 NETCore下CI/CD之自动化测试 (详解篇)

目录:导读

前言

安装JDK

安装 Tomcat

首先,我们需要指定 Tomcat.PID 进程文件,进入 /usr/local/tomcat/bin,编辑文件

增加 tomcat 账户并赋予权限

防止Jeknins报错,先打个预防针,创建 .jenkins 目录

编写系统服务文件

tomcat.service 输入以下内容

系统服务文件创建完成,输入命令3连

部署并运行jenkins

设置账号密码

Jenkins已就绪

安装 .NET Core 环境

创建一个.NET Core 的解决方案,包含单元测试

jenkins配置邮件通知

配置系统管理员邮件地址

配置 Smtp 服务器

创建第一个 CI/CD 项目

创建任务

源码管理,选择 git

编写构建脚本

编写测试脚本

安装 jenkins 必须插件

发送测试报告配置

配置邮件接收人

构建成功,获得报表

收到邮件通知

一个小细节

结束语


 

前言

本文从零开始,一步一步的引导,从安装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 包包,地址:Jenkins 的安装和设置 ,由于我们使用 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 使用即可。访问 Download .NET (Linux, macOS, and Windows)

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 化的项目具有一定的参考意义。

如果你觉得文章还不错,请大家 点赞、分享、留言 下,因为这将是我持续输出更多优质文章的最强动力!

看到这篇文章的人有觉得我的理解有误的地方,也欢迎评论和探讨~

你也可以加入下方的的群聊去和同行大神交流切磋

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/357285.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JSP脚本指令及标记学习笔记

好久没更新文章了&#xff0c;上次更新的文章还是一个学习笔记。本篇博文介绍的是JSP基本概念 1.JSP开发方法 一个jsp网页只需要加上<%%>就行了。 2.JSP运行机制 3.JSP脚本元素 3.1 JSP脚本代码 <% 脚本代码 %>实例 <% SimpleDateFormat df new SimpleDa…

MathType公式编辑器过期(禁止联网)的解决方案

MathType公式编辑器过期&#xff08;禁止联网&#xff09;的解决方案 Mathtype公式编辑器无法使用解决方案 MathType联网后显示证书失效&#xff0c;需要重新认证或者购买。或者是MathType成了精简版&#xff0c;只剩两行了。 1. 打开控制面板 方法1 首先大家在电脑中打开W…

解析从Linux零拷贝深入了解Linux-I/O(下)

接上文解析从Linux零拷贝深入了解Linux-I/O&#xff08;上&#xff09; 大文件传输场景 零拷贝还是最优选吗 在大文件传输的场景下&#xff0c;零拷贝技术并不是最优选择&#xff1b;因为在零拷贝的任何一种实现中&#xff0c;都会有「DMA 将数据从磁盘拷贝到内核缓存区——P…

加油站会员管理小程序实战开发教程11

我们已经用了10篇的篇幅讲解了首页的功能,首页主要是用来展示信息的。那么接下来就要进入我们的功能页面了,会员管理一个比较重要的功能是充值的功能。 要想实现充值功能,首先需要办一张会员卡,那什么时候办理会员卡呢?需要先注册成为会员,然后进行开卡的动作。这里要注…

c/c++开发,无可避免的模板编程实践(篇五)

一、关联容器简述 容器containers是用来管理某对象数据的集合&#xff0c;每种容器都有其优缺点&#xff0c;为了应对不同应用需求&#xff0c;标准库准备了不同的容器类型&#xff0c;容器可以是数组、链表或者是每个元素有一个特别的键值&#xff08;KEY&#xff09;组织起来…

gocd部署应用

产品需要在多个环境部署测试&#xff0c;为了提高部署测试效率&#xff0c;故计划使用CD工具&#xff0c;jenkins确实足够强大&#xff0c;但是使用部署功能是需要安装插件的&#xff0c;再说自己本身只用部署功能&#xff0c;故决定找一个小巧的CD工具&#xff0c;经过一番查找…

CUDA线程块的分配

为了确保能够真正地了解线程块的分配&#xff0c;接下来我们写一个简短的内核程序来输出线程块、线程、线程束和线程全局标号到屏幕上。现在&#xff0c;除非你使用的是 3.2 版本以上的 SDK否则内核中是不支持 printf的。因此&#xff0c;我们可以将数据传送回 CPU 端然后输出到…

微内核和零拷贝

文章目录1.操作系统的特性并发共享虚拟异步2. 微内核(1) 支撑功能中断管理时钟管理原语操作(2)资源管理功能进程管理存储器管理设备管理3.零拷贝什么是零拷贝传统拷贝方式零拷贝方式GatherCopy零拷贝mmap零拷贝1.操作系统的特性 并发 并发&#xff1a;在宏观上&#xff0c;多个…

TryHackMe-Wreath [网络杀伤链](windows网络)渗透测试

Wreath 复习了几天&#xff0c;把自己写的辣鸡wp都看了看&#xff0c;ad也复了复&#xff0c;顺便还将之前一些不懂和遗漏的一些问题都解决了&#xff0c;所谓温故而知新 在继续红队路径之前&#xff0c;先来玩一玩期待已久的Wreath 了解如何通过破坏面向公众的 Web 计算机并…

分布式缓存的问题

1,Redis缓存穿透问题 Redis缓存穿透问题是指查询一个一定不存在的数据&#xff0c;由于这样的数据缓存一定不命中&#xff0c;所以这样的请求一定会打到数据库上。但是由于数据库里面也没有这样数据&#xff0c;且也没有将这样的null值缓存到数据库&#xff0c;从而造成这样的…

软件设计(十三)-原码、反码、补码、移码

软件设计&#xff08;十二&#xff09;数据结构(下)https://blog.csdn.net/ke1ying/article/details/129035300 下面把一个数转成二进制表达形式 原码&#xff1a; 数值1 &#xff1a; 0000 0001 数值-1 &#xff1a; 1000 0001 1 (- 1) &#xff1a; 1000 0010 这是8个…

【安卓逆向】APK修改与反编译回编译

【安卓逆向】反编译修改APK回编译使用工具流程步骤Apktool相关安装与使用常用命令备查APK签名命令备查实战练习反编译查看修改的地方使用Apktool反编译得到产物文件夹并进行修改回编APK实用场景在日常开发我们可能需要替换某些资源或者修改某些代码&#xff0c;但是我们没有源码…

Java基础语法练习题

2023.2.18刷题1、java的4类流程控制语句解析&#xff1a;java的4类流程控制语句循环语句&#xff1a;while&#xff0c;for&#xff0c;do while选择语句&#xff08;分支语句&#xff09;&#xff1a;if,switch跳转语句&#xff1a;break,continue,break,label异常处理语句&am…

Markdown及其语法详细介绍(全面)

文章目录一、基本语法1.标题2.段落和换行3.强调4.列表5.链接6.图片7.引用8.代码9.分割线10表格二、扩展语法1.标题锚点标题 {#anchor}2.脚注3.自动链接4.任务列表5.删除线6.表情符号7.数学公式三、Markdown 应用1.文档编辑2.博客写作3.代码笔记四、常见的工具和平台支持 Markdo…

加油站会员管理小程序实战开发教程12

我们上一篇介绍了会员数据源的开发,本节我们介绍一下会员注册功能。 首先呢梳理一下会员注册的业务逻辑,如果用户是首次登录,那他肯定还没有给我们的小程序提交任何的信息。那么我们就在我的页面给他显示一个注册的按钮,如果他已经注册过了,那么就正常显示会员的信息,他…

spring cloud 集成 seata 分布式事务

spring cloud 集成 seata 分布式事务 基于 seata-server 1.6.x 序言 下载 seata-server 准备一个数据库 seata 专门为 seata-server 做存储&#xff0c;如, 可以指定 branch_tabledistributed_lockglobal_tablelock_table 准备一个业务库&#xff0c;比如存放定单&#xff…

【学习笔记2.19】动态规划、MySQL、Linux、Redis(框架)

动态规划 343整数拆分 class Solution {public int integerBreak(int n) {int dp [] new int [n 1];//dp[i]:正整数i拆分后的最大乘积dp[2] 1;for(int i 2;i < n ;i ){for(int j 1;j < i;j ){dp[i] Math.max(dp[i],Math.max(j * (i - j),j * dp[i - j]));} …

Ubuntu安装opencv库3.4.10,并在cmake工程中引入opencv库

Windows下安装不同&#xff0c;Ubuntu安装OpenCV库时&#xff0c;需要事先安装依赖&#xff0c;而且不同OpenCV库所需的依赖可能会有所不同&#xff0c;下面的依赖亲测 3.4.10 和 4.5.5版本的有效&#xff0c;但是4.6以上版本安装可能会报错。 参考链接&#xff1a;https://bl…

【Python】以邮件的方式定时发送一天的股票分析报告

【Python】以邮件的方式定时发送一天的股票分析报告 文章目录【Python】以邮件的方式定时发送一天的股票分析报告1、Python发送邮件1&#xff09;EmailSender封装2&#xff09;可能存在的问题2、jinja2动态渲染html页面3、阿里云OSS搭建图床1&#xff09;Python上传图片到OSS中…

在Linux和Windows上安装sentinel-1.8.5

记录&#xff1a;380场景&#xff1a;在CentOS 7.9操作系统上&#xff0c;安装sentinel-1.8.5。在Windows上操作系统上&#xff0c;安装sentinel-1.8.5。Sentinel是面向分布式、多语言异构化服务架构的流量治理组件。版本&#xff1a;JDK 1.8 sentinel-1.8.5 CentOS 7.9官网地址…