Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
C
CI Code Viewer
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Android Widget
CI Code Viewer
Commits
25bd6025
Commit
25bd6025
authored
May 08, 2026
by
方海彤
👶🏻
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
update
parent
3f8a636f
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
64 additions
and
12 deletions
+64
-12
README.md
README.md
+63
-5
main.py
ai_review/main.py
+1
-7
No files found.
README.md
View file @
25bd6025
...
...
@@ -47,12 +47,15 @@ ai-code-review:
### 必要配置
在 GitLab
**Settings > CI/CD > Variables**
中添加:
推荐在 GitLab
**Group → Settings → CI/CD → Variables**
配置一次,所有子项目自动继承;项目级变量会覆盖 group 级。
| 变量 | 必填 | 说明 |
|------|------|------|
|
`AI_REVIEW_API_KEY`
| ✅ | LLM API 密钥 |
|
`FEISHU_WEBHOOK_URL`
| 否 | 飞书机器人 Webhook 地址 |
| 变量 | 说明 |
|------|------|
|
`AI_REVIEW_API_KEY`
| LLM API 密钥(或本地 codex 代理的 Bearer token)。空值会以空 Bearer 调用,公有云 API 会返回 401,本地代理开放模式可接受 |
|
`AI_REVIEW_API_URL`
| LLM API 地址,缺省指向阿里云百炼;走本地代理时填
`http://<MacIP>:8088/v1`
|
|
`FEISHU_WEBHOOK_URL`
| 飞书机器人 Webhook(建议项目级配置,每项目独立的群) |
> 没有 LLM API key?见下方 [本地 Codex 代理](#本地-codex-代理可选),可用本机 ChatGPT 订阅替代。
## 环境变量
...
...
@@ -99,6 +102,58 @@ git diff → 文件过滤 → LLM 分流判定 → 审查 → 飞书通知
• 命中安全关键词 → 升级为 deep
```
## 本地 Codex 代理(可选)
如果你不想买 LLM API key,但有:① 一台
**常开**
的 Mac、②
**ChatGPT 订阅**
(已
`codex login`
)、③ CI runner 在内网可访问该 Mac,可以用
`proxy/codex_proxy.py`
把本机 codex CLI 包成 OpenAI 兼容 HTTP 接口。
业务项目侧
**`.gitlab-ci.yml` 完全不动**
,只是 GitLab Variables 里的
`AI_REVIEW_API_URL`
/
`AI_REVIEW_API_KEY`
指向代理而已。
### 部署(Mac 侧,一次性)
1.
确认 codex 已登录:
`codex login status`
应显示
`Logged in using ChatGPT`
2.
生成一个 token(任意 32 位随机串),启动代理:
```
bash
export
CODEX_PROXY_TOKEN
=
<你的token>
python3 proxy/codex_proxy.py
# 默认监听 0.0.0.0:8088
```
3. 找内网 IP:
`
ipconfig getifaddr en0
`
4. 防睡眠:
`
caffeinate
-di
-w
$(
pgrep
-f
codex_proxy.py
)
`
或 系统设置 → 电池/电源 → 防止自动休眠
5. 验证(在另一个终端):
```
bash
curl
-X
POST http://127.0.0.1:8088/v1/chat/completions
\
-H
"Authorization: Bearer
$CODEX_PROXY_TOKEN
"
\
-H
"Content-Type: application/json"
\
-d
'{"messages":[{"role":"user","content":"回复:ok"}]}'
```
6. 开机自启(可选):编辑
`
proxy/com.codex-proxy.plist
`
把里面的
`
__PROXY_PATH__
`
/
`
__SET_YOUR_TOKEN_HERE__
`
/
`
__HOME__
`
替换好,拷到
`
~/Library/LaunchAgents/
`
,然后
`
launchctl load ~/Library/LaunchAgents/com.codex-proxy.plist
`
7. macOS 防火墙若开启,第一次访问会弹出
"是否允许 python3 接受连接"
,选允许;或在 系统设置 → 网络 → 防火墙 里手动加 python3 例外
### GitLab 配置(一次性)
在 Group 级 Variables 里设置:
| 变量 | 值 |
|------|------|
|
`
AI_REVIEW_API_URL
`
|
`
http://<你Mac内网IP>:8088/v1
`
|
|
`
AI_REVIEW_API_KEY
`
| 上面的
`
CODEX_PROXY_TOKEN
`
|
|
`
AI_REVIEW_MODEL
`
| 任意值(代理忽略,例如
`
codex
`
) |
>
已有项目检查项目级 Variables 里有没有
`
AI_REVIEW_API_KEY
`
—— 项目级会覆盖 group 级,要么删掉让它继承,要么改成新 token。
### 简化版:完全信任内网,关掉鉴权
如果 CI runner 与代理在同一可信内网、不担心被无意调用,可以省掉 Bearer token:
-
**
Mac 侧
**
:启动代理时
**
不设
**
`
CODEX_PROXY_TOKEN
`
,代理进入开放模式(启动会打 WARNING)
-
**
GitLab 侧
**
:
`
AI_REVIEW_API_KEY
`
不需要配置(留空或不设都可以),代理不校验
### 注意事项
-
**
TOS
**
:把个人 ChatGPT 订阅暴露成内部服务在 OpenAI 条款里属灰色地带,仅限自用、不要对外
-
**
并发
**
:代理强制串行(一次只跑一个 codex),多 CI 并发会排队,必要时调高
`
STANDARD_TIMEOUT
`
/
`
DEEP_TIMEOUT
`
-
**
可用性
**
:Mac 一旦睡眠/重启/codex 登录失效,所有项目 CI 会挂 —— 关键时刻请用真 API key 兜底
## 项目结构
```
...
...
@@ -112,6 +167,9 @@ ai_review/
├── notify.py # 飞书通知
└── main.py # 主流程编排
ci_review.py # 薄包装入口(兼容现有 CI 调用)
proxy/
├── codex_proxy.py # 本地 Codex CLI -> OpenAI 兼容 HTTP 代理
└── com.codex-proxy.plist # macOS launchd 自启模板
templates/
└── ai-review.yml # GitLab CI 模板
```
...
...
ai_review/main.py
View file @
25bd6025
...
...
@@ -2,11 +2,10 @@
"""主流程编排。"""
import
os
import
sys
import
time
from
ai_review.config
import
(
API_KEY
,
MODEL
,
TRIAGE_MODEL
,
MODEL
,
TRIAGE_MODEL
,
MAX_DIFF_LINES
,
STANDARD_MAX_TOKENS
,
DEEP_MAX_TOKENS
,
STANDARD_TIMEOUT
,
DEEP_TIMEOUT
,
format_duration
,
...
...
@@ -23,11 +22,6 @@ from ai_review.notify import send_feishu
def
main
():
total_start
=
time
.
time
()
if
not
API_KEY
:
print
(
"错误: 未设置 AI_REVIEW_API_KEY 环境变量"
)
print
(
"请在 GitLab Settings > CI/CD > Variables 中添加。"
)
sys
.
exit
(
0
)
branch
=
os
.
environ
.
get
(
"CI_COMMIT_BRANCH"
,
os
.
environ
.
get
(
"CI_COMMIT_REF_NAME"
,
"unknown"
))
committer
=
os
.
environ
.
get
(
"CI_COMMIT_AUTHOR"
,
os
.
environ
.
get
(
"GITLAB_USER_NAME"
,
"unknown"
))
commit_msg
=
os
.
environ
.
get
(
"CI_COMMIT_MESSAGE"
,
""
)[:
100
]
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment