GITLAB × CLAUDE CODE · 敏捷开发实战
从立项到上线的标准流程
面向团队真实场景的端到端讲解:项目初始化、协作开发、分支策略、调试、进度管理与 CI/CD 构建。Claude Code 作为团队成员融入每一环节。
1总览:完整流程树状图
一张图看清楚从产品想法到生产环境之间发生了什么。每一个分叉代表团队的一次决策点。
flowchart TD
A([📌 产品想法 / 需求]) --> B[GitLab Issue 立项]
B --> C[迭代规划 Sprint Planning]
C --> D{任务分配}
D --> E1[开发者 A]
D --> E2[开发者 B]
D --> E3[🤖 Claude Code]
E1 --> F[创建 feature 分支]
E2 --> F
E3 --> F
F --> G[本地开发 + 自测]
G --> H[push 到远程]
H --> I[发起 Merge Request]
I --> J{CI 流水线}
J -->|❌ 失败| G
J -->|✅ 通过| K[Code Review]
K -->|需修改| G
K -->|通过| L[合并到 develop]
L --> M[集成测试环境]
M --> N{Sprint 结束?}
N -->|否| C
N -->|是| O[合并到 main]
O --> P[打 Tag / Release]
P --> Q[CD 部署生产]
Q --> R([🚀 上线])
R --> S[监控 + Bug 反馈]
S -.->|新 Issue| B
classDef start fill:#fc6d26,stroke:#fc6d26,color:#fff
classDef decision fill:#1c232c,stroke:#d29922,color:#d29922
classDef ci fill:#1c232c,stroke:#58a6ff,color:#58a6ff
classDef done fill:#3fb950,stroke:#3fb950,color:#fff
classDef claude fill:#bc8cff,stroke:#bc8cff,color:#fff
class A,R start
class D,J,K,N decision
class J,M,Q ci
class E3 claude
class P,O done
核心思想: 主分支 main 永远可发布,所有改动通过 feature 分支 + Merge Request 进入。CI 自动卡关,人工评审守门,Claude Code 在每个环节加速但不绕过流程。
2项目建立与初始化
2.1 在 GitLab 上创建项目
1
创建 Group + Project
在 GitLab 上新建 Group(团队/产品线),再在 Group 下创建 Project。Group 层级用于权限继承和成员管理。
2
初始化仓库与 README
勾选「Initialize with README」+ 选择 .gitignore 模板 + 选择 license。提交首个 commit 作为 baseline。
3
本地克隆并准备环境
git clone git@gitlab.com:your-group/your-project.git
cd your-project
# 配置项目级 Git 身份(推荐)
git config user.name "Your Name"
git config user.email "you@company.com"
2.2 必备配置文件
| 文件 | 作用 |
.gitignore | 过滤 IDE/构建产物/secret |
.gitlab-ci.yml | CI/CD 流水线定义 |
README.md | 项目说明、本地起步、架构图 |
CONTRIBUTING.md | 分支规则、commit 规范、MR 模板 |
CODEOWNERS | 按目录指定默认评审人,含 @claude-bot |
CLAUDE.md | Claude Code 项目级指令、约束、风格 |
2.3 权限模型
Maintainer核心成员:管理分支保护、CI 变量、发布。
Developer日常成员:可推送 feature 分支、发起 MR。
ReporterQA / PM:可看 Issue 与 dashboard,不能 push。
3敏捷节奏与任务管理
一个标准 Sprint(2 周)的时间轴:
gantt
title 双周 Sprint 时间轴
dateFormat YYYY-MM-DD
axisFormat %m-%d
section 规划
Sprint Planning :p1, 2026-01-05, 1d
section 开发
Day 1-7 编码 :a1, after p1, 7d
Daily Standup :crit, milestone, after p1, 0d
section 集成
Code Freeze :milestone, 2026-01-15, 0d
集成测试 + 修复 :a2, 2026-01-15, 2d
section 收尾
Sprint Review :r1, 2026-01-17, 1d
Retrospective :r2, after r1, 1d
3.1 GitLab Issue 作为最小工作单元
- 每个用户故事 → 一个 Epic(在 Premium 版)或 父 Issue
- 每个可在 1–2 天完成的任务 → 一个 Issue,打
~feature / ~bug / ~chore label
- 用 Milestone 对齐 Sprint(如
Sprint-2026-W02),用 Iteration 跟踪燃尽
- 用 Issue Board(看板)可视化状态流转:Backlog → Ready → Doing → Review → Done
3.2 Issue 模板(团队约定)
## 背景
为什么要做?解决谁的什么问题?
## 验收标准 (Definition of Done)
- [ ] 功能 X 在场景 Y 下表现为 Z
- [ ] 单元测试覆盖 ≥ 80%
- [ ] 文档已更新
## 技术线索
建议涉及的模块、需要参考的 issue/MR
## Claude Code prompt(可选)
> 当此任务交给 Claude Code 时使用的初始指令
4分支策略与协作开发
推荐 GitLab Flow 简化版:长期分支 main(生产)+ develop(集成),短期分支 feature/* fix/* hotfix/*。
gitGraph
commit id: "v1.0.0"
branch develop
checkout develop
commit id: "init dev"
branch feature/login
checkout feature/login
commit id: "form UI"
commit id: "API call"
checkout develop
merge feature/login tag: "MR #12"
branch feature/payment
checkout feature/payment
commit id: "stripe sdk"
commit id: "callback"
checkout develop
merge feature/payment tag: "MR #15"
checkout main
merge develop tag: "v1.1.0"
branch hotfix/leak
checkout hotfix/leak
commit id: "fix mem leak"
checkout main
merge hotfix/leak tag: "v1.1.1"
checkout develop
merge main
4.1 分支命名规范
| 类型 | 命名 | 从哪开 | 合到哪 |
| 新功能 | feature/<issue-id>-short-desc | develop | develop |
| 缺陷 | fix/<issue-id>-short-desc | develop | develop |
| 线上紧急修复 | hotfix/<issue-id>-short-desc | main | main + develop |
| 发布准备 | release/v1.2.0 | develop | main |
4.2 Commit 规范(Conventional Commits)
feat(login): add OAuth2 google provider # 新功能
fix(payment): handle stripe webhook timeout # 修 bug
refactor(api): split user service # 重构
docs(readme): update local setup steps # 文档
test(login): add edge case for empty password # 测试
chore(deps): bump axios to 1.7.0 # 杂项
ci(gitlab): cache pnpm store # CI
为什么强制规范? Conventional Commits 让 changelog 自动化、release 工具识别 break change、Claude Code 也能写出风格一致的提交。
4.3 分支保护规则(Maintainer 设置)
main:禁止直推、必须 MR、必须 CI 通过、必须至少 1 个 approval
develop:禁止直推、必须 MR、CI 通过
feature/* fix/*:开发者可直接 push
5Merge Request 与代码评审
MR 是协作的核心载体。它不是把代码丢过去就行——它是一次知识传递。
flowchart LR
A[开发完成] --> B[push feature 分支]
B --> C[GitLab 网页发起 MR]
C --> D{Draft?}
D -->|是| E[继续开发]
E --> C
D -->|否| F[CI 自动跑]
F --> G{流水线通过?}
G -->|❌| H[修复后重 push]
H --> F
G -->|✅| I[请求评审]
I --> J[Reviewer 阅读 diff]
J --> K{有 comment?}
K -->|是| L[作者回复/修改]
L --> F
K -->|approve| M[Maintainer 合并]
M --> N[Squash & Merge]
N --> O[源分支自动删除]
classDef ok fill:#3fb950,stroke:#3fb950,color:#fff
classDef warn fill:#1c232c,stroke:#d29922,color:#d29922
class M,N,O ok
class D,G,K warn
5.1 MR 描述模板
## 这个 MR 做了什么
一句话总结。
Closes #123
## 怎么验证
1. 拉这个分支
2. `pnpm dev`,访问 /login
3. 用账号 demo/123 登录,预期跳转到 /dashboard
## 截图 / 录屏
(UI 改动必须贴)
## Checklist
- [ ] 自测通过
- [ ] 加了单元测试
- [ ] 更新了文档
- [ ] 无 console.log 残留
5.2 评审重点(按优先级)
- 逻辑正确性 — 真的解决了 issue 描述的问题吗?
- 边界与错误处理 — 空值/超时/并发/权限
- 安全 — SQL 注入、XSS、secret 泄露、越权
- 可读性 — 命名、复杂度、注释
- 性能 — N+1 查询、大对象、内存泄漏
- 风格 — 交给 linter,不要在评审里争论
6Claude Code 工作流嵌入
把 Claude Code 当成一个高效但需要被评审的初级工程师。它不绕过任何流程,只是把每个环节做快。
flowchart TB
subgraph Plan[📋 计划阶段]
A1[读 Issue + CLAUDE.md] --> A2[Claude: 生成实现方案]
A2 --> A3[人: review 方案]
end
subgraph Code[⚒️ 编码阶段]
B1[Claude: 写代码 + 测试] --> B2[本地跑测试]
B2 --> B3{通过?}
B3 -->|否| B1
B3 -->|是| B4[Claude: 写 commit message]
end
subgraph Review[🔍 评审阶段]
C1[push + 发 MR] --> C2[CI 自动跑]
C2 --> C3[人 review diff]
C3 --> C4{要改?}
C4 -->|是| B1
C4 -->|否| C5[合并]
end
Plan --> Code --> Review
classDef plan fill:#1c232c,stroke:#bc8cff,color:#bc8cff
classDef code fill:#1c232c,stroke:#58a6ff,color:#58a6ff
classDef review fill:#1c232c,stroke:#3fb950,color:#3fb950
class A1,A2,A3 plan
class B1,B2,B3,B4 code
class C1,C2,C3,C4,C5 review
6.1 CLAUDE.md:项目级"操作手册"
# 项目约定
- 技术栈: Next.js 15 + TypeScript + Prisma + PostgreSQL
- 测试: vitest + playwright,单测在 *.test.ts,e2e 在 /e2e
- 风格: 函数式优先,避免 class;早 return,少嵌套
- 提交: 遵循 conventional commits
# 禁止
- 不要直接改 prisma migration,要用 `pnpm db:migrate`
- 不要引入新依赖前先问
- 不要在生产代码留 console.log
# 常用命令
- 开发: `pnpm dev`
- 测试: `pnpm test`
- lint: `pnpm lint --fix`
- 类型检查: `pnpm typecheck`
6.2 推荐 Claude Code 使用范式
✅ 合适场景
- 样板代码(CRUD、表单、组件)
- 重构 / 改名 / 拆文件
- 写单元测试和文档
- 定位 bug(带 stack trace)
- 调研第三方库 API
⚠️ 需谨慎
- 新架构决策 — 人先定方向
- 安全敏感代码 — 必须人审
- 性能关键路径 — 需 benchmark
- 复杂业务逻辑 — 提供完整背景
- 跨服务集成 — 给契约文档
6.3 让 Claude Code 走完整流程的提示词样例
读 GitLab issue #234,理解需求后:
1. 先给我一个 5 步以内的实现计划,等我 ok
2. 从 develop 开一个分支 feature/234-user-export
3. 写代码 + 单元测试
4. 跑 `pnpm test` 和 `pnpm typecheck`,全绿再提
5. 写规范的 commit message,push 上去
6. 用 glab cli 发起 MR,描述里 Closes #234
每步完成报告一次,不要一口气干完。
7调试与缺陷管理
7.1 Bug 全流程
flowchart LR
A[👤 用户/QA 上报] --> B[GitLab Issue
label: ~bug ~severity::high]
B --> C[分类 Triage]
C --> D{严重程度}
D -->|P0 阻塞| E[hotfix 分支
立即处理]
D -->|P1 高| F[当前 Sprint]
D -->|P2 中| G[下个 Sprint]
D -->|P3 低| H[Backlog]
E --> I[复现 + 写失败测试]
F --> I
G --> I
I --> J[定位根因]
J --> K[修复 + 让测试通过]
K --> L[MR + Review]
L --> M[合并 + 部署]
M --> N[关闭 Issue
验证修复]
classDef p0 fill:#f85149,stroke:#f85149,color:#fff
classDef p1 fill:#d29922,stroke:#d29922,color:#fff
class E p0
class F p1
7.2 调试三板斧(与 Claude Code 配合)
1. 复现
没有稳定复现路径就先不修。把"步骤 + 期望 + 实际 + 环境"写进 Issue。
2. 失败测试
先写一个能复现 bug 的测试用例。让它在修复前 FAIL,修复后 PASS。这是回归网。
3. 二分定位
git bisect 在历史中二分查找引入 bug 的 commit,速度极快。
7.3 Claude Code 调试提示词
这是一个生产 bug:用户点击「导出」按钮,500 报错。
错误日志:[贴 stack trace]
相关代码:src/api/export.ts
最近改动:MR !87
请:
1. 列出 3 个最可能的根因,按概率排序
2. 告诉我怎么本地复现
3. 写一个能稳定触发这个 bug 的失败测试
4. 不要直接改代码,等我确认根因再动手
8CI/CD 构建与部署
GitLab CI 用 .gitlab-ci.yml 定义流水线。每次 push / MR 自动触发。
flowchart LR
A[Git Push] --> B[trigger pipeline]
B --> C1[lint]
B --> C2[typecheck]
B --> C3[test]
C1 & C2 & C3 --> D[build]
D --> E[docker image]
E --> F{分支?}
F -->|develop| G[deploy staging]
F -->|main + tag| H[manual approve]
H --> I[deploy production]
G --> J[运行 e2e]
J --> K[通知 Slack]
I --> L[健康检查]
L --> M[通知 + 监控]
classDef parallel fill:#1c232c,stroke:#58a6ff,color:#58a6ff
classDef gate fill:#1c232c,stroke:#d29922,color:#d29922
classDef prod fill:#3fb950,stroke:#3fb950,color:#fff
class C1,C2,C3 parallel
class F,H gate
class I,L,M prod
8.1 极简版 .gitlab-ci.yml
stages: [verify, build, deploy]
default:
image: node:22-alpine
cache:
key: $CI_COMMIT_REF_SLUG
paths: [node_modules/, .pnpm-store/]
install:
stage: verify
script:
- corepack enable
- pnpm install --frozen-lockfile
lint:
stage: verify
needs: [install]
script: pnpm lint
typecheck:
stage: verify
needs: [install]
script: pnpm typecheck
test:
stage: verify
needs: [install]
script: pnpm test --coverage
coverage: '/Lines\s*:\s*([\d.]+)%/'
artifacts:
reports:
junit: junit.xml
build:
stage: build
needs: [lint, typecheck, test]
script:
- pnpm build
- docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .
- docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
only: [develop, main, tags]
deploy_staging:
stage: deploy
needs: [build]
script: kubectl set image deploy/app app=$CI_REGISTRY_IMAGE:$CI_COMMIT_SHA -n staging
environment: staging
only: [develop]
deploy_prod:
stage: deploy
needs: [build]
script: kubectl set image deploy/app app=$CI_REGISTRY_IMAGE:$CI_COMMIT_SHA -n prod
environment: production
when: manual
only: [tags]
8.2 Pipeline 设计原则
- 并行化:lint / typecheck / test 三个独立 job 同时跑,缩短 feedback 时间
- 失败快速:把最快的 job 放前面,比如 lint 30s 内能挂掉 → 不浪费后续算力
- 缓存依赖:
node_modules、.pnpm-store、.next/cache 都缓存
- artifact 保留报告:测试报告、覆盖率、构建产物上传,便于追溯
- 生产部署手动 approve:自动到 staging,人工卡 prod
9发布与回滚
9.1 标准发布流程
1
从 develop 切 release 分支
git checkout develop && git pull
git checkout -b release/v1.2.0
2
冻结新功能,只允许修 bug
这条分支接下来 2–3 天只接受 fix。同时跑回归测试。
3
合并到 main 并打 tag
git checkout main && git merge --no-ff release/v1.2.0
git tag -a v1.2.0 -m "Release v1.2.0"
git push origin main --tags
tag push 触发 CI 的 deploy_prod job。
4
把 main 合回 develop
避免 release 期间的 fix 在 develop 丢失。
5
在 GitLab Releases 发版本说明
关联 milestone、列出关键变更、附产物链接。可由 Claude Code 基于 commit 历史生成 draft。
9.2 紧急回滚
# 方式一:重新部署上个 tag 的镜像(最快)
kubectl set image deploy/app app=$REGISTRY:v1.1.9 -n prod
# 方式二:revert commit 并走流程(更干净)
git checkout main
git revert
git push # 触发新 pipeline → 自动部署
10团队上手 Checklist
🏗️ 项目初始化
- [ ] 创建 Group + Project
- [ ] 配置分支保护规则
- [ ] 添加
.gitlab-ci.yml
- [ ] 编写
CONTRIBUTING.md
- [ ] 添加
CLAUDE.md
- [ ] 设置 CI/CD 变量与 secret
- [ ] 配置 Issue / MR 模板
👥 团队协作
- [ ] 邀请成员并分配角色
- [ ] 创建 Issue Board (Sprint 看板)
- [ ] 设置每日 standup 时间
- [ ] 约定 commit / 命名规范
- [ ] 设置 CODEOWNERS
- [ ] 配置评审轮换
🤖 Claude Code 接入
- [ ] 团队成员安装并登录 Claude Code
- [ ] 写好项目级
CLAUDE.md
- [ ] 约定 Claude 提交的 commit 标识
- [ ] 培训:何时用 / 不用 Claude
- [ ] 把 lint / test 命令文档化
🚀 持续改进
- [ ] Sprint Retrospective 固化
- [ ] 监控 MR 平均合并时间
- [ ] 监控 CI 失败率与时长
- [ ] 跟踪线上 bug 引入率
- [ ] 季度更新
CLAUDE.md
记住一件事: 流程的目的不是变重,而是让正确做事比偷懒更省力。每多一条规则,问自己:「不加这条会出现什么问题?真的痛到要加吗?」