使用钩子的极简Git CI
摘要
一篇博客文章,描述了使用Git钩子和轻量级任务队列nq,为个人Git仓库搭建的最小化CI系统。
<p><a href="https://lobste.rs/s/jr72dt/minimal_git_ci_using_hooks">评论</a></p>
查看缓存全文
缓存时间: 2026/07/20 09:34
# 使用 Git 钩子的最小化 CI
来源:https://mccd.space/posts/26-06-29/simple-git-ci
我有一台个人服务器,用于托管我的 Git 仓库。新建一个 Git 仓库很简单:通过 SSH 登录到服务器,进入一个新目录,然后运行 `git init --bare`,就完成了。克隆新建的仓库也只需 `git clone server:/home/me/repo`。
对于某些项目,我需要一个 CI(持续集成),于是寻找了一些现有方案。我找到的 CI 系统要么复杂冗长、充满 YAML,要么速度慢、混乱,或者难以自托管。
幸运的是,我并不需要很多“现代” CI 特性,比如完全隔离的构建环境或机密管理。我只需要运行一些测试、构建项目或移动文件的功能。
我最终采用的方案是基于 Git 钩子([Git Hooks](https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks))的简单 CI。具体来说,我添加了一个远程 `post-receive` 钩子——这个钩子会在每次推送项目时执行。它只是一个放在裸 Git 仓库 `hooks` 目录下的 Shell 脚本。
使用 `post-receive` 钩子需要注意:如果脚本执行失败,推送的代码会被拒绝。另外,如果脚本执行很慢,推送过程也会变慢。通常这两者我们都希望避免。我通过使用 [nq](https://git.vuxu.org/nq/about/)(一个最小化的作业队列)来解决这个问题,它将作业放到后台排队。效果非常简洁:我的 post-receive 钩子只需执行 `nq`,然后我可以通过运行 `ssh server nqtail -a` 来查看日志。
CI 即时运行,设置也非常简单,因此我对这个结果很满意。如果你想自己搭建,我写了一份简短的[教程](https://mccd.space/wiki/tutorial-git-repo.shtml)。
基于我在教程中提供的基础,你还可以进行很多扩展:例如使用 [landdown](https://mccd.space/git/landdown/file/README.md.html) 对构建进行沙盒隔离,使用 Podman 将构建与外部环境隔离开,或者使用 [sops](https://github.com/getsops/sops) 管理机密。对于集市风格的开发,通过电子邮件接收 Git 补丁就足够了。你也可以通过 git-shell 或 git http-backend 搭建大教堂风格的开发流程。
[回复](mailto:[email protected]?subject=Re%3A%20Minimal%20Git%20CI%20using%20hooks)
相似文章
@zebassembly:疯狂的想法,但如果 CI 不是一场由 YAML 堆砌的噩梦呢?
一条推文提出 CI 不必是 YAML 噩梦,并重点介绍了 Cloudflare 在 Workflows 上的新 CI,该 CI 与 Artifacts 存储和部署相结合。
问HN:GitHub的替代方案
Hacker News 上的讨论帖探讨 GitHub 的替代方案,用户分享使用 GitLab 自建的经验并比较 CI/CD 解决方案。
Git在任何规模下(27分钟阅读)
本文解释了在大规模下托管Git仓库的困难,重点关注Git的packfile设计和分布式特性,并概述了潜在的解决方案。
本地 Git 远程仓库
关于如何使用裸仓库为个人项目设置本地 Git 远程仓库的教程,支持离线友好的推/拉工作流。
我将 Git 变成了工程团队和多个 Claude Code 会话的共享上下文层
作者开发了一个名为 MEX 的开源项目,该项目使用 Git 作为编码代理的共享记忆层,使上下文能够版本控制并在工程团队中共享。