当前位置: 首页 > news >正文

极狐GitLab CI 助力 .Net 项目研发效率和质量双提升

目录

.NET nuget 自动生成测试包(prerelease)版本号

.NET 版本号规范

持续集成自动打包

持续集成自动修改版本号

.NET 行级增量代码规范——拯救老项目

本地全量代码规范

行级增量代码规范


很多团队或开发者都会使用 C#、VB 等语言开发 .Net 应用。.NET 版本号的管理与对应代码的质量管理是一个比较充满挑战的话题。本文将介绍使用极狐GitLab CI 来实现 .NET 应用的版本号自动生成以及代码的增量扫描,从而提高 .NET 应用的研发效率。

.NET nuget 自动生成测试包(prerelease)版本号


NET 包(nuget)的版本号位于项目配置文件中(比如 Foo.csproj),比如这个包是 1.1.0 版本:

<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><TargetFramework>netstandard2.0</TargetFramework><Version>1.1.0</Version></PropertyGroup>
</Project>

当开发新版时(比如 1.2.0),可能需要发布测试包,供联调和测试,当测试通过时,才会发布正式包。

可以使用这种 Git 工作流(也有其他工作流,大同小异):

  • 开发分支(如 feature-123)或合并请求(MR/PR)时:发布测试包;

  • 主干分支或 Tag 时:发布正式包。

图片

.NET 版本号规范


.NET 测试包的官方术语是 prerelease(预发行版),在 Visual Studio 包管理界面有一个开关:

图片

版本号遵循语义化版本规范,常用如下命名:

  • alpha:Alpha 版本,通常用于在制品和试验品

  • beta:Beta 版本,通常指可用于下一计划版本的功能完整的版本,但可能包含已知 bug。

  • rc:候选发布,通常可能为最终(稳定)版本,除非出现重大 bug。

如果项目测试流程不是很复杂,采用其中一个就够了,本文采用 beta。

所以版本号的变化历程可能是这样的:1.1.0 → 1.2.0-beta.1 → 1.2.0-beta.2 → 1.2.0-beta.3 → 1.2.0

如果手动修改,多次改代码很容易忘记改版本号。

有没有办法自动修改版本号?可以!那就是持续集成。

持续集成自动打包


提交代码,触发程序自动打包,这是持续集成的典型用途。使用 GitLab 持续集成配置 .NET 自动打包非常简单:

vi MyDotnetLibrary/.gitlab-ci.yml

.gitlab-ci.yml 的内容如下:

image: mcr.microsoft.com/dotnet/sdk:6.0default:before_script:- dotnet nuget add source "$CI_SERVER_URL/api/v4/projects/$CI_PROJECT_ID/packages/nuget/index.json" -n GitLab -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD --store-password-in-clear-textbuild_release:stage: buildonly:- mainscript:- rm -rf *.Tests- dotnet pack **/*.csproj -c Release- dotnet nuget push **/bin/Release/*.nupkg -s GitLab

可以看到上面代码判断了 only: - main,也就是主干分支时才打包。

持续集成自动修改版本号


开发新版本时,只需要修改一次版本号(比如 1.2.0):

<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><TargetFramework>netstandard2.0</TargetFramework><Version>1.2.0</Version></PropertyGroup>
</Project>

然后,让持续集成自动判断:

  • 合并请求:在版本号后面添加测试版本号,变成 1.2.0-beta.123

  • 主干分支:不添加,保持 1.2.0

GitLab 流水线内置了很多变量,有几个适合做测试版本号:

  • CI_PIPELINE_IID:项目内的流水线 ID,从 1 开始自增,每次提交触发流水线都会自增;

  • CI_MERGE_REQUEST_IID:项目内的合并请求 ID,从 1 开始自增,每次新建合并自增,但多次提交不会变。

可以看出 CI_PIPELINE_IID 适合做测试包的构建号。

拼接出想要的格式,使用 sed 命令替换:

export CI_PIPELINE_IID=123
sed "s|</Version>|-beta.$CI_PIPELINE_IID</Version>|g" **/*.csproj

