最近参考 linty_fresh 实现了一个 webhook 服务,提 PR 自动检查 Flake8, 当有代码风格问题的时候,并在对应位置发评论

项目地址是: gandalf

在公司内的 Github 企业版上,已经用了一段时间,比较稳定。现在开源出来,有兴趣的可以拿去 ^.^

这个项目也是我的学习 asyncio 的练手作品,吐槽下 Type Hints 让代码显的好丑哇...

项目知识点

  1. Python3: 项目需要使用 Python3, 建议使用 Python3.5
  2. rq : 工作中有一些项目的版本库很大,实际的检查时间也会长一些,为了保证应用解耦和更好的提供支持,使用 rq 作为任务队列
  3. aiohttp : 基于 asyncio 的 http 库,用来调用 github api, 获取对应 pr 信息
  4. pygit2 : 使用官方模块实现 Python 版本的 git 版本控制功能,它的安装比较麻烦,但是官方文档讲的很清楚
  5. Flask: 作为 webhook 的服务框架

来几张截图看个效果:

配置

 cat gandalf/config.py
WORK_DIR = '/tmp/repositories'  # 设定克隆的项目版本库代码存放位置
FLAKE8_EXECUTABLE = '/usr/local/bin/flake8'  # 这个项目时Python3的,但是目前大部分应用还是Python2的, 所以需要Python2版本的flake8
HOST = '0.0.0.0'
PORT = 8080
DEBUG = False
REPORT_NO_MATCHING = False  # 没有在diff列表的文件的错误是否也报告
GITHUB_URL = 'http://github.com/'  # 行尾要加反斜杠
GITHUB_API_URL = 'https://api.github.com'  # 行尾不要加反斜杠
REPORT_CLOSEST = False # 错误出现在PR列出的文件中, 但是修改并不是此次PR中的diff里面是否报告
COMMENT_HEADER = ''  # 上述截图出现的emoji头部就是指定它, 我的设置是`COMMENT_HEADER = ':sparkles:Subject Bot:sparkles:'`


try:
    from local_settings import *
except ImportError:
    pass

配置 webhook

需要在 github 的项目 / 组织设置页,找到Webhooks, 然后Add webhook

  1. Payload URL 输入 http://192.168.1.1:28030/api/hooks# 或者你跑起来 web 服务的地址
  2. 选择事件 ,Let me select individual events. 然后勾选 Pull Request

如图:

Enjoy it