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

自动化生成与更新 Changelog 文件

在软件开发中,保持 Changelog 文件的更新是一项至关重要的任务。

Changelog 文件记录了项目的每一个重要变更,包括新功能、修复的问题以及任何可能破坏现有功能的变更。对于维护者、贡献者和最终用户来说,这都是一个宝贵的资源。然而,手动维护 Changelog 文件既耗时又容易出错。我们可以利用 Git 和 Bash 脚本来自动化这一过程。

为什么需要自动化的 Changelog

  • 节省时间:自动化工具可以快速从 Git 提交历史中提取相关信息,并生成格式化的 Changelog。
  • 减少错误:手动编辑 Changelog 时容易遗漏或错误地记录某些变更。自动化工具可以确保所有相关提交都被正确记录。
  • 保持一致性:自动化的 Changelog 生成工具可以确保每次发布的 Changelog 都遵循相同的格式和约定。

如何自动化生成和更新 Changelog

下面是一个基于 Bash 脚本的自动化 Changelog 生成和更新方案的详细步骤:

1. 定义 Changelog 的格式

首先,你需要确定 Changelog 的格式。一个常见的格式包括版本号、发布日期、以及一个或多个包含具体变更的列表。例如:

## [1.2.0] - 2023-04-01### Added
- 新功能:支持多用户登录。### Fixed
- 修复了登录时的认证问题。
- 修正了用户资料页面的显示错误。

2. 编写 Bash 脚本

接下来,你可以编写一个 Bash 脚本来自动化地生成和更新 Changelog。这个脚本将执行以下任务:

  • 确定当前版本号和下一个版本号的 Git 标签。
  • 使用 Git 提交历史来查找两个标签之间的所有相关提交(例如,包含 “feat:” 或 “fix:” 前缀的提交)。
  • 将这些提交格式化为 Changelog 条目,并插入到指定的 Changelog 文件中。

以下是一个 Bash 脚本示例:

#!/bin/bash -e  # 脚本所在的顶层目录  
toplevel="$(dirname "$(readlink -f "$0")")/.."  
cd "$toplevel" || exit 1  # 获取当前版本标签及其对应的提交  
CURRENT_TAG_NAME=$(git describe --abbrev=0 --tags)  
CURRENT_TAG_COMMIT=$(git rev-parse "$CURRENT_TAG_NAME")  # 尝试找到下一个版本标签的提交(这里简化了逻辑,假设存在且直接获取下一个)  
NEXT_TAG_NAMES=$(git tag --sort=-version:refname | grep -Eo 'v[0-9]+\.[0-9]+\.[0-9]+(-[a-z]+\.[0-9]+)?' | grep -vE "^$CURRENT_TAG_NAME$" | head -n 1)  
if [ -n "$NEXT_TAG_NAMES" ]; then  NEXT_TAG_COMMIT=$(git rev-parse "$NEXT_TAG_NAMES")  
else  echo "No next tag found. Exiting."  exit 1  
fi  # 提取版本号  
VERSION_NUM="${CURRENT_TAG_NAME#v}"  # 检查指定的 Changelog 文件是否已经包含当前版本号  
if grep -q "^## [$VERSION_NUM] " "$1"; then  echo "Version $VERSION_NUM already in Changelog. Exiting."  exit 0  
fi  # 临时 Changelog 文件  
TMP_CHANGELOG="/tmp/${VERSION_NUM}_changelog.tmp"  # 函数:为给定路径生成 Changelog 片段  
generate_changelog_for_path() {  local path="$1"  local sha1=$(git ls-tree "$CURRENT_TAG_COMMIT" "$path" | awk '/blob/ {print $3}')  local sha2=$(git ls-tree "$NEXT_TAG_COMMIT" "$path" | awk '/blob/ {print $3}')  if [ "$sha1" != "$sha2" ]; then  echo "## [$VERSION_NUM] - $path" >> "$TMP_CHANGELOG"  git log --oneline --format="  * %s" "$sha1...$sha2" -- "$path" | grep -E '^(fix:|feat:)' >> "$TMP_CHANGELOG"  echo >> "$TMP_CHANGELOG"  fi  
}  # 为主仓库生成 Changelog 片段(空路径表示根仓库)  
generate_changelog_for_path ""  # 为每个子模块生成 Changelog 片段  
git submodule foreach --quiet 'bash -c "$(declare -f generate_changelog_for_path); path=\"\$sm_path\"; generate_changelog_for_path \"\$path\""'  # 将生成的 Changelog 插入到指定的文件中  
if [ -s "$TMP_CHANGELOG" ]; then  # 在 Changelog 文件的指定位置(例如,开头)插入内容  # 这里假设在文件开头插入,你可以根据需要调整 sed 命令  sed -i "1i\\$(cat $TMP_CHANGELOG)" "$1"  # 或者,如果你想要在某个特定的标记(如 "## [Unreleased]")之后插入  # sed -i "/^## [Unreleased]$/r $TMP_CHANGELOG" "$1"  
else  echo "No changes found between $CURRENT_TAG_NAME and $NEXT_TAG_NAMES."  
fi  # 清理临时文件  
rm -f "$TMP_CHANGELOG"  echo "Changelog for $VERSION_NUM has been updated."

