forked from zhouruizhe/gmTouringMiniApp
Merge branch 'main' of http://192.168.8.242:3000/zhouruizhe/gmTouringMiniApp
This commit is contained in:
@@ -0,0 +1,16 @@
|
|||||||
|
# 大二进制文件走 Git LFS,避免仓库膨胀 / 网页预览超时
|
||||||
|
# 提交这类文件前,先在本机执行一次: git lfs install
|
||||||
|
*.pptx filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.ppt filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.docx filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.doc filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.xlsx filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.xls filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.pdf filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.zip filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.rar filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.7z filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.mp4 filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.mov filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.psd filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.ai filter=lfs diff=lfs merge=lfs -text
|
||||||
@@ -1,5 +1,7 @@
|
|||||||
# AI 代码审查:每次 PR 触发,用 Claude Code 调用智谱 GLM(glm-5.2) 审查 diff,
|
# AI 代码审查:每次 PR 触发,用 Claude Code 调用智谱 GLM(glm-5.2) 审查 diff,
|
||||||
# 并把结论评论到 PR。走 GLM 的 Anthropic 兼容端点,无需访问 Anthropic 官方。
|
# 并把结论评论到 PR。走 GLM 的 Anthropic 兼容端点,无需访问 Anthropic 官方。
|
||||||
|
# 密钥用 Gitea 的 ${{ secrets.* }}(同仓库 PR 正常下发;来自 fork 的跨仓库 PR 会被
|
||||||
|
# Gitea 隐藏密钥 → 自动跳过审查,不报错)。请在团队仓库内开同仓库 PR。
|
||||||
name: AI Code Review
|
name: AI Code Review
|
||||||
on:
|
on:
|
||||||
pull_request:
|
pull_request:
|
||||||
@@ -9,33 +11,45 @@ jobs:
|
|||||||
review:
|
review:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
env:
|
env:
|
||||||
# 关键:把 Claude Code 指向智谱 GLM 的 Anthropic 兼容端点(已验证可用)
|
|
||||||
ANTHROPIC_BASE_URL: https://open.bigmodel.cn/api/anthropic
|
ANTHROPIC_BASE_URL: https://open.bigmodel.cn/api/anthropic
|
||||||
ANTHROPIC_API_KEY: ${{ secrets.ZHIPU_API_KEY }}
|
ANTHROPIC_API_KEY: ${{ secrets.ZHIPU_API_KEY }}
|
||||||
ANTHROPIC_MODEL: glm-5.2
|
ANTHROPIC_MODEL: glm-5.2
|
||||||
CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC: "1" # 关闭遥测,避免访问被墙地址
|
CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC: "1"
|
||||||
DISABLE_AUTOUPDATER: "1"
|
DISABLE_AUTOUPDATER: "1"
|
||||||
IS_SANDBOX: "1" # CI 容器以 root 运行,需此项才能用 --dangerously-skip-permissions
|
IS_SANDBOX: "1" # CI 容器以 root 运行,需此项才能用 --dangerously-skip-permissions
|
||||||
steps:
|
steps:
|
||||||
- name: 检出代码
|
- name: 检出代码
|
||||||
# 手动克隆,避免从 github.com 下载 actions/checkout(内网不可达)
|
|
||||||
env:
|
env:
|
||||||
REVIEW_PAT: ${{ secrets.REVIEW_PAT }}
|
REVIEW_PAT: ${{ secrets.REVIEW_PAT }}
|
||||||
run: |
|
run: |
|
||||||
git clone "http://oauth2:${REVIEW_PAT}@gitea:3000/${{ gitea.repository }}.git" .
|
if [ -z "$REVIEW_PAT" ]; then
|
||||||
|
echo "::warning::REVIEW_PAT 为空:通常是来自 fork 的跨仓库 PR(Gitea 会隐藏密钥)。请在团队仓库内开同仓库 PR。本次跳过审查。"
|
||||||
|
echo "SKIP_REVIEW=1" >> "$GITHUB_ENV"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
git config --global http.extraHeader "Authorization: Basic $(printf 'oauth2:%s' "$REVIEW_PAT" | base64 -w0)"
|
||||||
|
git clone "http://gitea:3000/${{ gitea.repository }}.git" .
|
||||||
git checkout "${{ gitea.event.pull_request.head.ref }}"
|
git checkout "${{ gitea.event.pull_request.head.ref }}"
|
||||||
|
|
||||||
- name: 生成 PR diff
|
- name: 生成 PR diff
|
||||||
|
if: env.SKIP_REVIEW != '1'
|
||||||
run: |
|
run: |
|
||||||
BASE="${{ gitea.event.pull_request.base.ref }}"
|
BASE="${{ gitea.event.pull_request.base.ref }}"
|
||||||
git fetch origin "$BASE"
|
git fetch origin "$BASE"
|
||||||
git diff "origin/$BASE...HEAD" > pr.diff
|
git diff "origin/$BASE...HEAD" > pr.diff
|
||||||
echo "diff 行数: $(wc -l < pr.diff)"
|
echo "diff 行数: $(wc -l < pr.diff)"
|
||||||
|
|
||||||
- name: 安装 Claude Code
|
- name: 安装 Claude Code(已装则跳过)
|
||||||
run: npm install -g @anthropic-ai/claude-code --registry=https://registry.npmmirror.com
|
if: env.SKIP_REVIEW != '1'
|
||||||
|
run: |
|
||||||
|
if command -v claude >/dev/null 2>&1; then
|
||||||
|
echo "claude 已存在,跳过安装"
|
||||||
|
else
|
||||||
|
npm install -g @anthropic-ai/claude-code --registry=https://registry.npmmirror.com
|
||||||
|
fi
|
||||||
|
|
||||||
- name: 运行 AI 审查
|
- name: 运行 AI 审查
|
||||||
|
if: env.SKIP_REVIEW != '1'
|
||||||
# Claude Code 会自动读取本仓库 CLAUDE.md 与 .claude/skills/*
|
# Claude Code 会自动读取本仓库 CLAUDE.md 与 .claude/skills/*
|
||||||
run: |
|
run: |
|
||||||
claude -p "$(cat .claude/review-prompt.md)" \
|
claude -p "$(cat .claude/review-prompt.md)" \
|
||||||
@@ -45,6 +59,7 @@ jobs:
|
|||||||
--max-turns 15 > review.md || true
|
--max-turns 15 > review.md || true
|
||||||
|
|
||||||
- name: 把审查结论评论到 PR
|
- name: 把审查结论评论到 PR
|
||||||
|
if: env.SKIP_REVIEW != '1'
|
||||||
env:
|
env:
|
||||||
REVIEW_PAT: ${{ secrets.REVIEW_PAT }}
|
REVIEW_PAT: ${{ secrets.REVIEW_PAT }}
|
||||||
API: ${{ vars.MAIN_API }}
|
API: ${{ vars.MAIN_API }}
|
||||||
@@ -52,11 +67,11 @@ jobs:
|
|||||||
PR: ${{ gitea.event.pull_request.number }}
|
PR: ${{ gitea.event.pull_request.number }}
|
||||||
run: |
|
run: |
|
||||||
if [ -s review.md ]; then
|
if [ -s review.md ]; then
|
||||||
BODY=$(node -e 'let d="";process.stdin.on("data",c=>d+=c).on("end",()=>process.stdout.write(JSON.stringify({body:d})))' < review.md)
|
node -e 'let d="";process.stdin.on("data",c=>d+=c).on("end",()=>process.stdout.write(JSON.stringify({body:d})))' < review.md > /tmp/body.json
|
||||||
curl -fsS -X POST "$API/repos/$REPO/issues/$PR/comments" \
|
curl -fsS -X POST "$API/repos/$REPO/issues/$PR/comments" \
|
||||||
-H "Authorization: token $REVIEW_PAT" \
|
-H "Authorization: token $REVIEW_PAT" \
|
||||||
-H "Content-Type: application/json" \
|
-H "Content-Type: application/json" \
|
||||||
-d "$BODY"
|
--data @/tmp/body.json
|
||||||
else
|
else
|
||||||
echo "review.md 为空,跳过评论"
|
echo "review.md 为空,跳过评论"
|
||||||
fi
|
fi
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user