本文发表于入职啦(公众号: ruzhila) 大家可以访问入职啦学习更多的编程实战。
🎉 100行Golang代码实现Git HTTP服务器,无需Nginx和fcgiwrap,Golang Web编程 实用项目 👏 🎉
项目地址
代码已经开源, go-git-server 👏 欢迎Star
代码运行效果:
所有的项目都在github上开源:100-line-code 欢迎Star 👏
用100行代码的不同语言(Java、Python、Go、Javascript、Rust)实现项目,通过讲解项目的实现,帮助大家学习编程
我们会定期在群里分享最新的项目实战代码,包括不同语言的实现
老师还会详细讲解代码优化的思路,扫码加入实战群:
![入群学习](/content/media/qrcode.jpg)
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行代码项目的实战群,大家可以扫码加入,一起学习编程
![入群学习](/content/media/qrcode.jpg)
也可以访问入职啦学习更多的编程实战
所有的代码都在github上开源:100-line-code 欢迎Star 👏