3. 集成到 CI/CD 流程

将 Changelog 生成脚本集成到 CI/CD 流程中。这样,每当有新版本发布时,CI/CD 系统都会自动运行该脚本,并更新 Changelog 文件。

4. 注意事项

  • 确保 Git 仓库是干净的:在生成 Changelog 之前,确保所有的提交都已经推送到远程仓库,并且没有未提交的更改。
  • 测试脚本:在正式使用之前,在测试环境中测试脚本,以确保它按预期工作。
  • 处理子模块:如果你的项目包含 Git 子模块,请确保你的脚本能够正确处理这些子模块的 Changelog。

相关文章:

自动化生成与更新 Changelog 文件

在软件开发中,保持 Changelog 文件的更新是一项至关重要的任务。 Changelog 文件记录了项目的每一个重要变更,包括新功能、修复的问题以及任何可能破坏现有功能的变更。对于维护者、贡献者和最终用户来说,这都是一个宝贵的资源。然而&#x…...

(六)WebAPI方法的调用

1.WebAPI中定义的GET、POST方法 [HttpGet(Name "GetWeatherForecast")]public IEnumerable<WeatherForecast> Get(){return Enumerable.Range(1, 5).Select(index > new WeatherForecast{Date DateTime.Now.AddDays(index),TemperatureC Random.Shared.N…...

运维工程师面试整理-故障排查常见故障的排查步骤及方法

故障排查是运维工程师的重要技能之一。在面试中,面试官通常会通过故障排查相关的问题来评估你解决问题的能力和系统思维。以下是关于常见故障的排查步骤及方法的详细内容,帮助你更好地准备面试。 1. 故障排查的基本步骤 1. 问题识别 a. 描述问题:明确问题的具体表现...

OpenAI o1解决了「Quiet-STaR」的挑战吗?

随着OpenAI o1近期的发布&#xff0c;业界讨论o1关联论文最多之一可能是早前这篇斯坦福大学和Notbad AI Inc的研究人员开发的Quiet-STaR&#xff0c;即让AI学会先安静的“思考”再“说话” &#xff0c;回想自己一年前对于这一领域的思考和探索&#xff0c;当初也将这篇论文进行…...

PDF产品册营销推广利器FLBOOK

在互联网高速发展的时代&#xff0c;营销推广已成为企业拓展市场的重要手段。而一款优秀的营销工具&#xff0c;可以为企业带来事半功倍的推广效果。今天&#xff0c;就为大家介绍一款集创意与实用于一体的PDF产品册营销推广利器——FLBOOK&#xff0c;帮助企业轻松提升品牌影响…...

华为OD机试 - 字符串划分(Python/JS/C/C++ 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…...

nginx和php-fpm连接超时的相关配置以及Nginx中的try_files以及root、alias的使用

一、nginx和php-fpm连接超时的相关配置 线上的PHP服务器架构大都是nginx proxy->nginx web->php-fpm。在服务器运行正常&#xff0c;服务器之间的连接正常&#xff0c;未被防火墙阻止的情况下&#xff0c;对这种架构排查504报错时需要注意以下几个地方的参数。 1是nginx…...

在MAC中Ollama开放其他电脑访问

ollama安装完毕后默认只能在本地访问&#xff0c;之前我都是安装其他的软件之后可以结合开放其他端口访问&#xff0c;其实是可以新增或修改下电脑的系统配置&#xff0c;就可以打开端口允许除本机IP或localhost访问。 步骤如下&#xff1a; 1、查看端口&#xff08;默认是&…...

NE555芯片制作的节拍器

NE555芯片的节拍器&#xff0c;以一定的频率发出声音和闪烁灯光&#xff0c;起到节拍指示的作用。...

如何使用 Next.js 进行服务端渲染(Server-Side Rendering, SSR)

文章目录 前言步骤 1: 创建 Next.js 应用步骤 2: 创建页面组件示例页面组件 步骤 3: 自定义 _app.js 文件步骤 4: 自定义 _document.js 文件步骤 5: 运行应用步骤 6: 构建和部署总结 前言 Next.js 本身就支持 SSR 并提供了一系列内置的方法来简化这个过程。下面将详细介绍如何使…...

【machine learning-八-可视化loss funciton】

可视化lossfunction loss funciton可视化损失函数等高图 loss funciton 上一节讲过损失函数&#xff0c;也就是代价函数&#xff0c;它是衡量模型训练好坏的指标&#xff0c;对于线性回归来说&#xff0c;模型、参数、损失函数以及目标如下&#xff1a;、 损失函数的目标当然…...

Android 将EasyPermissions进一步封装,使得动态权限申请更加简明

1.引入依赖: implementation pub.devrel:easypermissions:3.0.0 2.在BaseActivity处理统一的结果回调和请求Code 核心内容: (1)处理Activity本身继承的方法onRequestPermissionsResult (2)实现接口EasyPermissions.PermissionCallbacks来接收请求结果 (3)定义申请权…...

我的AI工具箱Tauri版-VideoReapeat视频解说复述克隆

本教程基于自研的AI工具箱Tauri版进行VideoReapeat视频解说复述克隆。 VideoReapeat视频解说复述克隆 是自研的AI工具箱Tauri版中的一款专用模块&#xff0c;旨在通过AI技术对视频解说内容进行复述和克隆。该工具可自动洗稿并重新生成视频解说&#xff0c;通过简单配置即可对大…...

MySQL5.7.42高可用MHA搭建及故障切换演示

系列文章目录 rpmbuild构建mysql5.7RPM安装包 MySQL基于GTID同步模式搭建主从复制 文章目录 系列文章目录前言一、MHA架构介绍1.MHA的功能2.MHA组成3.MHA故障转移过程4.MHA架构优缺点 二、环境准备1.服务器免密2.基于GTID主从复制搭建3.下载mha组件 三、MHA组件安装1.安装依赖…...

快速搭建最简单的前端项目vue+View UI Plus

1 引言 ‌‌Vue是一套用于构建Web前端界面的渐进式JavaScript框架。‌‌它以其易学易用、性能出色、灵活多变而深受开发者喜爱&#xff0c;并且与其他前端框架&#xff08;如‌React和‌Angular&#xff09;相比&#xff0c;在国内市场上受到了广泛的认可和使用。点击进入官方…...

倍增练习(1)

A - ST 表 && RMQ 问题 题目思路:st表的板子题用于静态区间求最值,通过倍增的思想,先通过预处理将各个区间的最大值通过转移式求出f[i][j] max(f[i][j - 1], f[i (1 << (j - 1))][j - 1]);然后再进行重叠查询查询,k log2(r - l 1);,max(f[l][k], f[r - (1 &l…...

MATLAB 在数学建模中的深入应用:从基础到高级实践

目录 前言 一、MATLAB基础知识 1.1 MATLAB工作环境简介 1.1.1 命令窗口&#xff08;Command Window&#xff09; 1.1.2 工作区&#xff08;Workspace&#xff09; 1.1.3 命令历史&#xff08;Command History&#xff09; 1.1.4 编辑器&#xff08;Editor&#xff09; 1…...

Unity 设计模式 之 【什么是设计模式】/ 【为什么要使用设计模式】/ 【架构和设计模式的区别】

Unity 设计模式 之 【什么是设计模式】/ 【为什么要使用设计模式】/ 【架构和设计模式的区别】 目录 Unity 设计模式 之 【什么是设计模式】/ 【为什么要使用设计模式】/ 【架构和设计模式的区别】 一、简单介绍 二、 Unity 设计模式 1、Unity 开发中使用设计模式的特点 2…...

[数据集][目标检测]智慧交通铁路异物入侵检测数据集VOC+YOLO格式802张7类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;802 标注数量(xml文件个数)&#xff1a;802 标注数量(txt文件个数)&#xff1a;802 标注类别…...

飞驰云联FTP替代方案:安全高效文件传输的新选择

FTP协议广泛应用各行业的文件传输场景中&#xff0c;由于FTP应用获取门槛低、使用普遍&#xff0c;因此大部分企业都习惯使用FTP进行文件传输。然而面临激增的数据量和网络安全威胁的不断演变&#xff0c;FTP在传输安全性与传输性能上有所欠缺&#xff0c;无法满足企业现在的高…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式&#xff0c;避免服务器受到各种恶意攻击和网络威胁&#xff0c;那么&#xff0c;服务器硬防通常都会应用在哪些场景当中呢&#xff1f; 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 &#xff08;一&#xff09;引用计数法 &#xff08;二&#xff09;可达性分析算法 二、垃圾回收算法 &#xff08;一&#xff09;标记清除 &#xff08;二&#xff09;标记整理 &#xff08;三&#xff09;复制 &#xff08;四&#xff…...