Compare commits

..

2 Commits

Author SHA1 Message Date
d8639e71af feat:多次提交检测补充
All checks were successful
CodeChecker 变更检测 / code-check (push) Successful in 2s
2026-07-20 15:03:57 +08:00
417c4d5afd feat:配置文件补充
All checks were successful
CodeChecker 变更检测 / code-check (push) Has been skipped
2026-07-20 14:50:08 +08:00
3 changed files with 480 additions and 3 deletions

View File

@@ -0,0 +1,288 @@
# ============================================================
# 变更检测配置
# ============================================================
# 总开关false-》流水线直接退出
checker:
enabled: true
# 类变更检测Vo/Dto/Entity/Model 字段增删改等)
class_check:
enabled: true
# Dto 类字段变更后,继续检测受影响 Controller 的 API 参数变更
dto_api_follow_up:
enabled: true
# Dto/Vo 嵌套关系索引:影响分析传播 & API 参数字段展开深度
nest_index:
max_depth: 3
dto_entity_conversion:
enabled: false
# *-entity / *-model / *-common-entity / *-doris-model 模块
model_dirs:
# fantaibao
- fantaibao-data-analysis/fantaibao-data-analysis-common-entity/src/main/java
- fantaibao-data-analysis/fantaibao-data-analysis-entity/src/main/java
- fantaibao-patrol-store/fantaibao-patrol-store-entity/src/main/java
- fantaibao-personnel-evaluation/fantaibao-personnel-evaluation-entity/src/main/java
- fantaibao-thousands-faces/fantaibao-thousands-faces-entity/src/main/java
- fantaibao-training/fantaibao-training-entity/src/main/java
# jnpf
- jnpf-app/jnpf-app-entity/src/main/java
- jnpf-attence/jnpf-attence-entity/src/main/java
- jnpf-bigdata-support/jnpf-bigdata-support-entity/src/main/java
- jnpf-capital/jnpf-capital-entity/src/main/java
- jnpf-contract/jnpf-contract-entity/src/main/java
- jnpf-duty/jnpf-duty-entity/src/main/java
- jnpf-email/jnpf-email-entity/src/main/java
- jnpf-example/jnpf-example-entity/src/main/java
- jnpf-extend/jnpf-extend-entity/src/main/java
- jnpf-file/jnpf-file-model/src/main/java
- jnpf-file/jnpf-file-yozo/jnpf-file-yozo-entity/src/main/java
- jnpf-form/jnpf-form-entity/src/main/java
- jnpf-ftb/jnpf-ftb-entity/src/main/java
- jnpf-im/jnpf-im-entity/src/main/java
- jnpf-memoo-scheduling/jnpf-memoo-scheduling-entity/src/main/java
- jnpf-memoo-share/jnpf-memoo-share-entity/src/main/java
- jnpf-message/jnpf-message-entity/src/main/java
- jnpf-oauth/jnpf-oauth-entity/src/main/java
- jnpf-permission/jnpf-permission-entity/src/main/java
- jnpf-pub-opinion/jnpf-pub-opinion-doris-model/src/main/java
- jnpf-pub-opinion/jnpf-pub-opinion-entity/src/main/java
- jnpf-saas-billing/jnpf-saas-billing-entity/src/main/java
- jnpf-salary/jnpf-salary-entity/src/main/java
- jnpf-system/jnpf-system-entity/src/main/java
- jnpf-tenant/jnpf-tenant-entity/src/main/java
- jnpf-visualdata/jnpf-visualdata-entity/src/main/java
- jnpf-visualdev/jnpf-visualdev-base/jnpf-visualdev-base-entity/src/main/java
- jnpf-visualdev/jnpf-visualdev-generater/jnpf-visualdev-generater-entity/src/main/java
- jnpf-visualdev/jnpf-visualdev-onlinedev/jnpf-visualdev-onlinedev-entity/src/main/java
- jnpf-visualdev/jnpf-visualdev-portal/jnpf-visualdev-portal-entity/src/main/java
- jnpf-websocket/jnpf-websocket-entity/src/main/java
- jnpf-workflow/jnpf-workflow-engine/jnpf-workflow-engine-entity/src/main/java
- jnpf-workflow/jnpf-workflow-form/jnpf-workflow-form-entity/src/main/java
# 接口索引扫描目录,用于分析类变更对 API 的影响范围
endpoint_scan:
controllers:
# fantaibao
- fantaibao-data-analysis/fantaibao-data-analysis-server/src/main/java
- fantaibao-patrol-store/fantaibao-patrol-store-consumers/src/main/java
- fantaibao-patrol-store/fantaibao-patrol-store-controller/src/main/java
- fantaibao-personnel-evaluation/fantaibao-personnel-evaluation-biz/src/main/java
- fantaibao-thousands-faces/fantaibao-thousands-faces-biz/src/main/java
- fantaibao-training/fantaibao-training-consumers/src/main/java
- fantaibao-training/fantaibao-training-controller/src/main/java
# jnpf
- jnpf-app/jnpf-app-controller/src/main/java
- jnpf-attence/jnpf-attence-controller/src/main/java
- jnpf-bigdata-support/jnpf-bigdata-support-biz/src/main/java
- jnpf-capital/jnpf-capital-biz/src/main/java
- jnpf-contract/jnpf-contract-biz/src/main/java
- jnpf-duty/jnpf-duty-controller/src/main/java
- jnpf-email/jnpf-email-biz/src/main/java
- jnpf-example/jnpf-example-consumers/src/main/java
- jnpf-example/jnpf-example-controller/src/main/java
- jnpf-extend/jnpf-extend-controller/src/main/java
- jnpf-file/jnpf-file-storage/src/main/java
- jnpf-file/jnpf-file-upload/src/main/java
- jnpf-file/jnpf-file-yozo/jnpf-file-yozo-controller/src/main/java
- jnpf-form/jnpf-form-controller/src/main/java
- jnpf-ftb/jnpf-ftb-biz/src/main/java
- jnpf-im/jnpf-im-biz/src/main/java
- jnpf-memoo-scheduling/jnpf-memoo-scheduling-controller/src/main/java
- jnpf-memoo-share/jnpf-memoo-share-controller/src/main/java
- jnpf-message/jnpf-message-controller/src/main/java
- jnpf-oauth/jnpf-oauth-controller/src/main/java
- jnpf-permission/jnpf-permission-biz/src/main/java
- jnpf-permission/jnpf-permission-controller/src/main/java
- jnpf-pub-opinion/jnpf-pub-opinion-controller/src/main/java
- jnpf-saas-billing/jnpf-saas-billing-biz/src/main/java
- jnpf-salary/jnpf-salary-biz/src/main/java
- jnpf-scheduletask/jnpf-scheduletask-controller/src/main/java
- jnpf-system/jnpf-system-controller/src/main/java
- jnpf-tenant/jnpf-tenant-biz/src/main/java
- jnpf-tenant/jnpf-tenant-controller/src/main/java
- jnpf-visualdata/jnpf-visualdata-controller/src/main/java
- jnpf-visualdev/jnpf-visualdev-base/jnpf-visualdev-base-controller/src/main/java
- jnpf-visualdev/jnpf-visualdev-generater/jnpf-visualdev-generater-controller/src/main/java
- jnpf-visualdev/jnpf-visualdev-onlinedev/jnpf-visualdev-onlinedev-controller/src/main/java
- jnpf-visualdev/jnpf-visualdev-portal/jnpf-visualdev-portal-controller/src/main/java
- jnpf-websocket/jnpf-websocket-biz/src/main/java
- jnpf-workflow/jnpf-workflow-engine/jnpf-workflow-engine-controller/src/main/java
- jnpf-workflow/jnpf-workflow-form/jnpf-workflow-form-controller/src/main/java
feign_apis:
# fantaibao
- fantaibao-data-analysis/fantaibao-data-analysis-api/src/main/java
- fantaibao-patrol-store/fantaibao-patrol-store-api/src/main/java
- fantaibao-personnel-evaluation/fantaibao-personnel-evaluation-api/src/main/java
- fantaibao-training/fantaibao-training-api/src/main/java
# jnpf
- jnpf-app/jnpf-app-api/src/main/java
- jnpf-attence/jnpf-attence-api/src/main/java
- jnpf-capital/jnpf-capital-api/src/main/java
- jnpf-contract/jnpf-contract-api/src/main/java
- jnpf-duty/jnpf-duty-api/src/main/java
- jnpf-email/jnpf-email-api/src/main/java
- jnpf-example/jnpf-example-api/src/main/java
- jnpf-extend/jnpf-extend-api/src/main/java
- jnpf-file/jnpf-file-api/src/main/java
- jnpf-form/jnpf-form-api/src/main/java
- jnpf-ftb/jnpf-ftb-api/src/main/java
- jnpf-im/jnpf-im-api/src/main/java
- jnpf-memoo-scheduling/jnpf-memoo-scheduling-api/src/main/java
- jnpf-memoo-share/jnpf-memoo-share-api/src/main/java
- jnpf-message/jnpf-message-api/src/main/java
- jnpf-oauth/jnpf-oauth-api/src/main/java
- jnpf-permission/jnpf-permission-api/src/main/java
- jnpf-saas-billing/jnpf-saas-billing-api/src/main/java
- jnpf-salary/jnpf-salary-api/src/main/java
- jnpf-scheduletask/jnpf-scheduletask-api/src/main/java
- jnpf-system/jnpf-system-api/src/main/java
- jnpf-tenant/jnpf-tenant-api/src/main/java
- jnpf-visualdev/jnpf-visualdev-base/jnpf-visualdev-base-api/src/main/java
- jnpf-visualdev/jnpf-visualdev-onlinedev/jnpf-visualdev-onlinedev-api/src/main/java
- jnpf-visualdev/jnpf-visualdev-portal/jnpf-visualdev-portal-api/src/main/java
- jnpf-websocket/jnpf-websocket-api/src/main/java
- jnpf-workflow/jnpf-workflow-engine/jnpf-workflow-engine-api/src/main/java
# Dto/Entity 转换逻辑扫描目录(*-biz 及含业务逻辑的 server 模块)
conversion_scan:
# fantaibao
- fantaibao-data-analysis/fantaibao-data-analysis-server/src/main/java
- fantaibao-patrol-store/fantaibao-patrol-store-biz/src/main/java
- fantaibao-personnel-evaluation/fantaibao-personnel-evaluation-biz/src/main/java
- fantaibao-thousands-faces/fantaibao-thousands-faces-biz/src/main/java
- fantaibao-training/fantaibao-training-biz/src/main/java
# jnpf
- jnpf-app/jnpf-app-biz/src/main/java
- jnpf-attence/jnpf-attence-biz/src/main/java
- jnpf-bigdata-support/jnpf-bigdata-support-biz/src/main/java
- jnpf-capital/jnpf-capital-biz/src/main/java
- jnpf-contract/jnpf-contract-biz/src/main/java
- jnpf-duty/jnpf-duty-biz/src/main/java
- jnpf-email/jnpf-email-biz/src/main/java
- jnpf-example/jnpf-example-biz/src/main/java
- jnpf-extend/jnpf-extend-biz/src/main/java
- jnpf-file/jnpf-file-yozo/jnpf-file-yozo-biz/src/main/java
- jnpf-form/jnpf-form-biz/src/main/java
- jnpf-ftb/jnpf-ftb-biz/src/main/java
- jnpf-im/jnpf-im-biz/src/main/java
- jnpf-memoo-scheduling/jnpf-memoo-scheduling-biz/src/main/java
- jnpf-memoo-share/jnpf-memoo-share-biz/src/main/java
- jnpf-message/jnpf-message-biz/src/main/java
- jnpf-oauth/jnpf-oauth-biz/src/main/java
- jnpf-permission/jnpf-permission-biz/src/main/java
- jnpf-pub-opinion/jnpf-pub-opinion-app-biz/src/main/java
- jnpf-pub-opinion/jnpf-pub-opinion-biz/src/main/java
- jnpf-saas-billing/jnpf-saas-billing-biz/src/main/java
- jnpf-salary/jnpf-salary-biz/src/main/java
- jnpf-system/jnpf-system-biz/src/main/java
- jnpf-tenant/jnpf-tenant-biz/src/main/java
- jnpf-visualdata/jnpf-visualdata-biz/src/main/java
- jnpf-visualdev/jnpf-visualdev-base/jnpf-visualdev-base-biz/src/main/java
- jnpf-visualdev/jnpf-visualdev-generater/jnpf-visualdev-generater-biz/src/main/java
- jnpf-visualdev/jnpf-visualdev-onlinedev/jnpf-visualdev-onlinedev-biz/src/main/java
- jnpf-visualdev/jnpf-visualdev-portal/jnpf-visualdev-portal-biz/src/main/java
- jnpf-websocket/jnpf-websocket-biz/src/main/java
- jnpf-workflow/jnpf-workflow-engine/jnpf-workflow-engine-biz/src/main/java
- jnpf-workflow/jnpf-workflow-form/jnpf-workflow-form-biz/src/main/java
# API 变更检测(路径 / 请求方式 / 参数),与 class_check 同级
api_check:
enabled: true
exclude_framework_params: true
endpoint_scan:
controllers:
# fantaibao
- fantaibao-data-analysis/fantaibao-data-analysis-server/src/main/java
- fantaibao-patrol-store/fantaibao-patrol-store-consumers/src/main/java
- fantaibao-patrol-store/fantaibao-patrol-store-controller/src/main/java
- fantaibao-personnel-evaluation/fantaibao-personnel-evaluation-biz/src/main/java
- fantaibao-thousands-faces/fantaibao-thousands-faces-biz/src/main/java
- fantaibao-training/fantaibao-training-consumers/src/main/java
- fantaibao-training/fantaibao-training-controller/src/main/java
# jnpf
- jnpf-app/jnpf-app-controller/src/main/java
- jnpf-attence/jnpf-attence-controller/src/main/java
- jnpf-bigdata-support/jnpf-bigdata-support-biz/src/main/java
- jnpf-capital/jnpf-capital-biz/src/main/java
- jnpf-contract/jnpf-contract-biz/src/main/java
- jnpf-duty/jnpf-duty-controller/src/main/java
- jnpf-email/jnpf-email-biz/src/main/java
- jnpf-example/jnpf-example-consumers/src/main/java
- jnpf-example/jnpf-example-controller/src/main/java
- jnpf-extend/jnpf-extend-controller/src/main/java
- jnpf-file/jnpf-file-storage/src/main/java
- jnpf-file/jnpf-file-upload/src/main/java
- jnpf-file/jnpf-file-yozo/jnpf-file-yozo-controller/src/main/java
- jnpf-form/jnpf-form-controller/src/main/java
- jnpf-ftb/jnpf-ftb-biz/src/main/java
- jnpf-im/jnpf-im-biz/src/main/java
- jnpf-memoo-scheduling/jnpf-memoo-scheduling-controller/src/main/java
- jnpf-memoo-share/jnpf-memoo-share-controller/src/main/java
- jnpf-message/jnpf-message-controller/src/main/java
- jnpf-oauth/jnpf-oauth-controller/src/main/java
- jnpf-permission/jnpf-permission-biz/src/main/java
- jnpf-permission/jnpf-permission-controller/src/main/java
- jnpf-pub-opinion/jnpf-pub-opinion-controller/src/main/java
- jnpf-saas-billing/jnpf-saas-billing-biz/src/main/java
- jnpf-salary/jnpf-salary-biz/src/main/java
- jnpf-scheduletask/jnpf-scheduletask-controller/src/main/java
- jnpf-system/jnpf-system-controller/src/main/java
- jnpf-tenant/jnpf-tenant-biz/src/main/java
- jnpf-tenant/jnpf-tenant-controller/src/main/java
- jnpf-visualdata/jnpf-visualdata-controller/src/main/java
- jnpf-visualdev/jnpf-visualdev-base/jnpf-visualdev-base-controller/src/main/java
- jnpf-visualdev/jnpf-visualdev-generater/jnpf-visualdev-generater-controller/src/main/java
- jnpf-visualdev/jnpf-visualdev-onlinedev/jnpf-visualdev-onlinedev-controller/src/main/java
- jnpf-visualdev/jnpf-visualdev-portal/jnpf-visualdev-portal-controller/src/main/java
- jnpf-websocket/jnpf-websocket-biz/src/main/java
- jnpf-workflow/jnpf-workflow-engine/jnpf-workflow-engine-controller/src/main/java
- jnpf-workflow/jnpf-workflow-form/jnpf-workflow-form-controller/src/main/java
feign_apis:
# fantaibao
- fantaibao-data-analysis/fantaibao-data-analysis-api/src/main/java
- fantaibao-patrol-store/fantaibao-patrol-store-api/src/main/java
- fantaibao-personnel-evaluation/fantaibao-personnel-evaluation-api/src/main/java
- fantaibao-training/fantaibao-training-api/src/main/java
# jnpf
- jnpf-app/jnpf-app-api/src/main/java
- jnpf-attence/jnpf-attence-api/src/main/java
- jnpf-capital/jnpf-capital-api/src/main/java
- jnpf-contract/jnpf-contract-api/src/main/java
- jnpf-duty/jnpf-duty-api/src/main/java
- jnpf-email/jnpf-email-api/src/main/java
- jnpf-example/jnpf-example-api/src/main/java
- jnpf-extend/jnpf-extend-api/src/main/java
- jnpf-file/jnpf-file-api/src/main/java
- jnpf-form/jnpf-form-api/src/main/java
- jnpf-ftb/jnpf-ftb-api/src/main/java
- jnpf-im/jnpf-im-api/src/main/java
- jnpf-memoo-scheduling/jnpf-memoo-scheduling-api/src/main/java
- jnpf-memoo-share/jnpf-memoo-share-api/src/main/java
- jnpf-message/jnpf-message-api/src/main/java
- jnpf-oauth/jnpf-oauth-api/src/main/java
- jnpf-permission/jnpf-permission-api/src/main/java
- jnpf-saas-billing/jnpf-saas-billing-api/src/main/java
- jnpf-salary/jnpf-salary-api/src/main/java
- jnpf-scheduletask/jnpf-scheduletask-api/src/main/java
- jnpf-system/jnpf-system-api/src/main/java
- jnpf-tenant/jnpf-tenant-api/src/main/java
- jnpf-visualdev/jnpf-visualdev-base/jnpf-visualdev-base-api/src/main/java
- jnpf-visualdev/jnpf-visualdev-onlinedev/jnpf-visualdev-onlinedev-api/src/main/java
- jnpf-visualdev/jnpf-visualdev-portal/jnpf-visualdev-portal-api/src/main/java
- jnpf-websocket/jnpf-websocket-api/src/main/java
- jnpf-workflow/jnpf-workflow-engine/jnpf-workflow-engine-api/src/main/java
# 企业微信通知开关
wecom:
enabled: true
webhook_url: "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=61f08cc9-b734-4dff-a931-7f33654c0a81"
notify:
only_on_change: true
# 实体类变更与 API 参数变更重叠时的通知策略both | class_only | api_only
dto_overlap_mode: class_only

