使用钩子的极简Git CI

Lobsters Hottest 工具

摘要

一篇博客文章,描述了使用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)

相似文章

问HN:GitHub的替代方案

Hacker News Top

Hacker News 上的讨论帖探讨 GitHub 的替代方案,用户分享使用 GitLab 自建的经验并比较 CI/CD 解决方案。

本地 Git 远程仓库

Hacker News Top

关于如何使用裸仓库为个人项目设置本地 Git 远程仓库的教程,支持离线友好的推/拉工作流。