需求:实现GitHub Action检查文件变更,强制PR修改指定文件以通过CI
如何用GitHub Action强制PR中必须修改变更日志文件
以下是实现该需求的具体方案,直接在你的仓库中添加一个GitHub Action工作流即可:
1. 创建工作流文件
在仓库的.github/workflows目录下新建一个名为check-changelog.yml的文件,内容如下:
name: 检查变更日志是否修改 on: pull_request: types: [opened, synchronize, reopened] jobs: check-changelog: runs-on: ubuntu-latest steps: - name: 拉取代码 uses: actions/checkout@v4 with: fetch-depth: 0 # 必须拉取完整历史才能对比分支差异 - name: 检查CHANGELOG是否有变更 run: | # 对比PR目标分支与源分支的文件差异 CHANGED_FILES=$(git diff --name-only ${{ github.base_ref }} ${{ github.head_ref }}) # 检查是否包含指定的变更日志文件(这里以CHANGELOG.md为例,可自行修改) if ! echo "$CHANGED_FILES" | grep -q "^CHANGELOG.md$"; then echo "❌ 错误:PR必须修改CHANGELOG.md文件" exit 1 else echo "✅ 已检测到CHANGELOG.md文件的修改" fi
2. 关键配置说明
- 触发条件:工作流会在PR打开、同步(提交新代码)、重新打开时自动执行
- 分支差异对比:
fetch-depth: 0确保拉取完整的仓库历史,这样才能正确对比PR源分支和目标分支的文件差异 - 文件检查逻辑:通过
git diff获取所有变更的文件名,再用grep检查是否包含指定的变更日志文件。如果未检测到修改,工作流会返回非零状态码,导致CI校验失败
3. 自定义调整
如果你的变更日志文件路径或名称不同(比如docs/CHANGELOG.md或CHANGELOG.rst),只需修改grep命令中的匹配规则即可:
- 例如检查
docs/CHANGELOG.md:将grep -q "^CHANGELOG.md$"改为grep -q "^docs/CHANGELOG.md$" - 例如支持多种后缀:
grep -q "^CHANGELOG\."
4. 验证效果
提交一个未修改变更日志的PR,CI会直接失败并提示错误信息;修改变更日志后重新提交PR,CI会正常通过。
内容的提问来源于stack exchange,提问作者Alvaro Losada
相关产品推荐
相关产品推荐

