PHP项目变更日志如何自动提取提交记录生成

wen PHP项目 31

PHP项目变更日志自动提取提交记录生成全指南

目录导读

  1. 为什么需要自动生成变更日志?
  2. Git提交规范是自动化的基石
  3. 主流自动提取工具对比与选型
  4. 实战:使用conventional-changelog集成PHP项目
  5. 高级定制:按版本与模块自动分类
  6. CI/CD流水线中嵌入自动生成
  7. 常见问题与避坑指南(FAQ)

为什么需要自动生成变更日志?

在PHP项目开发中,每次版本迭代都可能涉及数十甚至上百次Git提交,手动记录“新增功能”“修复Bug”“性能优化”等变更,不仅耗时且极易遗漏,更重要的是,传统手动维护的CHANGELOG.md往往存在以下痛点:

PHP项目变更日志如何自动提取提交记录生成

  • 信息碎片化:开发者提交时随意写“fix bug”“update”,导致日志无法追溯具体改动
  • 版本对齐困难:无法自动按照tag版本号生成结构化的“新增/修复/变更”分类
  • 协作低效:团队成员需要频繁口头沟通“这个版本改了什么”
  • 审计缺失:生产环境出现问题后,无法快速定位是哪个提交引入了问题

自动提取方案的核心价值在于:只要团队遵循统一的提交规范(如Conventional Commits),就可以通过脚本或CI工具,将每次git log中的结构化信息自动解析、分类、去重,最终生成格式统一、版本清晰的CHANGELOG文件,这不仅节省人工时间,还能确保文档与代码变更始终保持同步。


Git提交规范是自动化的基石

无论是使用哪种工具,自动提取的前提都是提交信息结构化,目前业界通用的标准是约定式提交,其基本格式如下:

<type>(<scope>): <subject>
<body>
<footer>

常见的type类型(直接关系到后续日志分类):

  • feat:新功能(对应CHANGELOG中的Features)
  • fix:Bug修复(对应CHANGELOG中的Bug Fixes)
  • docs:文档变更
  • style:代码格式调整(不影响逻辑)
  • refactor:代码重构(既非新增也非修复)
  • perf:性能优化
  • test:测试相关
  • chore:构建过程或辅助工具变动

示例

feat(用户模块): 增加邮箱验证功能
实现了用户注册后邮箱验证的逻辑,支持SMTP发信。
Closes #235

如果团队尚未采用该规范,建议通过Git hook(如commit-msg钩子)强制校验提交格式,可使用工具如commitlint来约束。


主流自动提取工具对比与选型

针对PHP项目,目前社区常用的自动生成工具主要有以下几类:

工具名称 语言/依赖 核心特点 适合场景
conventional-changelog-cli Node.js 支持Conventional Commits,可自定义配置,生成markdown 通用场景,PHP项目也可集成
semantic-release Node.js 全自动版本管理和发布,包含changelog CI/CD一体化
auto-changelog Node.js 轻量级,仅生成日志 小型项目快速起步
github-changelog-generator Ruby 集成GitHub Issues/PR 托管于GitHub的项目
git log + 自定义脚本 PHP (shell_exec) 完全自主可控 追求极致定制

推荐方案:对于PHP项目,优先推荐conventional-changelog-cli,虽然它是Node.js写成的,但通过npm全局安装,可以在任何PHP项目的Git根目录下直接运行,它支持:

  • 根据Git tag自动划分版本段
  • 自动识别featfixbreaking changes等类别
  • 输出格式可自定义
  • 可配合standard-version实现版本号升级+日志生成一步到位

实战:使用conventional-changelog集成PHP项目

安装必要工具

如果你的开发环境已安装Node.js,直接全局安装:

npm install -g conventional-changelog-cli

创建基础配置文件

在项目根目录创建package.json(即使项目本身是PHP,也可以添加这个用于配置):

{
  "scripts": {
    "changelog": "conventional-changelog -p angular -i CHANGELOG.md -s -r 0"
  }
}

参数说明:

  • -p angular:采用Angular推荐的提交规范
  • -i CHANGELOG.md:输出文件
  • -s:增量写入(追加新版本内容)
  • -r 0:从第一个版本开始生成,-r 1表示从最新版本生成

首次生成

确保项目已经有Git tag(例如v1.0.0),如果没有,先打一个tag:

git tag v1.0.0
git push --tags

然后运行:

npm run changelog

你会看到CHANGELOG.md生成如下结构:

# Changelog
## [1.0.0] - 2025-06-15
### Features
- 用户模块:增加邮箱验证功能
- 支付模块:支持微信支付回调
### Bug Fixes
- 修复登录页面CSRF token失效问题
- 修复PHP8.2中弃用函数的兼容性