图片

本地跑通命令,再把它复制到 .gitlab-ci.yml 中:

image: mcr.microsoft.com/dotnet/sdk:6.0default:before_script:- dotnet nuget add source "$CI_SERVER_URL/api/v4/projects/$CI_PROJECT_ID/packages/nuget/index.json" -n GitLab -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD --store-password-in-clear-textbuild_prerelease:stage: buildonly:- merge_requestsscript:- rm -rf *.Tests- sed -i "s|</Version>|-beta.$CI_PIPELINE_IID</Version>|g" **/*.csproj- dotnet pack **/*.csproj -p:IncludeSymbols=true -p:SymbolPackageFormat=snupkg -c Debug- dotnet nuget push **/bin/Debug/*.nupkg -s GitLabbuild_release:stage: buildonly:- mainscript:- rm -rf *.Tests- dotnet pack **/*.csproj -p:IncludeSymbols=true -p:SymbolPackageFormat=snupkg -c Release- dotnet nuget push **/bin/Release/*.nupkg -s GitLab

运行效果:

图片

图片

.NET 行级增量代码规范——拯救老项目


从 .NET 5 开始,SDK 内置了代码分析器,可以检查 C# 和 Visual Basic 的代码质量和样式问题,无需安装第三方工具,非常方便。

本地全量代码规范


修改项目配置文件(如 Foo.csprojBar.vbproj),加入 AnalysisMode 和 ErrorLog 属性:

<Project><PropertyGroup><AnalysisMode>All</AnalysisMode><ErrorLog>compiler-diagnostics.sarif</ErrorLog></PropertyGroup>
</Project>

AnalysisMode 允许这些值,按照从松到严排序为:

  • None

  • Default

  • Minimum

  • Recommended

  • All

配置完成,即可在编译时检查代码规范,可在 VS 界面点击或使用命令:

dotnet build

图片

如果本地电脑语言为中文,.NET 会输出部分中文(3 条),但大部分信息还是英文的(96 条)。

可以看出全量扫描发现很多问题,怎么办?

  • 一个人清理干净,其他人暂停提交。显然不合适;

  • 所有人暂停工作,一起清理。也不合适,老代码改了可能出 bug;

  • 增量代码规范,逐渐修复。是个好办法,在本地很难做到,可以借助 GitLab 服务端实现。

行级增量代码规范


配置 GitLab 持续集成 .gitlab-ci.yml

image: mcr.microsoft.com/dotnet/sdk:6.0build:stage: buildallow_failure: truescript:- dotnet buildafter_script:- export PATH="/root/.dotnet/tools:$PATH"# 此工具要求 .NET 6.0+,如果项目是 .NET 5.0,也使用 6.0 SDK 构建即可- dotnet tool install --global CodeQualityToGitlab- cq sarif compiler-diagnostics.sarif gl-code-quality-report.json $(pwd)/artifacts:reports:codequality: gl-code-quality-report.json

第一次 MR(提交 .gitlab-ci.yml) 会发现「全量的很多问题」或「代码质量没有变化」,没关系,先合并进去。

图片

第二次 MR(修改老代码)会在 MR 页面提示修改的代码行是否产生了新问题,是否修复了老问题。

图片

这就是 GitLab 的行级增量代码规范功能,它有几个特点:

  • 配置简单——配置全量扫描命令,自动变成增量;

  • 除了报错模式,还支持警告模式(allow_failure)——由评审人员决定「代码不规范时能否合并」,一般不允许合并,如果线上紧急故障可以合并;

  • 提升开发效率——把代码质量问题直接显示在合并请求页面中,而无需到 CI 日志中翻找;

  • 开放——公开代码质量报告 JSON 格式,各种语言的扫描工具都可以对接(很多工具已经有热心开发者对接,比如 Java Checkstyle、pylint、eslint)。

希望本文能帮助更多的开发者拯救老项目,落地代码规范。

相关文章:

极狐GitLab CI 助力 .Net 项目研发效率和质量双提升

目录 .NET nuget 自动生成测试包&#xff08;prerelease&#xff09;版本号 .NET 版本号规范 持续集成自动打包 持续集成自动修改版本号 .NET 行级增量代码规范——拯救老项目 本地全量代码规范 行级增量代码规范 很多团队或开发者都会使用 C#、VB 等语言开发 .Net 应用…...

[协程]生成器协程调度器的实现-未完

本章内容的三个层次...

Git之分支与版本->课程目标及知识点的应用场景,分支的场景应用,标签的场景应用

1.课程目标及知识点的应用场景 Git分支和标签的命名规范 分支 dev/test/pre/pro(即master) dev:开发环境--windows (自己的电脑) test:测试环境--windows/linux (公司专门的测试电脑 pre:灰度环境(非常大的公司非常重要的项目) pro:正式环境 灰度环境与正式环境的服务器配置…...

PHP正则提取或替换img标记属性

<?php/*PHP正则提取图片img标记中的任意属性*/ $str <center><img src"/uploads/images/20100516000.jpg" height"120" width"120"><br />PHP正则提取或更改图片img标记中的任意属性</center>;//1、取整个图片代码…...

