添加webhook
This commit is contained in:
parent
1ab8622ca6
commit
838a198804
|
|
@ -10,6 +10,7 @@ import sys
|
||||||
import time
|
import time
|
||||||
import yaml
|
import yaml
|
||||||
import subprocess
|
import subprocess
|
||||||
|
import socket
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
|
|
@ -110,6 +111,22 @@ class GitMonitor:
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
Logger.warning(f"钉钉通知初始化失败: {e}")
|
Logger.warning(f"钉钉通知初始化失败: {e}")
|
||||||
|
|
||||||
|
def get_server_ip(self):
|
||||||
|
"""获取服务器IP地址"""
|
||||||
|
try:
|
||||||
|
# 创建一个UDP socket连接到外部地址来获取本机IP
|
||||||
|
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
||||||
|
s.connect(("8.8.8.8", 80))
|
||||||
|
ip = s.getsockname()[0]
|
||||||
|
s.close()
|
||||||
|
return ip
|
||||||
|
except Exception:
|
||||||
|
try:
|
||||||
|
# 备用方案:获取主机名对应的IP
|
||||||
|
return socket.gethostbyname(socket.gethostname())
|
||||||
|
except Exception:
|
||||||
|
return "unknown"
|
||||||
|
|
||||||
def get_remote_commit(self, repo_url, branch):
|
def get_remote_commit(self, repo_url, branch):
|
||||||
"""获取远程仓库的最新提交 hash"""
|
"""获取远程仓库的最新提交 hash"""
|
||||||
try:
|
try:
|
||||||
|
|
@ -124,6 +141,19 @@ class GitMonitor:
|
||||||
Logger.error(f"获取远程提交失败 {repo_url}: {e}")
|
Logger.error(f"获取远程提交失败 {repo_url}: {e}")
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
def get_commit_message(self, repo_url, commit_hash):
|
||||||
|
"""获取指定 commit 的提交消息"""
|
||||||
|
try:
|
||||||
|
cmd = f"git ls-remote --heads {repo_url} | grep {commit_hash[:8]}"
|
||||||
|
result = subprocess.run(
|
||||||
|
cmd, shell=True, capture_output=True, text=True, timeout=10
|
||||||
|
)
|
||||||
|
# 由于 ls-remote 无法获取 commit message,我们返回简短的 hash
|
||||||
|
return f"提交 {commit_hash[:8]}"
|
||||||
|
except Exception as e:
|
||||||
|
Logger.error(f"获取提交消息失败: {e}")
|
||||||
|
return f"提交 {commit_hash[:8]}"
|
||||||
|
|
||||||
def check_repository(self, repo_config):
|
def check_repository(self, repo_config):
|
||||||
"""检查单个仓库是否有新提交"""
|
"""检查单个仓库是否有新提交"""
|
||||||
repo_name = repo_config['name']
|
repo_name = repo_config['name']
|
||||||
|
|
@ -292,19 +322,40 @@ class GitMonitor:
|
||||||
Logger.info(f"开始部署: {repo_name}")
|
Logger.info(f"开始部署: {repo_name}")
|
||||||
Logger.separator()
|
Logger.separator()
|
||||||
|
|
||||||
# 发送构建开始通知
|
|
||||||
if self.dingtalk_notifier:
|
|
||||||
self.dingtalk_notifier.send_build_start(
|
|
||||||
repo_name=repo_name,
|
|
||||||
branch=self.global_branch,
|
|
||||||
commit_hash=commit_hash
|
|
||||||
)
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# 1. 更新主仓库和子模块
|
# 1. 更新主仓库和子模块
|
||||||
if not self.update_main_repo():
|
if not self.update_main_repo():
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
# 获取子仓库的 commit message
|
||||||
|
commit_message = None
|
||||||
|
submodule_path = repo_path / repo_config['path']
|
||||||
|
if submodule_path.exists():
|
||||||
|
try:
|
||||||
|
cmd = f"git log -1 --pretty=format:'%s' {commit_hash}"
|
||||||
|
result = subprocess.run(
|
||||||
|
cmd, shell=True, cwd=submodule_path,
|
||||||
|
capture_output=True, text=True, timeout=10
|
||||||
|
)
|
||||||
|
if result.returncode == 0 and result.stdout:
|
||||||
|
commit_message = result.stdout.strip()
|
||||||
|
Logger.info(f"提交消息: {commit_message}")
|
||||||
|
except Exception as e:
|
||||||
|
Logger.warning(f"获取提交消息失败: {e}")
|
||||||
|
|
||||||
|
# 获取服务器 IP
|
||||||
|
server_ip = self.get_server_ip()
|
||||||
|
|
||||||
|
# 发送构建开始通知(包含 commit message 和服务器 IP)
|
||||||
|
if self.dingtalk_notifier:
|
||||||
|
self.dingtalk_notifier.send_build_start(
|
||||||
|
repo_name=repo_name,
|
||||||
|
branch=self.global_branch,
|
||||||
|
commit_hash=commit_hash,
|
||||||
|
commit_message=commit_message,
|
||||||
|
server_ip=server_ip
|
||||||
|
)
|
||||||
|
|
||||||
# 2. 初始化基础设施
|
# 2. 初始化基础设施
|
||||||
if not self.init_infrastructure():
|
if not self.init_infrastructure():
|
||||||
return False
|
return False
|
||||||
|
|
|
||||||
|
|
@ -160,7 +160,7 @@ class DingTalkNotifier:
|
||||||
"""
|
"""
|
||||||
return self.send_markdown(title, text, at_all=at_all)
|
return self.send_markdown(title, text, at_all=at_all)
|
||||||
|
|
||||||
def send_build_start(self, repo_name, branch, commit_hash):
|
def send_build_start(self, repo_name, branch, commit_hash, commit_message=None, server_ip=None):
|
||||||
"""
|
"""
|
||||||
发送构建开始通知
|
发送构建开始通知
|
||||||
|
|
||||||
|
|
@ -168,17 +168,29 @@ class DingTalkNotifier:
|
||||||
repo_name: 仓库名称
|
repo_name: 仓库名称
|
||||||
branch: 分支名称
|
branch: 分支名称
|
||||||
commit_hash: 提交哈希
|
commit_hash: 提交哈希
|
||||||
|
commit_message: 提交消息(可选)
|
||||||
|
server_ip: 服务器IP(可选)
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
发送结果 (True/False)
|
发送结果 (True/False)
|
||||||
"""
|
"""
|
||||||
now = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
|
now = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
|
||||||
title = f"🚀 构建开始 - {repo_name}"
|
title = f"🚀 构建开始 - {repo_name}"
|
||||||
|
|
||||||
|
# 构建消息内容
|
||||||
text = f"""### 🚀 构建开始
|
text = f"""### 🚀 构建开始
|
||||||
|
|
||||||
**仓库**: {repo_name}
|
**仓库**: {repo_name}
|
||||||
**分支**: {branch}
|
**分支**: {branch}
|
||||||
**提交**: {commit_hash[:8]}
|
**提交**: {commit_hash[:8]}"""
|
||||||
|
|
||||||
|
if commit_message:
|
||||||
|
text += f"\n**消息**: {commit_message}"
|
||||||
|
|
||||||
|
if server_ip:
|
||||||
|
text += f"\n**服务器**: {server_ip}"
|
||||||
|
|
||||||
|
text += f"""
|
||||||
**时间**: {now}
|
**时间**: {now}
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue