# auto-pr **Repository Path**: zhnagyuting/auto-pr ## Basic Information - **Project Name**: auto-pr - **Description**: 个人仓库个人仓库个人仓库 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 3 - **Created**: 2025-11-17 - **Last Updated**: 2025-11-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # OpenEuler Python 包自动更新工具 这是一个用于自动化更新 openEuler 项目中 Python 包的 Go 语言工具。该工具可以自动检测 PyPI 上的新版本,下载源码包,修改 spec 文件,并创建 Pull Request。 ## 功能特性 - 🔍 **自动检测版本差异**: 从 PyPI 和 openEuler Gitee 仓库获取版本信息,自动识别需要更新的包 - 📦 **自动下载源码包**: 从 PyPI 下载最新版本的源码包 - 🔧 **自动修改 spec 文件**: 更新版本号、Source URL、Release 号和 Changelog - 🍴 **自动 Fork 仓库**: 自动检查并创建 Gitee fork - 📝 **自动提交代码**: 自动执行 git add、commit 和 push 操作 - 🔀 **自动创建 PR**: 自动创建 Pull Request 到源仓库 ## 项目结构 ``` . ├── main.go # 主程序入口 ├── go.mod # Go 模块依赖 ├── config.yaml.example # 配置文件示例 ├── config.yaml # 配置文件(需自行创建,不提交到仓库) ├── global/ # 全局工具函数 │ └── funcs.go # 路径、文件名处理等工具函数 ├── internal/ # 内部包(不对外暴露) │ ├── app/ # 应用主逻辑 │ │ └── app.go # 应用入口和流程控制 │ └── processor/ # 项目处理器 │ └── processor.go # 单个项目的处理逻辑 ├── pkg/ # 公共包 │ ├── config/ # 配置管理 │ │ └── config.go # 配置加载和验证 │ ├── logger/ # 日志系统 │ │ └── logger.go # 日志初始化和封装 │ ├── gitee/ # Gitee 相关操作 │ │ ├── client.go # Gitee API 客户端(fork、PR) │ │ ├── cmd.go # Git 命令执行(clone、commit、push) │ │ └── edit_files.go # 修改 spec 文件和源码包 │ └── pypi/ # PyPI 相关操作 │ ├── pypi.go # PyPI API 交互和源码包下载 │ └── python-modules.txt # Python 模块列表 ├── attach/ # 工作目录 │ ├── download/ # 下载的源码包存放目录 │ ├── excel/ # Excel 文件存放目录 │ └── gitee/ # Git 仓库克隆目录 └── logs/ # 日志文件目录(自动创建) └── app.log # 应用日志文件 ``` ## 依赖要求 - Go 1.23 或更高版本 - Git(需要配置 SSH 密钥用于克隆 Gitee 仓库) - Gitee 个人访问令牌(Personal Access Token) ## 主要依赖库 - `github.com/sirupsen/logrus`: 结构化日志库 - `gopkg.in/yaml.v3`: YAML 配置文件解析 - `gopkg.in/natefinch/lumberjack.v2`: 日志轮转 - `github.com/xuri/excelize/v2`: Excel 文件处理 - `github.com/PuerkitoBio/goquery`: HTML 解析 ## 安装 1. 克隆项目: ```bash git clone cd auto-pr-python ``` 2. 安装依赖: ```bash go mod download go mod tidy ``` 3. 配置 Gitee SSH 密钥(用于 Git 操作): 确保已配置 SSH 密钥,可以正常克隆和推送代码到 Gitee。 4. 创建配置文件: ```bash cp config.yaml.example config.yaml ``` 然后编辑 `config.yaml`,填入您的配置信息: - `gitee.token`: Gitee 个人访问令牌(从 https://gitee.com/profile/personal_access_tokens 获取) - `gitee.fork_owner`: 您的 Gitee 用户名 - `gitee.email`: 您的邮箱地址 ## 使用方法 ### 基本用法 ```bash go run main.go ``` 或指定配置文件路径: ```bash go run main.go -config=config.yaml ``` ### 命令行参数 - `-config`: 配置文件路径(默认: `config.yaml`) ### 配置文件说明 配置文件使用 YAML 格式,主要包含以下配置项: #### Gitee 配置 - `gitee.owner`: 仓库所有者(默认: `src-openeuler`) - `gitee.fork_owner`: Fork 后的所有者,通常是您的 Gitee 用户名(必需) - `gitee.token`: Gitee 个人访问令牌(必需) - `gitee.email`: 维护者邮箱(必需) - `gitee.api_delay`: API 请求延迟(毫秒,默认: 1000) #### PyPI 配置 - `pypi.modules_file`: Python 模块列表文件路径(默认: `pkg/pypi/python-modules.txt`) - `pypi.download_retry`: 下载重试次数(默认: 1) #### 应用配置 - `app.process_limit`: 每次处理的项目数量限制(0 表示不限制) - `app.sleep_between_pr`: 每个 PR 之间的休眠时间(秒) - `app.base_branch`: 基础分支名称(默认: `master`) #### 日志配置 - `log.level`: 日志级别(`debug`, `info`, `warn`, `error`,默认: `info`) - `log.format`: 日志格式(`json`, `text`,默认: `text`) - `log.output`: 输出方式(`file`, `console`, `both`,默认: `both`) - `log.file_path`: 日志文件路径(默认: `logs/app.log`) - `log.max_size`: 单个日志文件最大大小(MB,默认: 100) - `log.max_backups`: 保留的日志文件数量(默认: 7) - `log.max_age`: 日志文件保留天数(默认: 30) - `log.compress`: 是否压缩旧日志文件(默认: `true`) 详细配置示例请参考 `config.yaml.example` 文件。 ### 工作流程 1. **检查 Excel 文件**: 程序会检查是否存在当日的 Excel 文件(格式:`YYYYMMDD.xlsx`) - 如果不存在,会自动从 Gitee 获取所有版本不一致的项目并生成 Excel 文件 2. **读取项目列表**: 从 Excel 文件中读取需要更新的项目信息 3. **处理每个项目**: - 下载新版本源码包 - Fork 仓库(如果尚未 fork) - 克隆仓库到本地 - 修改 `.spec` 文件(更新版本号、Source URL、Release、Changelog) - 替换源码包文件 - 提交并推送更改 - 创建 Pull Request 4. **清理**: 处理完成后清理临时目录 ### Excel 文件格式 Excel 文件应包含以下列(第一行为表头): | openeuler 项目名称 | openeuler 源码包信息 | openeuler 最后更新时间 | pypl 源码包 | pypl 版本 | pypl 更新时间 | |-------------------|---------------------|----------------------|------------|----------|--------------| | python-requests | python-requests-2.3.1.tar.gz | 2024-01-01 | requests | 2.31.0 | 2024-01-15 | ## 主要功能模块 ### PyPI 模块 (`pkg/pypi/`) - `GetLastUpdateInfo()`: 获取所有项目的更新信息并保存到 Excel - `DownloadSourceCode()`: 从 PyPI 下载源码包 - `fetchPyplUpdateInfo()`: 从 PyPI API 获取包的最新版本信息 ### Gitee 模块 (`pkg/gitee/`) - `Client`: Gitee API 客户端 - `CreateFork()`: 创建 fork - `CheckForkExists()`: 检查 fork 是否存在 - `CreatePR()`: 创建 Pull Request - `CloneRepository()`: 克隆仓库 - `ModifySpecFile()`: 修改 spec 文件 - `ModifySourcePackage()`: 替换源码包 - `CommitChange()`: 提交并推送更改 ### 全局工具 (`global/`) - `GetExcelFileName()`: 生成当日 Excel 文件名 - `GetNewPackageDownloadUrl()`: 生成 PyPI 下载 URL - `ExtractVersionFromTarball()`: 从文件名提取版本号 - `GetSpecFile()`: 获取 spec 文件路径 ## 注意事项 1. **配置文件**: 首次运行前必须创建 `config.yaml` 文件并配置相关信息 2. **Gitee Token**: 确保 token 有足够的权限(需要 fork、创建 PR 等权限) 3. **SSH 配置**: 确保已配置 SSH 密钥,可以正常克隆和推送代码 4. **网络连接**: 需要能够访问 Gitee 和 PyPI 5. **Excel 文件**: 如果 Excel 文件不存在,程序会自动生成,但需要从 `python-modules.txt` 读取项目列表 6. **错误处理**: 如果某个项目处理失败,程序会继续处理下一个项目 7. **PR 去重**: 如果 PR 已存在,程序会跳过创建 8. **日志文件**: 日志文件会自动轮转,避免占用过多磁盘空间 9. **敏感信息**: `config.yaml` 包含敏感信息,已添加到 `.gitignore`,不要提交到仓库 ## 开发说明 ### 添加新的 Python 模块 编辑 `pkg/pypi/python-modules.txt` 文件,每行一个模块名称。 ### 修改 spec 文件格式 如果需要修改 spec 文件的更新逻辑,请编辑 `pkg/gitee/edit_files.go` 中的相关函数。 ## 许可证 [待添加] ## 贡献 欢迎提交 Issue 和 Pull Request! ## 作者 [待添加]