Git 命令行使用指南

Git 命令行使用指南 第一部分&#xff1a;配置 Git 1.1 设置用户信息1.2 配置换行符处理 第二部分&#xff1a;创建和配置仓库 2.1 初始化仓库2.2 克隆仓库2.3 递归克隆2.4 深度克隆 第三部分&#xff1a;基本操作 3.1 添加文件3.2 提交更改3.3 查看状态和提交历史3.4 创建和切…...

Spring 常见面试题

1、Spring概述 1.1、Spring是什么? Spring是一个轻量级Java开发框架,目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题Spring最根本的使命是解决企业级应用开发的复杂性&#xff0c;即简化Java开发。这些功能的底层都依赖于它的两个核心特性&#xff0c;也就是…...

caffe搭建squeezenet网络的整套工程

之前用pytorch构建了squeezenet&#xff0c;个人觉得pytorch是最好用的&#xff0c;但是有的工程就是需要caffe结构的&#xff0c;所以本篇也用caffe构建一个squeezenet网络。 数据处理 首先要对数据进行处理&#xff0c;跟pytorch不同&#xff0c;pytorch读取数据只需要给数据…...

【OWT】梳理构建的webrtc和owt mfc工程

梳理构建的webrtc和owt mfc工程M98 + owtp2p : 发现最终基于m98的owt也可以直接跑通 【owt】p2p client mfc 工程梳理 服务端使用github版本。 本地运行调试即可。 M98 VS2017 构建 :只构建了m98的webrtc.lib 【webrtc】vs2017 重新构建m98 G:\webrtc_m98_yjf\src webrtc本身…...

02 powershell服务器远程执行命令

一、获取服务器登录凭证 $Username myft\xngrq $PWD 123!# #将密码加密成特殊的字符串对象 $pass ConvertTo-SecureString -AsPlainText $PWD -Force #创建一个登录凭证对象 $Cred New-Object System.Management.Automation.PSCredential -ArgumentList $Username,$pass …...

LeetCode257. Binary Tree Paths

文章目录 一、题目二、题解 一、题目 Given the root of a binary tree, return all root-to-leaf paths in any order. A leaf is a node with no children. Example 1: Input: root [1,2,3,null,5] Output: [“1->2->5”,“1->3”] Example 2: Input: root […...

Linux下MSSQL (SQL Server)数据库无法启动故障处理

有同事反馈一套CentOS7下的mssql server2017无法启动需要我帮忙看看&#xff0c;启动报错情况如下 检查日志并没有更新日志信息 乍一看mssql-server服务有问题&#xff0c;检查mssql也确实没有进程 既然服务有问题&#xff0c;那么我们用一种方式直接手工后台启动mssql引擎来…...

2311极语言高亮说明书

入门 安装目录下Sec.exe为ide.Sc为编译器. .sec为单文件二进制源码结构,.SEC和.极为多文件文本结构,命令行:cmd Sc.exe 源码路径. 基础 整数变量也可以是万能指针,传送参数,参数只有整数和小数两种. 可在名称前面加或&符号取变量或函数名指针地址,文本变量只取地址不用加…...

金蝶云星空与金蝶云星空对接集成盘亏单查询打通盘亏单新增

金蝶云星空与金蝶云星空对接集成盘亏单查询打通盘亏单新增 接通系统&#xff1a;金蝶云星空 金蝶K/3Cloud&#xff08;金蝶云星空&#xff09;是移动互联网时代的新型ERP&#xff0c;是基于WEB2.0与云技术的新时代企业管理服务平台。金蝶K/3Cloud围绕着“生态、人人、体验”&am…...

深入理解 Django 信号机制

Django 信号&#xff08;signals&#xff09;是一种实现解耦的有力工具&#xff0c;它允许某些发生的事件通知其他部分的代码。信号主要用于在 Django 应用中的不同部分之间传递信息&#xff0c;尤其是在模型操作发生时。本文将深入探讨 Django 信号的工作原理、如何定义和接收…...

uniapp开发app应用从创建到上架

目录 前言 一、项目初始化 1.初始化方式 2.账号注册 3.插件安装 二、项目结构及重点文件介绍 1.项目基本结构 2.项目文件介绍 三、应用打包 1. 安卓打包 2.苹果打包 四、应用发布 1. 安卓市场发布 用户权限和隐私政策 注销 软著和App备案证书 2. 苹果市场发布 …...

为什么使用Golang而非Rust开发桌面应用?

MoonGuard 团队选择 Golang 而不是 Rust 作为他们的 Krater 桌面应用程序&#xff0c;因为 Golang 中更容易进行内存管理、类型安全和 ORM 支持。 使用 Rust 和 Tauri 时面临的一些挑战包括&#xff1a; 难以理解 Rust 的所有权和借用规则、其严格的类型安全有时会限制开发速…...

问题复盘|MySQL 数据记录中明明有值,使用 concat() 后得到的却一直是 null

背景 MySQL 的数据数据记录中明明有值&#xff0c;在使用 concat() 查询时却一直得到 null SELECT CONCAT(first_name, , last_name) FROM users;排查后发现 MySQL 的 concat 函数拼接规则是 当多个拼接的字段的字段值中存在 null 时&#xff0c;返回的一定是 null 解决方…...

正点原子嵌入式linux驱动开发——Linux IIO驱动

工业场合里面也有大量的模拟量和数字量之间的转换&#xff0c;也就是常说的ADC和DAC。而且随着手机、物联网、工业物联网和可穿戴设备的爆发&#xff0c;传感器的需求只持续增强。比如手机或者手环里面的加速度计、光传感器、陀螺仪、气压计、磁力计等&#xff0c;这些传感器本…...

利用角色roles上线wordpress项目

角色订制&#xff1a;roles ① 简介 对于以上所有的方式有个弊端就是无法实现复用假设在同时部署Web、db、ha 时或不同服务器组合不同的应用就需要写多个yml文件。很难实现灵活的调用。   roles 用于层次性、结构化地组织playbook。roles 能够根据层次型结构自动装载变量文…...

4.0 Linux进程前导知识

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 冯.诺依曼体系 CPU&#xff1a;运算器&#xff0c;控制器 输入设备&#xff1a;键盘&#xff0c;麦克风&#xff0c;摄像头&#xff0c;鼠标&#xff0c;网卡&#xff0c;磁盘等。 输出设备&#xff1a;显示器&#xff0…...

OpenClaw+千问3.5-35B-A3B-FP8:24/7自动化内容审核方案

OpenClaw千问3.5-35B-A3B-FP8&#xff1a;24/7自动化内容审核方案 1. 为什么需要个人级内容审核方案 去年运营技术社区时&#xff0c;我每天要处理上百条用户生成内容。凌晨三点被举报消息吵醒的经历&#xff0c;让我开始寻找能替代人工初审的自动化方案。市面上的SaaS审核服…...

高并发场景下的订单和库存处理方案

前言之前一直有小伙伴私信我问我高并发场景下的订单和库存处理方案&#xff0c;我最近也是因为加班的原因比较忙&#xff0c;就一直没来得及回复。今天好不容易闲了下来想了想不如写篇文章把这些都列出来的&#xff0c;让大家都能学习到&#xff0c;说一千道一万都不如满满的干…...

电力设施智能检测:TTPLA数据集赋能电网巡检自动化全流程指南

电力设施智能检测&#xff1a;TTPLA数据集赋能电网巡检自动化全流程指南 【免费下载链接】ttpla_dataset aerial images dataset on transmission towers and power lines 项目地址: https://gitcode.com/gh_mirrors/tt/ttpla_dataset 在电力行业数字化转型进程中&…...

实现鼠标滚轮在容器滚动到底部后无缝过渡到页面滚动

本文介绍如何通过 javascript 检测固定高度溢出容器的滚动边界&#xff0c;在用户滚至底部时立即触发页面滚动&#xff0c;消除原生行为中约1秒的延迟等待&#xff0c;实现平滑、无中断的滚动接力。 本文介绍如何通过 javascript 检测固定高度溢出容器的滚动边界&#xff…...

多模态探索:OpenClaw+Qwen3-4B分析截图中的文字与图表数据

多模态探索&#xff1a;OpenClawQwen3-4B分析截图中的文字与图表数据 1. 为什么需要自动化处理截图数据 作为一名经常需要处理学术论文的研究者&#xff0c;我长期被一个问题困扰&#xff1a;当阅读PDF论文时&#xff0c;遇到有价值的图表数据&#xff0c;传统方法只能手动录…...

Android ImageButton进阶实战:从基础到自定义状态与交互优化

1. ImageButton基础与核心属性解析 第一次接触ImageButton时&#xff0c;很多人会疑惑它和普通Button有什么区别。简单来说&#xff0c;Button是文字按钮&#xff0c;而ImageButton是用图片作为视觉元素的交互控件。在实际项目中&#xff0c;我发现90%的图标点击场景都应该使用…...

别再怕环路!手把手教你用锐捷RG-IS2700G交换机配置ERPS环网(附完整命令)

锐捷RG-IS2700G交换机ERPS环网实战&#xff1a;从零搭建高可靠企业网络 第一次接手企业园区网核心交换机的运维工作时&#xff0c;看到拓扑图上那个醒目的环形结构&#xff0c;我的手指在键盘上方悬停了整整十分钟——毕竟谁都不想成为"那个让全公司断网的新人"。直到…...

FinalBurn Neo:让经典街机游戏在现代设备上完美重生

FinalBurn Neo&#xff1a;让经典街机游戏在现代设备上完美重生 【免费下载链接】FBNeo FinalBurn Neo - We are Team FBNeo. 项目地址: https://gitcode.com/gh_mirrors/fb/FBNeo FinalBurn Neo是一款专注于经典街机游戏的开源模拟器&#xff0c;它基于FinalBurn和早期…...

如何选用激光测距用晶振来提升精度?

在选择激光测距用晶振时&#xff0c;需考虑频率稳定性、封装尺寸和应用环境。陶瓷晶振以其优越的频率稳定性特点&#xff0c;特别适合用于高精度测距任务。其在温度变化和外部干扰下仍能保证准确的输出&#xff0c;从而提升测量结果的可靠性。同时&#xff0c;贴片声表晶振凭借…...

GCP 成本优化指南

5 分钟速览 我想… 用什么 预期效果 看钱花在哪了 Billing Reports + Cost Table 按服务/项目/标签拆分费用 费用超了自动告警 Budget Alerts 50%/80%/100% 阈值通知 深度分析费用趋势 BigQuery 费用导出 自定义 SQL 分析任意维度 降低计算成本 CUD / Spot VM 计算费用降 30%-7…...