版本更新时的自动化生成

当发布新版本时,使用standard-version可以自动打tag并更新CHANGELOG:

npm install -g standard-version
# 执行后会自动分析提交,升级版本号,生成日志,打tag
standard-version

高级定制:按版本与模块自动分类

1 自定义分类映射

默认工具将type直接映射为英文标签(Features/Bug Fixes),如果希望输出中文或自定义名称,可以在package.json增加配置:

{
  "conventional-changelog": {
    "preset": "angular",
    "releaseCommitMessageFormat": "chore(release): {{currentTag}}",
    "writerOpts": {
      "transform": {
        "feat": "✨ 新功能",
        "fix": "🐛 修复",
        "perf": "⚡ 性能优化",
        "refactor": "♻️ 重构",
        "docs": "📝 文档"
      }
    }
  }
}

2 排除非业务提交

如果提交中包含大量chorestyle类型,可以在脚本中过滤:

conventional-changelog -p angular -i CHANGELOG.md -s -r 1 --skip-unstable

3 与PHP代码结合

由于项目本身是PHP,也可以编写一个PHP脚本来执行生成命令,适合在Laravel或Symfony的artisan命令中使用:

<?php
// app/Console/Commands/GenerateChangelog.php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Symfony\Component\Process\Process;
class GenerateChangelog extends Command
{
    protected $signature = 'changelog:generate';
    protected $description = '自动从Git提交生成变更日志';
    public function handle()
    {
        $process = new Process(['npx', 'conventional-changelog', '-p', 'angular', '-i', 'CHANGELOG.md', '-s', '-r', '1']);
        $process->setWorkingDirectory(base_path());
        $process->run();
        if ($process->isSuccessful()) {
            $this->info('变更日志已更新!');
        } else {
            $this->error($process->getErrorOutput());
        }
    }
}

CI/CD流水线中嵌入自动生成

为了确保每次合并到主分支或发布时自动更新CHANGELOG,可以将其整合到CI流程(以GitLab CI为例):

# .gitlab-ci.yml
stages:
  - changelog
  - release
generate-changelog:
  stage: changelog
  only:
    - main
  before_script:
    - npm install -g conventional-changelog-cli
  script:
    - git checkout main
    - conventional-changelog -p angular -i CHANGELOG.md -s -r 1
    - git config user.email "ci@example.com"
    - git config user.name "CI Bot"
    - git add CHANGELOG.md
    - git commit -m "docs(changelog): update CHANGELOG.md"
    - git push origin main

注意:需要为CI配置访问仓库的SSH密钥或Personal Access Token。


常见问题与避坑指南(FAQ)

Q1:我确保提交都是feat/fix格式,但工具却没有正确分类?

A:检查提交信息中是否包含BREAKING CHANGE标记,如果提交中有这个标记,它会自动归入“BREAKING CHANGES”类别,请确认提交的标题行严格遵循type(scope): subject格式,不要有空格或标点异常。

Q2:生成的CHANGELOG.md包含了所有历史提交,内容太长怎么办?

A:在生成时加上-r 1参数(只处理最新的一个版本),或者使用--output-unreleased只输出未发布的内容,对于已有大量历史记录,建议从头开始规范提交,然后只保留最新几个版本的日志。

Q3:PHP项目中没有Node.js环境怎么办?

A:有两种方案:1)在CI/CD环境中预装Node.js;2)使用纯PHP的替代工具,如php-changelog-generator(基于git log解析,但功能较弱),推荐第一种,因为conventional-changelog的生态更成熟。

Q4:如何确保每个版本只显示必要的提交,而不出现重复?

A:核心是正确打Git tag,工具会依据git tag来划分版本区间,如果两个tag之间没有提交,则不会生成新版本条目,建议每次发布前先合并代码,然后打一个语义化版本tag(如v2.1.0)。

Q5:自动生成的日志如何与Jira/禅道等项目管理工具关联?

A:可以在提交信息中使用JIRA-123#issue引用,然后在CHANGELOG模板中通过自定义配置保留这些编号,后续可以在生成后手动增加链接前缀,或者在CI脚本中通过sed正则替换来实现超链接化。


通过上述方法,PHP项目团队可以彻底告别手动整理变更日志的繁琐工作,核心在于三个闭环:规范提交 → 自动化解析 → 持续集成,一旦跑通,每次版本发布,CHANGELOG将自动与代码变更保持精确同步,让项目可追溯性达到全新水平。

抱歉,评论功能暂时关闭!