# gitlab-test **Repository Path**: geekjohn/gitlab-test ## Basic Information - **Project Name**: gitlab-test - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-08-23 - **Last Updated**: 2026-08-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # GitLab 自动化测试工具 基于 Flask 的 GitLab 自动化测试工具,用于管理和操作 GitLab 的 Merge Requests。 ## 功能特性 1. **MR 数据获取** - 获取指定时间范围内的 MR 数据 - 支持通过页面下拉框调整时间范围(1天、3天、1周、2周、1个月) - 详细数据存储在 SQLite 数据库中 - 缓存信息存储在文件中 2. **MR 回放** - 对指定的 MR 进行回放操作 - 支持指定目标分支 3. **Cherry-Pick** - 支持单个或多个 commits 的 cherry-pick - 操作日志记录和查看 4. **手动 Cherry-Pick** - 在页面手动输入任意 commit IDs(每行一个或逗号分隔) - 支持 cherry-pick 到指定 MR 的目标分支 - 支持加载项目分支列表辅助选择 5. **Tag 历史数据收集** - 从 GitLab 收集项目的 tag 数据 - 支持按时间范围筛选(1天、1周、1个月、3个月、全部等) - 缓存 commit ID、tag 名称、commit 信息、作者、流水线状态等 6. **Tag Cherry-Pick + 流水线触发** - 从历史 commits 中选择一笔或多笔进行 cherry-pick - 在页面编辑 tag 名称,支持直接从 tag 历史中点选填充 - 自动 cherry-pick → 创建 tag → 触发 tag 流水线 - **tag 名重复时直接报错**,防止重复创建 - 完整操作日志记录 7. **本地 Git 仓库支持(新增)** - 支持设置本地仓库路径,跨平台(Windows/Linux)可用 - 所有分支操作、cherry-pick 在本地仓库进行 - 支持创建/切换分支、fetch、push 等操作 - 支持本地 tag 创建和推送 8. **统一 Cherry-Pick 配置(新增)** - Cherry-pick 是统一公共的配置,MR 和 Tag 操作共用 - 支持批量输入 commit IDs 进行操作 9. **批量操作(新增)** - 支持批量输入 commit IDs(换行或逗号分隔) - 可选择 GitLab API 模式或本地仓库模式 - 一键执行:Cherry-Pick + 创建 Tag + 触发流水线 10. **缓存管理** - 自动缓存 GitLab API 响应 - 支持手动清空缓存 ## 技术栈 - **后端**: Flask (Python 3) - **数据库**: SQLite - **前端**: HTML, CSS, JavaScript (原生) - **API**: python-gitlab ## 项目结构 ``` gitlab-automation-tool/ ├── app.py # Flask 主应用 ├── config.py # 配置文件 ├── requirements.txt # Python 依赖 ├── .env.example # 环境变量示例 ├── utils/ │ ├── database.py # SQLite 数据库操作 │ ├── cache.py # 缓存管理 │ ├── gitlab_api.py # GitLab API 封装 │ └── local_git.py # 本地 Git 操作(新增) ├── templates/ │ └── index.html # 主页面 ├── static/ │ ├── css/ │ │ └── style.css # 样式文件 │ └── js/ │ └── main.js # 前端逻辑 ├── data/ │ └── gitlab_mr.db # SQLite 数据库(自动创建) └── cache/ # 缓存目录(自动创建) ``` ## 安装和配置 ### 1. 安装依赖 ```bash pip install -r requirements.txt ``` ### 2. 配置 GitLab 1. 复制 `.env.example` 为 `.env`: ```bash cp .env.example .env ``` 2. 编辑 `.env` 文件,填入你的 GitLab 配置: ``` GITLAB_URL=https://gitlab.com GITLAB_TOKEN=your-gitlab-token-here SECRET_KEY=your-secret-key-here-change-this-in-production ``` 3. 可选:配置本地仓库(用于本地 Git 操作): ``` LOCAL_REPO_PATH=/path/to/local/repo CHERRY_PICK_AUTO_PUSH=false CHERRY_PICK_KEEP_COMMIT=false CHERRY_PICK_REMOTE=origin ``` 4. 获取 GitLab Token: - 访问 GitLab 的 User Settings -> Access Tokens - 创建一个 Personal Access Token,需要以下权限: - `api` - `read_repository` - `write_repository` ## 使用方法 ### 启动应用 ```bash python app.py ``` 应用将在 `http://localhost:5000` 启动。 ### 使用界面 1. **配置本地仓库(可选)** - 在"本地 Git 仓库配置"区域设置仓库路径 - 点击"检查仓库"验证仓库状态 2. **选择项目** - 从下拉框中选择你要操作的 GitLab 项目 - 点击"刷新项目列表"更新项目列表 3. **获取 MR 列表** - 选择时间范围(1天、3天、1周、2周、1个月) - 选择 MR 状态(全部、已打开、已合并、已关闭、已锁定) - 点击"获取 MR 列表"按钮 4. **查看 MR 详情** - 点击任意 MR 查看详细信息 - 在 "Commits" 标签页查看该 MR 的所有 commits 5. **回放 MR** - 切换到 "回放" 标签页 - (可选)指定目标分支 - 点击"执行回放"按钮 6. **Cherry-Pick** - 切换到 "Cherry-Pick" 标签页 - 选择一个或多个 commits - 输入目标分支 - 点击"执行 Cherry-Pick"按钮 7. **批量 Cherry-Pick + 创建 Tag + 触发流水线** - 在"批量 Cherry-Pick"区域 - 选择操作模式(GitLab API 或本地仓库) - 批量输入 commit IDs - 输入目标分支和 tag 名称 - 点击"执行 Cherry-Pick + 创建 Tag + 触发流水线" 8. **Tag 管理** - 选择时间范围筛选 tag - 点击"从 GitLab 收集 Tag 数据" - 在 tag 历史列表中查看和选择 9. **查看操作日志** - 在页面底部查看 Cherry-Pick 和 Tag 操作的历史记录 10. **缓存管理** - 点击"清空缓存"按钮清除所有缓存数据 ## API 接口 ### 配置和状态 - `GET /api/config` - 获取配置信息 - `GET /api/cache/info` - 获取缓存信息 - `POST /api/cache/clear` - 清空缓存 ### 项目管理 - `GET /api/projects` - 获取项目列表 ### MR 操作 - `POST /api/merge-requests` - 获取 MR 列表 - `GET /api/merge-request//commits` - 获取 MR 的 commits - `POST /api/merge-request//replay` - 回放 MR ### Cherry-Pick - `POST /api/cherry-pick` - Cherry-pick commit(s) - `POST /api/cherry-pick-commits` - 手动输入 commit IDs 进行 cherry-pick - `GET /api/cherry-pick-logs` - 获取 cherry-pick 日志 ### 本地 Git 仓库操作(新增) - `GET /api/local-git/status` - 获取本地 Git 状态 - `POST /api/local-git/set-repo` - 设置仓库路径 - `POST /api/local-git/clone` - 克隆仓库 - `GET /api/local-git/branches` - 获取分支列表 - `POST /api/local-git/checkout` - 切换分支 - `POST /api/local-git/cherry-pick` - 本地 Cherry-Pick - `POST /api/local-git/cherry-pick-batch` - 批量本地 Cherry-Pick - `POST /api/local-git/push` - 推送到远程 - `GET /api/local-git/logs` - 获取本地日志 - `GET /api/local-git/tags` - 获取本地 tags - `POST /api/local-git/create-tag` - 创建本地 tag ### 分支管理 - `GET /api/branches` - 获取项目分支列表 ### Tag 管理 - `GET /api/tags` - 获取缓存的 tag 历史数据 - `POST /api/tags/collect` - 从 GitLab 收集 tag 数据并缓存(支持时间筛选) - `GET /api/tags/pipelines` - 获取 tag 的流水线信息 - `POST /api/tags/create` - Cherry-pick commits + 创建 tag + 触发流水线 - `GET /api/tag-logs` - 获取 tag 操作日志 ### 统一操作(新增) - `POST /api/unified/cherry-pick-and-trigger` - 统一 Cherry-Pick + 创建 Tag + 触发流水线 ### 批量处理(新增) - `POST /api/batch/parse-commits` - 解析批量输入的 commit IDs - `POST /api/batch/validate-commits` - 验证 commit IDs ### 数据库 - `GET /api/database/mrs` - 从数据库获取 MR 列表 ## 数据库结构 ### merge_requests 表 - `id` - 主键 - `mr_iid` - MR IID - `project_id` - 项目 ID - `title` - MR 标题 - `author` - 作者 - `source_branch` - 源分支 - `target_branch` - 目标分支 - `state` - 状态 - `created_at` - 创建时间 - `merged_at` - 合并时间 - `web_url` - Web URL - `updated_at` - 更新时间 ### commits 表 - `id` - 主键 - `commit_id` - Commit ID - `mr_id` - 关联的 MR ID - `short_id` - 短 ID - `title` - 标题 - `author_name` - 作者姓名 - `author_email` - 作者邮箱 - `created_at` - 创建时间 - `message` - 提交信息 - `web_url` - Web URL ### cherry_pick_logs 表 - `id` - 主键 - `mr_id` - 关联的 MR ID - `commit_id` - Commit ID - `target_branch` - 目标分支 - `status` - 状态 - `result_message` - 结果消息 - `created_at` - 创建时间 ### tags 表 - `id` - 主键 - `project_id` - 项目 ID - `tag_name` - Tag 名称 - `commit_id` - Commit ID - `commit_message` - Commit 信息 - `author_name` - 作者 - `created_at` - Tag 创建时间 - `collected_at` - 收集时间 - 唯一约束: `UNIQUE(project_id, tag_name)` ### tag_operation_logs 表 - `id` - 主键 - `project_id` - 项目 ID - `tag_name` - Tag 名称 - `commit_ids` - 涉及的 Commit IDs(逗号分隔) - `target_branch` - 目标分支 - `status` - 状态(success/failed) - `result_message` - 结果消息 - `pipeline_url` - 流水线 URL - `created_at` - 创建时间 ## 注意事项 1. **GitLab Token 权限**:确保你的 Token 具有足够的权限 2. **网络连接**:确保服务器可以访问 GitLab 实例 3. **缓存过期**:缓存默认 1 小时过期 4. **数据库备份**:重要数据请定期备份数据库文件 5. **安全性**:生产环境请修改 SECRET_KEY 并使用 HTTPS 6. **本地仓库**:使用本地仓库模式时,确保 Git 已安装且配置正确 ## 故障排除 ### GitLab 未配置 - 检查 `.env` 文件是否存在 - 确认 `GITLAB_TOKEN` 已正确设置 - 确认 GitLab URL 正确 ### 无法获取项目列表 - 检查 Token 是否有 `api` 权限 - 确认网络连接正常 - 检查 GitLab URL 是否正确 ### Cherry-pick 失败 - 可能存在代码冲突,需要手动解决 - 确认目标分支存在 - 检查 Token 是否有 `write_repository` 权限 ### 本地仓库模式失败 - 检查本地 Git 是否已安装并可用 - 确认仓库路径正确且包含有效的 Git 仓库 - 检查远程仓库配置是否正确 ## 开发和扩展 ### 添加新功能 1. 在 `utils/gitlab_api.py` 或 `utils/local_git.py` 中添加新的 API 调用 2. 在 `app.py` 中添加对应的路由 3. 在 `static/js/main.js` 中添加前端逻辑 4. 在 `templates/index.html` 中添加 UI 元素 ### 自定义样式 编辑 `static/css/style.css` 来自定义界面样式。 ### 数据库迁移 如需修改数据库结构,请: 1. 备份现有数据库 2. 删除 `data/gitlab_mr.db` 3. 重启应用(会自动创建新结构) ## 许可证 MIT License ## 贡献 欢迎提交 Issue 和 Pull Request!