基于DotNetty实现自动发布 - 自动检测代码变化
前言
很抱歉没有实现上一篇的目标:一键发布,因为工作量超出了预期,本次只实现了 Git
代码变化检测
已完成的功能
- 解决方案的项目发现与配置
- 首次发布需要手动处理
- 自动检测代码变化并解析出待发布的文件
简要说明
只需要填写解决方案的
Git
仓储路径即可自动发现项目 (通过查找.csproj
文件实现)自动发现
Web
项目 (通过判断项目根目录是否包含Web.config
实现) PS: 只支持 .NET Framework需要配置
Web
项目的发布目录, 编译还需要手动执行首次发布需要手动执行, 然后保存此次发布对应的
Git
提交 ID后续发布,可以根据上次发布记录,自动解析出待待发布的文件
部分代码
发现解决方案
private static Solution DetectSolution(string gitRepoPath)
{
string[] solutionFilePaths = Directory.GetFiles(gitRepoPath, "*.sln", SearchOption.AllDirectories);
if (solutionFilePaths == null || solutionFilePaths.Length == 0)
{
throw new Exception("未找到解决方案");
}
string[] projectFilePaths = Directory.GetFiles(gitRepoPath, "*.csproj", SearchOption.AllDirectories);
if (projectFilePaths == null || projectFilePaths.Length == 0)
{
throw new Exception("未找到项目");
}
var solutionFilePath = solutionFilePaths[0];
var solutionDir = Path.GetDirectoryName(solutionFilePath);
var solutionName = Path.GetFileNameWithoutExtension(solutionFilePath);
var solution = new Solution
{
GitRepositoryPath = gitRepoPath,
SolutionDir = solutionDir!,
SolutionName = solutionName
};
foreach (var projectFilePath in projectFilePaths)
{
var projectDir = Path.GetDirectoryName(projectFilePath);
var projectName = Path.GetFileNameWithoutExtension(projectFilePath);
var webConfigFiles = Directory.GetFiles(projectDir!, "web.config", SearchOption.TopDirectoryOnly);
var project = new Project
{
ProjectDir = projectDir!,
ProjectName = projectName,
IsWeb = webConfigFiles != null && webConfigFiles.Length > 0,
SolutionName = solutionName,
ReleaseDir = string.Empty
};
solution.Projects.Add(project);
}
return solution;
}
获取自上次发布以来的改动
public static List<PatchEntryChanges> GetChangesSinceLastPublish(string repoPath, string? lastCommitId = null)
{
var repo = GetRepo(repoPath);
//获取上次发布的提交
Commit? lastCommit = null;
if (!string.IsNullOrEmpty(lastCommitId))
{
lastCommit = repo.Lookup<Commit>(lastCommitId);
if (lastCommit == null)
{
throw new Exception("无法获取上次发布的提交记录");
}
}
//获取自上次提交以来的改动
var diff = repo.Diff.Compare<Patch>(lastCommit?.Tree, DiffTargets.Index);
return [.. diff];
}
从 Git 修改记录提取出待发布文件
private List<DeployFileInfo> GetPublishFiles(IEnumerable<string> changedFilePaths)
{
var fileInfos = new List<DeployFileInfo>(changedFilePaths.Count());
foreach (string changedPath in changedFilePaths)
{
var fi = DeployFileInfo.Create(changedPath);
if (fi.IsUnKnown) continue;
fileInfos.Add(fi);
}
foreach (var fi in fileInfos)
{
fi.ChangedFileAbsolutePath = Path.Combine(GitRepositoryPath, fi.ChangedFileRelativePath);
//所属项目
var project = Projects
.Where(a => fi.ChangedFileRelativePath.Contains(a.ProjectName, StringComparison.OrdinalIgnoreCase))
.FirstOrDefault();
if (project == null) continue;
fi.ProjectName = project.ProjectName;
if (fi.IsDLL)
{
fi.FileName = $"{project.ProjectName}.dll";
fi.PublishFileRelativePath = $"bin\\{fi.FileName}";
}
else
{
fi.PublishFileRelativePath = fi.ChangedFileAbsolutePath.Replace(project.ProjectDir, "").TrimStart(Path.DirectorySeparatorChar);
}
fi.PublishFileAbsolutePath = Path.Combine(webProject!.ReleaseDir, fi.PublishFileRelativePath);
//Logger.Info(fi.ToJsonString(true));
}
//按照 PublishFileAbsolutePath 去重
return fileInfos.Distinct(new DeployFileInfoComparer()).ToList();
}
设置项目发布路径
private async Task OkSetProjectReleaseDir()
{
if (string.IsNullOrEmpty(ReleaseDir) || !Directory.Exists(ReleaseDir))
{
Growl.ClearGlobal();
Growl.ErrorGlobal("请正确设置项目发布路径");
return;
}
var solutionRepo = Program.AppHost.Services.GetRequiredService<SolutionRepository>();
await solutionRepo.UpdateProjectReleaseDir(Id, ReleaseDir);
setProjectReleaseDirDialog?.Close();
Growl.SuccessGlobal("操作成功");
}
总结
本篇主要实现了 Git
代码变化的自动检测
代码仓库
项目暂且就叫
OpenDeploy
吧
欢迎大家拍砖,Star
下一步
计划下一步,实现一键发布,把待发布的文件一次性打包通过 DotNetty
发送到服务器
基于DotNetty实现自动发布 - 自动检测代码变化的更多相关文章
- Tomcat 设置自动编译,自动发布,自动部署
Tomcat服务器 具有一个常用的功能: 即自动编译,自动发布,自动部署功能. 问题: 当我们第一次发布程序以后,我们增删改Servelt,Java,.xml等文件,都必须重启Tomcat,如果项目巨 ...
- 一键自动发布ipa(更新svn,拷贝资源,压缩资源,加密图片资源,加密数据文件,加密lua脚本,编译代码,ipa签名,上传ftp)
一键自动发布ipa(更新svn,拷贝资源,压缩资源,加密图片资源,加密数据文件,加密lua脚本,编译代码,ipa签名,上传ftp) 程序员的生活要一切自动化,更要幸福^_^. 转载请注明出处http: ...
- jenkins自动发布java代码
注:本文来源于<KaliArch> jenkins笔记 一.相关概念 1.1 Jenkins概念: Jenkins是一个功能强大的应用程序,允许持续集成和持续交付项目,无论用的是什么平台. ...
- Jenkins自动发布代码实战篇
Jenkins自动发布代码实战篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Jenkins服务器配置秘钥对并上传到Gitlab中 1>.在Jenkins后端生成秘钥 ...
- [ci] 基于1 上文实现拉取代码后能自动触发sonar-runner实现代码扫描评测,job1完成
基于1 上文实现拉取代码后能自动触发sonar-runner实现代码扫描评测,job1完成 添加sonar插件 SonarQube Plugin 配置: 系统设置à告知jenkins,sona ...
- CI/CD之Gitlab集成Jenkins多分支pipeline实现质量检测和自动发布
本次实施主要实现: 代码提交gitlab,自动触发Jenkins构建 gitlab发起Merge Request, 需要Jenkins检查通过才可以merge,实现代码review和质量管控 gitl ...
- Jekyll自动检测代码更新
Jekyll自动检测代码更新 jekyll是一个静态博客生成软件, 我们把代码放在一个仓库里, 只要远程代码更新, 我们就从把它拉到自己的服务器, 然后重新启动jekyll. cd /root/blo ...
- Knativa 基于流量的灰度发布和自动弹性实践
作者 | 李鹏(元毅) 来源 | Serverless 公众号 一.Knative Knative 提供了基于流量的自动扩缩容能力,可以根据应用的请求量,在高峰时自动扩容实例数:当请求量减少以后,自动 ...
- svn自动更新服务器最新代码
1.很简单打开dos界面 cd到svn exe目录下,运行 cd C:\Program Files\TortoiseSVN\bin --svn安装目录(作者使用时TortoiseSVN客户端,其 ...
- jenkins+maven+docker集成java发布(一)自动发布
JAVA项目持续集成发布 标签(空格分隔): java jenkins 微服务中持续集成自动发布是很重要的一个环节,将不同的模块应用自动部署到一台或者N台服务器中如果采用人工部署的方式不太现实 git ...
随机推荐
- 《高级程序员 面试攻略 》RabbitMQ 如何实现可靠性
RabbitMQ 提供了多种机制来实现消息传递的可靠性.下面是一些常见的方法: 1. 持久化消息:RabbitMQ 允许将消息标记为持久化,以确保即使在发生故障或重启后,消息也不会丢失.通过将消息的` ...
- CF939F Cutlet 题解
题意简述 有一个正反面都为 \(0\) 的卡片,每过 \(1\) 分朝下那一面的数值就会增加 \(1\),你可以在几个区间的时间内翻转卡片,求经过 \(2n\) 秒后能否让这个卡片的正反面的数都为 \ ...
- C++ LibCurl 库的使用方法
LibCurl是一个开源的免费的多协议数据传输开源库,该框架具备跨平台性,开源免费,并提供了包括HTTP.FTP.SMTP.POP3等协议的功能,使用libcurl可以方便地进行网络数据传输操作,如发 ...
- 《SQL与数据库基础》20. 主从复制
目录 主从复制 原理 搭建 主库配置 从库配置 测试 本文以 MySQL 为例 主从复制 主从复制是指将主数据库的 DDL 和 DML 操作通过二进制日志传到从库服务器中,然后在从库上对这些日志重新执 ...
- 如何调用api接口获取到商品数据
要调用API接口获取商品数据,需要进行以下步骤: 确定API接口 首先需要确定要使用的API接口,可以通过搜索引擎或者相关文档来查找适合的API接口.以淘宝开放平台为例,可以使用淘宝的商品信息查询AP ...
- RocketMQ 系列(三) 集成 SpringBoot
RocketMQ 系列(三) 集成 SpringBoot 前两篇文章介绍了 RocketMQ 基本概念与搭建,现在以它与 SpringBoot 的结合来介绍其基本的用法. RocketMQ系列(一) ...
- Tongweb远程调试
最近,在对项目进行国产化时,要求springboot项目容器换成tongweb.在部署中,有个问题一直无法在本地重现,搜了下网上资料,基本没法实现,所以我整理了下.注意,项目包代码必须与本地代码保持一 ...
- Destoon模板存放及调用规则
一.模板存放及调用规则 模板存放于系统 template 目录,template 目录下的一个目录例如 template/default/ 即为一套模板模板文件以 .htm 为扩展名,可直接存放于模板 ...
- [ARC143B] Counting Grids 题解
Counting Grids 题目大意 将 \(1\sim n^2\) 填入 \(n\times n\) 的网格 \(A\) 中,对于每个格子满足以下条件之一: 该列中存在大于它的数. 该行中存在小于 ...
- [ABC201D] Game in Momotetsu World 题解
Game in Momotetsu World 题目大意 在一个 \(n\times m\) 的网格中,存在红色和蓝色两种格子,红色格子用 - 表示,蓝色格子用 + 表示. 现在 Takahashi ...