自动化生成与更新 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。

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

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

相关文章

Flutter为Android添加签名并打包

前言 我们需要将App进行数字签名才能发布到商店里。在这里就具体描述一下如果给App添加签名 为App签名 创建一个用户上传的秘钥库 如果你已经有一个秘钥库了,可以直接跳到下一步,如果没有则按照下面的指令创建一个 keytool 可能不在我们的系统路径中…

MySQL多版本并发控制MVCC实现原理

MVCC MVCC 是多版本并发控制方法,用来解决读和写之间的冲突,比如脏读、不可重复读问题,MVCC主要针对读操作做限制,保证每次读取到的数据都是本次读取之前的已经提交事务所修改的。 概述 当一个事务要对数据库中的数据进行selec…

嵌入式开发中学习C++的用处?

这个问题一直有同学在问,其实从我的角度是一定是需要学的,最直接的就是你面试大厂的嵌入式岗位或者相关岗位,最后一定会问c,而很多人是不会的,这就是最大的用处,至于从技术角度考量倒是其次,因为…

【初阶数据结构】详解二叉树 - 树和二叉树(三)(递归的魅力时刻)

文章目录 前言1. 二叉树链式结构的意义2. 手搓一棵二叉树3. 二叉树的遍历(重要)3.1 遍历的规则3.2 先序遍历3.3 中序遍历3.4 后序遍历3.5 遍历的代码实现3.5.1 先序遍历代码实现3.5.2 中序遍历代码实现3.5.3 后序遍历代码实现 4. 统计二叉树结点的个数5.…

微服务注册中⼼2

5.Nacos配置管理 Nacos除了可以做注册中⼼,同样可以做配置管理来使⽤ 5.1 统⼀配置管理 当微服务部署的实例越来越多,达到数⼗、数百时,逐个修改微服务配置就会让⼈抓狂,⽽且很容易出错。我们需要⼀种统⼀配置管理⽅案&#xf…

Java.反射

目录 1.获取class 的三种方式 2.利用反射获取构造方法 3.利用反射获取成员变量 4.利用反射获取成员方法 1.获取class 的三种方式 全类名怎么找? 全类名报名+类名 package MyReflect;public class Student {private String id;private String name;private int…

MySQL基础篇(黑马程序员2022-01-18)

1 MySQL数据库概述 1.1 MySQL数据库的下载,安装,启动停止 1.2 数据模型 (1)关系型数据库(RDBMS) 概念:建立在关系模型基础上,由多张相互连接的二维表组成的数据库。 特点: A. 使用表存储数据,格式统一,便于维护。…

十一、SOA(SOA的具体设计模式)

我们现在深入学习SOA的具体设计模式。SOA架构中的设计模式主要是指导服务如何设计、实现、部署和管理,确保服务的松耦合、高可用性、扩展性和复用性。SOA常见的设计模式可以分为以下几类: 1. 服务层次设计模式 1.1. 基础服务(Fundamental S…

Centos中dnf和yum区别对比

dnf和yum是两种不同的包管理工具,它们各自具有独特的特点和优势,主要用于在Linux系统上安装、更新和卸载软件包。以下是dnf和yum之间的主要区别: 1. 依赖关系解决 dnf:dnf在处理依赖关系方面表现出更强的能力。它能够更高效地解…

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-25

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-25 1. PromSec: Prompt Optimization for Secure Generation of Functional Source Code with Large Language Models (LLMs) M Nazzal, I Khalil, A Khreishah, NH Phan - arXiv preprint arXiv:2409.12699, 2…

Python--操作列表

1.for循环 1.1 for循环的基本语法 for variable in iterable: # 执行循环体 # 这里可以是任何有效的Python代码块这里的variable是一个变量名,用于在每次循环迭代时临时存储iterable中的下一个元素。 iterable是一个可迭代对象,比如列表(…

URI和URL的区别

1: 将 URI 转换为 URL import java.net.URI; import java.net.URL;public class UriToUrlExample {public static void main(String[] args) {// 创建一个 URI 对象URI uri = new URI("http://example.com/path/to/resource");// 将 URI 转换为 URLtry {URL url = u…

C语言中易混淆概念的关键字

最快的关键字---- register register: 这个关键字请求编译器尽可能的将变量存在 CPU 内部寄存器中而不是通过内 存寻址访问以提高效率。注意是尽可能,不是绝对。你想想,一个 CPU 的寄存器也就那么 几个或几十个,你要是定义了很多很…

Python_list去重复值remove_duplicates

在 Python 中可以使用多种方法去除列表中的重复元素。 方法一:使用集合(set) 集合是无序的、不包含重复元素的数据结构。可以先将列表转换为集合,然后再转换回列表。 my_list [1, 2, 3, 2, 4, 1, 5] unique_list list(set(my…

变电站设备检测系统源码分享

变电站设备检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer V…

大模型如何赋能智慧城市新发展?

国家数据局近期发布的《数字中国发展报告(2023)》显示,我国数据要素市场化改革步伐进一步加快,数字经济规模持续壮大,数字技术应用场景不断拓展。这一成就的背后是数字技术广泛应用,数字技术不仅影响着老百…

移动硬盘突然打不开:深度剖析、恢复策略与预防措施

突发困境:移动硬盘的沉默拒绝 在日常的数字生活中,移动硬盘作为数据存储与传输的重要工具,扮演着不可或缺的角色。然而,当您急需访问存储在移动硬盘中的重要文件时,却遭遇了“突然打不开”的尴尬境地,这无…

软件无线电3-微相E316和HackRF实现FM调制解调

前面介绍了基于Matlab、矢量信号器和HackRF One实现射频下的FM调制解调,今天分享的内容是用微相E316替代矢量信号器完成发射工作。注意本文仅用于科研和学习,私自搭建电台属于违法行为。 1.概述 微相E316和HackRF One实现FM调制解调测试框图如1所示&am…

Excel 设置自动换行

背景 版本:office 专业版 11.0 表格内输入长信息,发现默认状态时未自动换行的,找了很久设置按钮,遂总结成经验帖。 操作 1)选中需设置的单元格/区域/行/列。 2)点击【开始】下【对齐方式】中的【自动换…

教授(优青)团队一站式指导:专业实验设计、数据分析、SCI论文辅助。基因表达分析、转录因子、组蛋白、染色质、DNA等高通量检测及基因功能分析

可高通量检测组蛋白不同修饰在基因组上的位点; 可用于模式物种和非模式物种的研究,无需特异性抗体; 完整的DAP-seq解决方案。 DAP-seq可高通量检测转录因子或DNA结合蛋白在基因组上的结合位点; 可用于模式物种和非模式物种的研究,无需特异性抗体; 完整的…