From d0bf31a21e57808075d86100ef3ec7006586280b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=B0=8F=E4=BA=91?= Date: Sat, 10 Jan 2026 14:25:01 +0800 Subject: [PATCH] xx --- .devops/__pycache__/deployer.cpython-313.pyc | Bin 0 -> 19340 bytes .devops/config.yaml | 5 +- .devops/deployer.py | 64 ++++++------------- .devops/monitor.py | 11 ++-- ruoyi-gateway | 2 +- 5 files changed, 31 insertions(+), 51 deletions(-) create mode 100644 .devops/__pycache__/deployer.cpython-313.pyc diff --git a/.devops/__pycache__/deployer.cpython-313.pyc b/.devops/__pycache__/deployer.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d1d837aab3904b6dd195d6653698571f3176e06a GIT binary patch literal 19340 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 ?0w+0zEVYM?}6GptXgJw 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 V;XhOM|E|49tFZoo!kkR{{{R#BiH!gN literal 0 HcmV?d00001 diff --git a/.devops/config.yaml b/.devops/config.yaml index 599fe29..b8200eb 100644 --- a/.devops/config.yaml +++ b/.devops/config.yaml @@ -1,5 +1,8 @@ # DevOps 自动化部署配置文件 +# 全局分支配置(所有仓库统一使用此分支) +global_branch: main + # Git 仓库配置 repositories: # 认证服务 @@ -199,8 +202,6 @@ monitor: # 部署配置 deploy: docker_compose_path: ./docker/docker-compose.yml - auto_commit: true # 是否自动提交子模块更新到主仓库 - commit_message: "自动更新子模块: {repo_name} 到最新版本" # 日志配置 logging: diff --git a/.devops/deployer.py b/.devops/deployer.py index bf40d49..538e3c5 100644 --- a/.devops/deployer.py +++ b/.devops/deployer.py @@ -33,10 +33,14 @@ class Deployer: self.runtime_path = Path(runtime_path) self.main_repo_url = config['main_repository']['url'] - self.main_repo_branch = config['main_repository']['branch'] + + # 使用全局分支配置 + self.global_branch = config.get('global_branch', 'main') + self.main_repo_branch = self.global_branch self.logger.info(f"项目根目录: {project_root}") self.logger.info(f"Runtime 目录: {self.runtime_path}") + self.logger.info(f"全局分支: {self.global_branch}") def run_command(self, cmd, cwd=None, timeout=600): """执行命令""" @@ -109,20 +113,17 @@ class Deployer: else: self.logger.info("主仓库已存在,更新代码...") - # 切换到指定分支 + # 切换到配置的主分支 + self.logger.info(f"切换到主分支: {self.main_repo_branch}") if not self.run_command(f"git checkout {self.main_repo_branch}", cwd=repo_path): return False - # 拉取最新代码 + # 拉取主仓库最新代码 + self.logger.info("拉取主仓库最新代码...") if not self.run_command("git pull", cwd=repo_path): return False - # 初始化子模块(如果还没初始化) - if not self.run_command("git submodule update --init --recursive", cwd=repo_path): - return False - - # 更新所有子模块到各自配置的分支 - self.logger.info("更新所有子模块到最新代码...") + # 更新所有子模块到全局配置的分支 if not self.update_all_submodules(repo_path): return False @@ -131,38 +132,14 @@ class Deployer: return True def update_all_submodules(self, repo_path): - """更新所有子模块到各自配置的分支""" - self.logger.info("更新所有子模块到各自配置的分支...") + """更新所有子模块到全局配置的分支""" + self.logger.info(f"更新所有子模块到分支: {self.global_branch}") - # 构建分支映射:子模块路径 -> 分支名 - # 注意:这里假设所有子模块使用相同的分支,如果需要不同分支,需要逐个处理 - # 先尝试使用 git submodule foreach 批量更新 - - # 检查是否所有子模块使用相同的分支 - branches = set(repo['branch'] for repo in self.config['repositories']) - - if len(branches) == 1: - # 所有子模块使用相同分支,可以使用 foreach - branch = branches.pop() - self.logger.info(f"所有子模块使用相同分支 {branch},使用 git submodule foreach 批量更新") - cmd = f"git submodule foreach 'git checkout {branch} && git pull origin {branch}'" - if not self.run_command(cmd, cwd=repo_path, timeout=600): - self.logger.warning("批量更新子模块失败") - return False - else: - # 不同子模块使用不同分支,需要逐个更新 - self.logger.info("子模块使用不同分支,逐个更新...") - for repo_config in self.config['repositories']: - branch = repo_config['branch'] - submodule_path = repo_config['path'] - - self.logger.info(f"更新子模块 {repo_config['name']} 到分支 {branch}") - - # 构建命令:进入子模块,切换分支并拉取 - cmd = f"cd {submodule_path} && git checkout {branch} && git pull origin {branch}" - if not self.run_command(cmd, cwd=repo_path, timeout=300): - self.logger.warning(f"子模块 {repo_config['name']} 更新失败,继续处理其他子模块") - continue + # 使用 git submodule foreach 批量更新所有子模块到全局分支 + cmd = f"git submodule foreach 'git checkout {self.global_branch} && git pull'" + if not self.run_command(cmd, cwd=repo_path, timeout=600): + self.logger.warning("批量更新子模块失败") + return False return True @@ -178,13 +155,12 @@ class Deployer: self.logger.error(f"子模块目录不存在: {submodule_path}") return False - # 切换到指定分支 - branch = repo_config['branch'] - if not self.run_command(f"git checkout {branch}", cwd=submodule_path): + # 切换到全局配置的分支 + if not self.run_command(f"git checkout {self.global_branch}", cwd=submodule_path): return False # 拉取最新代码 - if not self.run_command("git pull origin " + branch, cwd=submodule_path): + if not self.run_command(f"git pull origin {self.global_branch}", cwd=submodule_path): return False self.logger.info(f"子模块更新成功: {repo_config['name']}") diff --git a/.devops/monitor.py b/.devops/monitor.py index 2d3019b..62904bc 100644 --- a/.devops/monitor.py +++ b/.devops/monitor.py @@ -31,7 +31,11 @@ class GitMonitor: self.deployer = Deployer(self.config) self.last_commits = {} # 存储每个仓库的最后一次提交 hash + # 读取全局分支配置 + self.global_branch = self.config.get('global_branch', 'main') + self.logger.info("Git 监听器初始化完成") + self.logger.info(f"监听分支: {self.global_branch}") def _load_config(self): """加载配置文件""" @@ -91,12 +95,11 @@ class GitMonitor: """检查单个仓库是否有新提交""" repo_name = repo_config['name'] repo_url = repo_config['url'] - branch = repo_config['branch'] - self.logger.debug(f"检查仓库: {repo_name}") + self.logger.debug(f"检查仓库: {repo_name} (分支: {self.global_branch})") - # 获取最新提交 - current_commit = self.get_remote_commit(repo_url, branch) + # 获取最新提交(使用全局分支配置) + current_commit = self.get_remote_commit(repo_url, self.global_branch) if not current_commit: self.logger.warning(f"无法获取 {repo_name} 的最新提交") return False diff --git a/ruoyi-gateway b/ruoyi-gateway index 1ea1bbe..d735138 160000 --- a/ruoyi-gateway +++ b/ruoyi-gateway @@ -1 +1 @@ -Subproject commit 1ea1bbeb8f30d6ca34fcb8bb6cfd9b375714aa64 +Subproject commit d735138af013a4771b120712b975d61fafcc1899