GitHub Actions提交差异对比与指定路径批处理触发方案咨询
GitHub Actions工作流优化建议
需求描述
当main分支有推送,且指定路径(src/model/**/*.mdl、Code/tests/03-Impl/01_Unittest/**/*.tpt)的文件发生提交时,触发GitHub Actions工作流:对比当前提交与上一提交的差异并获取更新文件;若.mdl或.tpt文件有变更,则运行对应.tpt目录下的批处理文件。
原工作流脚本
on: push: branches: - main paths: - 'src/model/**/*.mdl' - 'Code/tests/03-Impl/01_Unittest/**/*.tpt' jobs: build: runs-on: self-hosted steps: - uses: actions/checkout@v2 - name: Run batch files for .tpt files shell: bash run: | shopt -s globstar base_path="code/tests/03-Impl/01_Unittest" # Fetch units based on directories under base_path units=("$base_path"/*) for unit_path in "${units[@]}"; do # Skip if not a directory if [ ! -d "$unit_path" ]; then continue fi # Check if the unit contains modified .tpt files modified_files=$(git diff --name-only HEAD~1 "$unit_path" | grep -E "\.tpt$") if [ -z "$modified_files" ]; then echo "Skipping unit: $unit_path" continue fi # Process batch files for batch_file in "$unit_path"/*.bat; do if [ -f "$batch_file" ]; then echo "Running batch file: $batch_file" cmd.exe /C start /b "$batch_file" fi done # Process modified .tpt files for file in $modified_files; do echo "Triggering batch file for unit: $unit_path" unit_name=$(basename "$unit_path") new_file_name="TR_CM_${unit_name}.bat" if [ -f "$unit_path/$new_file_name" ]; then echo "Running $new_file_name" cmd.exe /C start /b "$unit_path/$new_file_name" fi done done
优化方案与改进建议
1. 补充.mdl文件变更的触发逻辑
原脚本仅处理.tpt文件变更,未覆盖需求中.mdl变更需触发对应测试单元批处理的规则。可先提取所有变更的.mdl文件,通过路径映射找到对应的测试单元目录,再加入待执行批处理的单元列表。
2. 升级actions/checkout版本
当前使用的v2版本较旧,建议替换为最新稳定版v4,提升兼容性与执行效率:
- uses: actions/checkout@v4
3. 修复路径大小写不一致问题
原脚本中base_path使用小写code/tests/...,但触发路径是大写Code/tests/...,在区分大小写的系统(如Linux)下会导致路径匹配失败,统一改为大写路径:
base_path="Code/tests/03-Impl/01_Unittest"
4. 优化提交差异对比逻辑
若推送包含多个提交(如合并PR),HEAD~1仅能对比上一个提交,无法覆盖本次推送的所有变更。改用GitHub提供的环境变量获取本次推送的前后提交哈希,确保差异完整:
modified_files=$(git diff --name-only ${{ github.event.before }} ${{ github.event.after }} "$unit_path" | grep -E "\.tpt$")
5. 改进批处理执行方式
- 原脚本用
start /b后台运行批处理,无法捕获执行错误,导致工作流即使批处理失败也会显示成功。建议去掉该参数,让批处理前台执行,以便工作流捕获退出码:
cmd.exe /C "$batch_file"
- 若必须后台运行,建议添加日志输出到文件,方便后续排查问题:
cmd.exe /C start /b "$batch_file" > "$unit_path/batch_exec_log.txt" 2>&1
6. 避免批处理重复执行
原脚本先遍历目录下所有.bat文件执行,再针对修改的.tpt文件再次执行TR_CM_*.bat,会导致该批处理重复运行。可调整逻辑:
- 先收集所有需要触发的单元目录(包括
.tpt变更和.mdl映射的单元) - 对每个单元目录,按需执行指定批处理(如仅运行
TR_CM_*.bat或特定批处理)
7. 添加错误捕获与终止机制
在批处理执行时增加错误检查,若执行失败则终止工作流,避免错误被忽略:
if ! cmd.exe /C "$batch_file"; then echo "Error: Batch file $batch_file execution failed" exit 1 fi
8. 规范变量与注释
- 统一变量命名风格,比如将
base_path改为大写BASE_PATH(常量风格) - 补充关键逻辑的注释,提升脚本可读性
内容的提问来源于stack exchange,提问作者Murali
相关产品推荐
相关产品推荐

