作为一名程序员,每天下班前最痛苦的事情莫过于写日报。当你在终端敲下最后一行代码,正准备收拾东西回家时,突然收到钉钉或飞书的日报提醒,那种感觉就像被泼了一盆冷水。你开始绞尽脑汁回忆:"今天到底做了什么?上午那个Bug是怎么解决的?下午的会议讨论了什么?"
更糟糕的是,大多数时候我们只能打开Git Log,机械地复制粘贴提交记录,拼凑出一份毫无营养的流水账。这不仅浪费时间,也无法真实反映我们的工作价值。根据我的团队调查,平均每位工程师每周要花费1.5小时在写日报这种低价值重复劳动上。
这个自动日报生成器的设计理念是:用代码解决重复性工作。它基于RAG(检索增强生成)架构,将Git提交记录作为数据源,通过大语言模型进行信息提炼和润色,最终生成符合STAR原则的专业日报。
整个系统分为四个核心模块:
mermaid复制graph TD
A[Git仓库] --> B[数据采集]
B --> C[数据处理]
C --> D[AI生成]
D --> E[日报推送]
首先需要安装必要的Python库:
bash复制pip install gitpython requests openai python-dotenv
建议使用Python 3.8+版本,并准备好以下资源:
核心代码位于miner.py,主要功能是扫描指定Git仓库,提取当天的提交记录:
python复制from datetime import datetime, time
from git import Repo, InvalidGitRepositoryError
class GitMiner:
def __init__(self, repo_paths, author_name):
self.repo_paths = repo_paths
self.author_name = author_name
def get_daily_commits(self):
daily_logs = []
today = datetime.now().date()
start_of_day = datetime.combine(today, time.min)
end_of_day = datetime.combine(today, time.max)
for path in self.repo_paths:
try:
repo = Repo(path)
for commit in repo.iter_commits():
commit_date = datetime.fromtimestamp(commit.committed_date)
if (start_of_day <= commit_date <= end_of_day) and \
(self.author_name in commit.author.name):
log_entry = f"[{repo.working_dir.split('/')[-1]}] {commit.hexsha[:7]} - {commit.message.strip()}"
daily_logs.append(log_entry)
if commit_date < start_of_day:
break
except InvalidGitRepositoryError:
continue
return daily_logs
注意事项:
- 支持多仓库同时扫描
- 通过作者名过滤,避免收集他人提交
- 遇到非Git目录会自动跳过
原始Git提交信息往往过于简略,需要设计合理的Prompt让AI理解我们的需求:
python复制SYSTEM_PROMPT = """
你是一名资深软件工程师,请根据Git提交记录生成专业日报。
要求:
1. 使用STAR原则组织内容
2. 合并相关提交条目
3. 输出Markdown格式
4. 包含【今日工作】【问题解决】【明日计划】三部分
5. 语言简洁专业,避免流水账
"""
USER_TEMPLATE = """
这是我今天的Git提交记录:
{git_logs}
请生成日报,重点体现技术难点和业务价值。
"""
我们使用OpenAI API作为生成引擎,代码位于brain.py:
python复制from openai import OpenAI
from prompt_manager import SYSTEM_PROMPT, USER_TEMPLATE
class AIBrain:
def __init__(self, api_key, model="gpt-3.5-turbo"):
self.client = OpenAI(api_key=api_key)
self.model = model
def generate_report(self, git_logs):
if not git_logs:
return "⚠️ 今日无代码提交记录"
response = self.client.chat.completions.create(
model=self.model,
messages=[
{"role": "system", "content": SYSTEM_PROMPT},
{"role": "user", "content": USER_TEMPLATE.format(git_logs="\n".join(git_logs))}
],
temperature=0.7
)
return response.choices[0].message.content
以飞书机器人为例,实现日报自动推送:
python复制import requests
import json
class FeishuCourier:
def __init__(self, webhook_url):
self.webhook_url = webhook_url
def deliver(self, content):
payload = {
"msg_type": "interactive",
"card": {
"header": {"title": {"tag": "plain_text", "content": "📅 自动日报"}},
"elements": [{
"tag": "div",
"text": {"tag": "lark_md", "content": content}
}]
}
}
requests.post(self.webhook_url, json=payload)
main.py负责串联整个流程:
python复制from dotenv import load_dotenv
from miner import GitMiner
from brain import AIBrain
from courier import FeishuCourier
load_dotenv()
CONFIG = {
"REPO_PATHS": ["/path/to/your/project"],
"AUTHOR_NAME": "YourName",
"LLM_API_KEY": os.getenv("OPENAI_API_KEY"),
"WEBHOOK_URL": os.getenv("FEISHU_WEBHOOK")
}
def main():
miner = GitMiner(CONFIG["REPO_PATHS"], CONFIG["AUTHOR_NAME"])
logs = miner.get_daily_commits()
brain = AIBrain(CONFIG["LLM_API_KEY"])
report = brain.generate_report(logs)
print(report)
if input("推送日报?(y/n): ") == 'y':
FeishuCourier(CONFIG["WEBHOOK_URL"]).deliver(report)
if __name__ == "__main__":
main()
创建.env文件存储敏感信息:
code复制OPENAI_API_KEY=sk-your-api-key
FEISHU_WEBHOOK=https://open.feishu.cn/open-apis/bot/v2/hook/xxx
集成日历API获取会议信息:
python复制def get_calendar_events():
# 实现Google Calendar API调用
return ["10:00-11:00 需求评审", "14:00-15:00 技术方案讨论"]
然后在Prompt中加入会议信息:
code复制今日会议记录:
{meetings}
请结合代码提交和会议内容生成日报。
在GitMiner中添加敏感信息过滤:
python复制import re
def sanitize_message(msg):
patterns = [
r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}', # IP地址
r'[A-Za-z0-9]{32}' # 类似MD5的token
]
for pattern in patterns:
msg = re.sub(pattern, '***', msg)
return msg
Linux/Mac可以使用crontab设置定时任务:
bash复制# 每天18:30自动运行
30 18 * * * /usr/bin/python3 /path/to/main.py >> ~/daily_report.log 2>&1
Windows可以使用任务计划程序实现类似功能。
code复制[project] a1b2c3d - fix: 解决订单查询NPE问题
[project] e4f5g6h - feat: 添加用户积分统计功能
[project] i7j8k9l - refactor: 优化支付模块异常处理
markdown复制# 2023-11-20 工作日报
## 今日工作内容
- **订单系统优化**:发现并修复了订单查询接口的空指针异常问题(NPE),提升了系统稳定性
- **积分功能开发**:完成了用户积分统计模块的核心逻辑开发,支持实时计算和展示
- **支付模块重构**:对支付异常处理流程进行了重构,使错误提示更加友好,便于问题排查
## 问题与解决
- **问题**:订单查询时偶发NPE异常
- **解决**:增加了空值检查,添加了单元测试覆盖边界情况
## 明日计划
1. 完成积分功能的UI对接
2. 编写支付模块的重构文档
3. 参与新需求的技术方案讨论
这个自动日报生成器虽然代码量不大,但完整实现了从数据采集到智能生成的闭环。在实际使用中,它帮助我节省了大量时间,同时生成的日报质量比手动写的更加专业规范。
未来可以考虑的改进方向:
整个项目的核心价值在于:用技术手段解放生产力,让我们能专注于更有创造性的工作。这也是程序员应该追求的目标 - 自动化一切可以自动化的工作。