View File

@@ -0,0 +1,179 @@
name: CodeChecker 变更检测
run-name: ${{ gitea.actor }}的CodeChecker变更检测
on:
push:
# branches:
# - check-code-dev-test
workflow_dispatch:
env:
# CodeChecker 私库坐标com.codechecker:code-checker:1.0.0
CODE_CHECKER_VERSION: "1.0.0"
CODE_CHECKER_REPO_URL: "http://192.168.3.25:18081/nexus/repository/maven-releases"
jobs:
code-check:
if: ${{ gitea.ref != 'refs/heads/pre' && gitea.ref != 'refs/heads/dev' && gitea.ref != 'refs/heads/master-2.0' }}
runs-on: jdk11
steps:
# 浅克隆当前 tip对比基准用 push before覆盖一次 push 的多 commit 累计 diff
# 不必全量历史:只需能 git show before / after 两边的文件内容
- name: 检出代码
run: |
git config --global http.sslVerify false
REPO_URL="https://${{ gitea.token }}@git.niujiekeji.com/${{ gitea.repository }}.git"
BRANCH="${{ gitea.ref_name }}"
NEW_SHA="${{ gitea.sha }}"
git clone --depth 1 --single-branch --branch "${BRANCH}" "${REPO_URL}" .
git checkout -B "${BRANCH}" "${NEW_SHA}"
echo "${NEW_SHA}" > /tmp/code-check-new-sha.txt
- name: 检查配置文件
run: |
if [ ! -f .gitea/config/code-check-config.yaml ]; then
echo "错误: 缺少 .gitea/config/code-check-config.yaml"
exit 1
fi
- name: 从 Nexus 私库下载 CodeChecker
run: |
GROUP_PATH="com/codechecker/code-checker"
JAR_NAME="code-checker-${CODE_CHECKER_VERSION}.jar"
JAR_URL="${CODE_CHECKER_REPO_URL}/${GROUP_PATH}/${CODE_CHECKER_VERSION}/${JAR_NAME}"
JAR_PATH="/tmp/${JAR_NAME}"
echo "下载: ${JAR_URL}"
if command -v curl >/dev/null 2>&1; then
curl -fsSL -o "${JAR_PATH}" "${JAR_URL}"
elif command -v wget >/dev/null 2>&1; then
wget -q -O "${JAR_PATH}" "${JAR_URL}"
else
echo "错误: Runner 缺少 curl 或 wget无法从 Nexus 下载 jar"
exit 1
fi
if [ ! -s "${JAR_PATH}" ]; then
echo "错误: 下载失败或文件为空: ${JAR_PATH}"
exit 1
fi
ls -lh "${JAR_PATH}"
- name: 验证 JDK
run: |
echo "Java: $(java -version 2>&1 | head -1)"
- name: 执行 CodeChecker 变更检测
env:
# push 前 tip新分支首次 push 时为全 0。workflow_dispatch 可能为空,下方会回退。
PUSH_BEFORE: ${{ gitea.event.before }}
# push 事件携带的 commits 列表JSON用于准确统计 commit 数(不受浅克隆影响)
PUSH_COMMITS_JSON: ${{ toJson(gitea.event.commits) }}
run: |
NEW_SHA=$(cat /tmp/code-check-new-sha.txt)
OLD_SHA="${PUSH_BEFORE}"
# 新分支首次 pushbefore 全 0→ 跳过
if [ -z "$OLD_SHA" ] || echo "$OLD_SHA" | grep -Eq '^0+$'; then
# 手动触发:无 before回退为 HEAD~1加深 1 层后取父提交)
if [ "${{ gitea.event_name }}" = "workflow_dispatch" ]; then
git fetch --deepen 1 || true
OLD_SHA=$(git rev-parse HEAD~1 2>/dev/null || echo "")
if [ -z "$OLD_SHA" ]; then
echo "手动触发且无父提交,跳过检测"
exit 0
fi
echo "workflow_dispatch无 push before回退使用 HEAD~1=${OLD_SHA}"
else
echo "新分支首次 pushbefore 为空/全 0跳过检测"
exit 0
fi
fi
if [ "$OLD_SHA" = "$NEW_SHA" ]; then
echo "before 与 after 相同,无需检测"
exit 0
fi
# 确保提交对象可读
ensure_commit() {
local sha="$1"
if git cat-file -e "${sha}^{commit}" 2>/dev/null; then
return 0
fi
echo "本地缺少 ${sha},尝试按 SHA 浅取…"
if git fetch --depth 1 origin "${sha}"; then
git cat-file -e "${sha}^{commit}" 2>/dev/null && return 0
fi
for d in 10 30 50 100; do
echo "deepen ${d}…"
git fetch --deepen "${d}" || true
if git cat-file -e "${sha}^{commit}" 2>/dev/null; then
return 0
fi
done
return 1
}
# 加深当前 tip 的历史,直到 before 成为 after 的祖先(否则 rev-list 在浅克隆下会少算)
ensure_range() {
local old="$1"
local new="$2"
local i=0
while [ "$i" -lt 15 ]; do
if git merge-base --is-ancestor "${old}" "${new}" 2>/dev/null; then
return 0
fi
echo "区间历史不完整deepen 20…第 $((i + 1)) 次)"
git fetch --deepen 20 || true
i=$((i + 1))
done
# force-push 等非祖先关系:对象在即可做 git diff但 rev-list 不可靠
if git cat-file -e "${old}^{commit}" 2>/dev/null \
&& git cat-file -e "${new}^{commit}" 2>/dev/null; then
echo "警告: ${old} 不是 ${new} 的祖先(可能 force-pushcommit 计数将改用事件 payload"
return 0
fi
return 1
}
# 优先用 Gitea push 事件的 commits 数组长度(准确且不依赖 shallow
count_from_payload() {
if [ -z "${PUSH_COMMITS_JSON:-}" ] || [ "${PUSH_COMMITS_JSON}" = "null" ] || [ "${PUSH_COMMITS_JSON}" = "[]" ]; then
return 1
fi
local n
n=$(printf '%s' "${PUSH_COMMITS_JSON}" | grep -oE '"id"[[:space:]]*:[[:space:]]*"[0-9a-fA-F]{7,40}"' | wc -l | tr -d ' ')
if [ -n "$n" ] && [ "$n" -gt 0 ] 2>/dev/null; then
echo "$n"
return 0
fi
return 1
}
if ! ensure_commit "$OLD_SHA"; then
echo "错误: 无法获取 push 前 tip ${OLD_SHA},请检查 shallow/权限"
exit 2
fi
if ! ensure_commit "$NEW_SHA"; then
echo "错误: 无法解析当前 tip ${NEW_SHA}"
exit 2
fi
if ! ensure_range "$OLD_SHA" "$NEW_SHA"; then
echo "错误: 无法补齐 ${OLD_SHA}..${NEW_SHA} 历史"
exit 2
fi
echo "对比区间: ${OLD_SHA} → ${NEW_SHA}"
COMMIT_COUNT=""
if COMMIT_COUNT=$(count_from_payload); then
echo "本次 push 累计 commit 数: ${COMMIT_COUNT}(来自事件 payload"
elif git merge-base --is-ancestor "$OLD_SHA" "$NEW_SHA" 2>/dev/null; then
COMMIT_COUNT=$(git rev-list --count "${OLD_SHA}..${NEW_SHA}" 2>/dev/null || echo "?")
echo "本次 push 累计 commit 数: ${COMMIT_COUNT}(来自 git rev-list"
else
echo "本次 push 累计 commit 数: ?(非祖先关系且无 payload"
fi
COMMIT_TIME=$(git log -1 --format=%cd --date=format:'%Y-%m-%d %H:%M:%S' "${NEW_SHA}")
java -jar "/tmp/code-checker-${CODE_CHECKER_VERSION}.jar" \
--config .gitea/config/code-check-config.yaml \
--repo-root . \
--old-sha "$OLD_SHA" \
--new-sha "$NEW_SHA" \
--branch "${{ gitea.ref_name }}" \
--modifier "${{ gitea.actor }}" \
--modify-time "$COMMIT_TIME"

View File

@@ -52,6 +52,9 @@ public class CodeCheckMain implements Callable<Integer> {
@Option(names = "--modify-time", required = true, description = "修改时间")
private String modifyTime;
@Option(names = "--branch", description = "分支名CI 显式传入,优先于 git rev-parse")
private String branch;
/** 程序入口 */
public static void main(String[] args) {
int exitCode = new CommandLine(new CodeCheckMain()).execute(args);
@@ -68,7 +71,7 @@ public class CodeCheckMain implements Callable<Integer> {
}
GitChangeScanner gitScanner = new GitChangeScanner(repoRoot.toAbsolutePath());
String branch = gitScanner.getCurrentBranch();
String branchName = resolveBranch(gitScanner);
DtoNestIndex nestIndex = DtoNestIndex.build(repoRoot.toAbsolutePath(), appConfig);
List<ClassChangeReport> classReports = List.of();
List<EndpointChangeReport> apiReports = List.of();
@@ -87,8 +90,8 @@ public class CodeCheckMain implements Callable<Integer> {
OverlapNotificationFilter.FilterResult filtered = OverlapNotificationFilter.apply(
classReports, apiReports, appConfig.getDtoOverlapMode(), nestIndex);
int totalSent = sendClassNotifications(appConfig, filtered.classReports(), branch)
+ sendApiNotifications(appConfig, filtered.apiReports(), branch);
int totalSent = sendClassNotifications(appConfig, filtered.classReports(), branchName)
+ sendApiNotifications(appConfig, filtered.apiReports(), branchName);
if (totalSent == 0 && appConfig.isOnlyOnChange()) {
System.out.println("无变更,静默退出");
@@ -96,6 +99,13 @@ public class CodeCheckMain implements Callable<Integer> {
return 0;
}
private String resolveBranch(GitChangeScanner gitScanner) {
if (branch != null && !branch.isBlank()) {
return branch.trim();
}
return gitScanner.getCurrentBranch();
}
private List<ClassChangeReport> analyzeClassChanges(AppConfig appConfig, GitChangeScanner gitScanner,
DtoNestIndex nestIndex) throws Exception {
System.out.println("=== 类变更检测 ===");