无Webhook且不暴露Jenkins时,触发GitHub PR构建的可靠方法
可行方案:本地长轮询监听GitHub PR事件 + Jenkins远程触发
结合你的限制条件,以下是可靠的实现方式:
核心思路
用本地脚本通过GitHub API实现长轮询监听PR事件(非定时轮询,接近实时触发),当检测到新的Pull Request创建时,直接调用本地Jenkins的远程构建接口启动编译任务。完全符合你“不暴露公网、无仓库权限、不用有漏洞插件、避免定时轮询”的要求。
具体步骤
1. 生成GitHub个人访问令牌(PAT)
创建一个带有repo权限的PAT,用于调用GitHub API获取仓库事件。操作时只勾选必要权限,最小化风险。
2. 编写本地长轮询监听脚本
以Python为例,脚本逻辑如下:
- 首次请求GitHub仓库事件API,记录最后处理的事件ID;
- 后续请求携带
If-None-Match头,设置30秒超时(GitHub支持长连接等待事件触发); - 当检测到
PullRequestEvent且事件类型为opened时,提取PR编号、分支等信息; - 调用Jenkins远程构建接口传递参数。
示例核心代码片段:
import requests import time GITHUB_PAT = "your_pat_token" REPO = "owner/repo_name" JENKINS_URL = "http://localhost:8080/job/YourBuildJob/buildWithParameters" JENKINS_TOKEN = "your_jenkins_trigger_token" last_event_id = None while True: headers = {"Authorization": f"token {GITHUB_PAT}"} if last_event_id: headers["If-None-Match"] = last_event_id try: # 长轮询请求,超时30秒 response = requests.get(f"https://api.github.com/repos/{REPO}/events", headers=headers, timeout=35) if response.status_code == 304: # 无新事件,立即重试 continue events = response.json() if not events: time.sleep(1) continue last_event_id = response.headers.get("ETag") # 遍历事件,处理PR创建事件 for event in events: if event["type"] == "PullRequestEvent" and event["payload"]["action"] == "opened": pr_number = event["payload"]["pull_request"]["number"] head_branch = event["payload"]["pull_request"]["head"]["ref"] # 触发Jenkins构建 jenkins_params = { "token": JENKINS_TOKEN, "PR_NUMBER": pr_number, "HEAD_BRANCH": head_branch } requests.post(JENKINS_URL, params=jenkins_params) except requests.exceptions.Timeout: # 超时后立即重试 continue except Exception as e: print(f"Error: {e}") time.sleep(5)
3. 配置Jenkins允许远程触发
- 进入Jenkins系统配置,勾选“允许通过远程方式触发构建”;
- 设置触发令牌(对应脚本中的
JENKINS_TOKEN); - 确保你的Jenkins任务支持接收PR编号、分支等参数(如果需要传递给编译脚本)。
4. 脚本后台运行
将脚本设置为本地开机自启服务:
- Linux下可创建systemd服务单元,确保脚本后台持续运行;
- Windows下可通过任务计划程序设置开机启动,隐藏窗口运行。
关键优势
- 无公网暴露:脚本和Jenkins都在本地网络,无需ngrok等工具;
- 非定时轮询:采用长轮询机制,仅在有事件或超时后重新请求,接近实时触发;
- 无权限依赖:仅需个人GitHub PAT(无需仓库管理员权限);
- 无插件风险:所有逻辑由外部脚本实现,避免使用有漏洞的Jenkins插件。
内容的提问来源于stack exchange,提问作者Maria
相关产品推荐
相关产品推荐

