本文发表于入职啦(公众号: ruzhila) 大家可以访问入职啦学习更多的编程实战。
🎉 100行Golang代码实现Git HTTP服务器,无需Nginx和fcgiwrap,Golang Web编程 实用项目 👏 🎉
项目地址
代码已经开源, go-git-server 👏 欢迎Star
代码运行效果:
所有的项目都在github上开源:100-line-code 欢迎Star 👏
用100行代码的不同语言(Java、Python、Go、Javascript、Rust)实现项目,通过讲解项目的实现,帮助大家学习编程
我们会定期在群里分享最新的项目实战代码,包括不同语言的实现
老师还会详细讲解代码优化的思路,可在我们的官网扫码入群哦
Git server的工作原理
Git是一个分布式版本控制系统,它的工作原理是通过SSH
或者HTTP
协议访问远程仓库,进行代码的上传和下载
最常用的就是github
和gitee
,他们分别都支持SSH
或者HTTP
协议
ssh
协议是最安全的,但是需要配置公钥和私钥,不方便使用,服务器通过ssh
协议监听22端口提供服务
http
协议是最常用的,不需要配置公钥和私钥,只需要输入用户名和密码就可以访问, 一般需要Nginx或者apache搭配fcgiwrap来提供服务
为什么需要Git HTTP服务器
如果你要搭建一个私有化的gitserver, 会有很多解决方案,开源的gitlab
和gitea
都是非常好的选择,这些产品都是非常成熟的产品,提供了很多功能
但是如果你只是想搭建一个简单的gitserver, 用来做运维和测试,或者用来学习git的工作原理,可能就不需要这么复杂的产品了
如果要自建Git HTTP
服务器,一般需要Nginx
或者Apache
搭配fcgiwrap
来提供服务,这样会比较复杂,而且不够灵活, 很多教程都是基于Apache或者Nginx的,这样会增加学习成本
根据官方文档,Git HTTP服务器的工作原理是通过CGI来实现的,所以Nginx的方案中,一般需要搭配fcgiwrap
来提供服务:
如果要启动Git http server
, 就必须启动fcgiwrap
和Nginx
其实git http server
本质上是一个CGI
程序,只要实现了CGI
协议,就可以提供服务
Git HTTP服务器的实现
我们通过Go语言实现一个简单的Git HTTP服务器,只有100行代码,不需要Nginx
和fcgiwrap
,只需要一个可执行文件就可以运行
这样的git server就非常方便作为CI/CD的一个组件,可以直接部署到生产环境
我们这个版本不支持TLS和认证,只是一个简单的实现,如果要用于生产环境,需要增加认证和TLS支持
我们知道git http server的工作原理是通过CGI
来实现的,所以我们只需要实现CGI协议就可以提供服务
go内置的cgi的库,无需依赖其他库
代码解析
先上代码:
查看源代码
代码主要是3部分完成:
main的初始化
一个好用的程序的最基本功能是可以通过命令行参数来配置,所以我们通过flag
包来解析命令行参数:
- 64-70行 解析命令行参数
- 72-82行 执行git仓库的初始化,不需要额外的初始化命令,相当于做了一个简单的脚手架
CreateRespository 函数
这个函数在39-61行,主要是通过os/exec
包来执行git仓库的初始化,这个相当于执行了一个shell脚本
- 52-55行
exec.Command
执行shell命令,并且把输出重定向到os.Stdout
,这样就可以看到执行的结果
HandleGit函数
这个是CGI服务的关键函数,其实非常简单:
- 20-34行 构造一个
cgi.Handler
, 将CGI需要的基本参数传递个/usr/bin/git
这个程序 - 36行 调用
cgi.ServeHTTP
函数,这个函数会自动解析CGI的环境变量,然后执行/usr/bin/git
程序,执行git的操作
git的客户端通过http
协议访问这个服务,这个服务会调用/usr/bin/git
程序,然后返回结果给客户端
我们既不需要解析git协议,只需要用go实现一个简单桥接程序就可以了
非常简单和好用,只需要一个可执行文件就可以运行,在我的电脑上,只有7M不到的大小就可以实现git server。
总结
通过go-git-server学习了Go语言的Web编程, 了解了Git服务器的工作原理,对于学习Git和Go语言都是非常有帮助的
Docker也是非常重要的技术,提供了Dockerfile,可以直接部署到生产环境
交流
我们构建了一个100行代码项目的实战群,大家可以扫码加入,一起学习编程
官网有入群方式:入职啦官网
也可以访问入职啦学习更多的编程实战
所有的代码都在github上开源:100-line-code 欢迎Star 👏