项目地址

Git server的工作原理

为什么需要Git HTTP服务器

Git HTTP服务器的实现

代码解析

main的初始化

CreateRespository 函数

HandleGit函数

总结

交流

100行Go代码实现Git HTTP服务器,无需Nginx和fcgiwrap

本文发表于入职啦(公众号: ruzhila) 大家可以访问入职啦学习更多的编程实战。

🎉 100行Golang代码实现Git HTTP服务器,无需Nginx和fcgiwrap,Golang Web编程 实用项目 👏 🎉

项目地址

代码已经开源, go-git-server 👏 欢迎Star

代码运行效果: go-git-servergo

所有的项目都在github上开源:100-line-code 欢迎Star 👏

用100行代码的不同语言(Java、Python、Go、Javascript、Rust)实现项目,通过讲解项目的实现,帮助大家学习编程

我们会定期在群里分享最新的项目实战代码,包括不同语言的实现

老师还会详细讲解代码优化的思路,扫码加入实战群:

入群学习

Git server的工作原理

Git是一个分布式版本控制系统,它的工作原理是通过SSH或者HTTP协议访问远程仓库,进行代码的上传和下载

最常用的就是githubgitee,他们分别都支持SSH或者HTTP协议

ssh 协议是最安全的,但是需要配置公钥和私钥,不方便使用,服务器通过ssh协议监听22端口提供服务 http 协议是最常用的,不需要配置公钥和私钥,只需要输入用户名和密码就可以访问, 一般需要Nginx或者apache搭配fcgiwrap来提供服务

为什么需要Git HTTP服务器

如果你要搭建一个私有化的gitserver, 会有很多解决方案,开源的gitlabgitea都是非常好的选择,这些产品都是非常成熟的产品,提供了很多功能

但是如果你只是想搭建一个简单的gitserver, 用来做运维和测试,或者用来学习git的工作原理,可能就不需要这么复杂的产品了

如果要自建Git HTTP服务器,一般需要Nginx或者Apache搭配fcgiwrap来提供服务,这样会比较复杂,而且不够灵活, 很多教程都是基于Apache或者Nginx的,这样会增加学习成本

根据官方文档,Git HTTP服务器的工作原理是通过CGI来实现的,所以Nginx的方案中,一般需要搭配fcgiwrap来提供服务:

nginx

如果要启动Git http server, 就必须启动fcgiwrapNginx

其实git http server 本质上是一个CGI程序,只要实现了CGI协议,就可以提供服务

Git HTTP服务器的实现

我们通过Go语言实现一个简单的Git HTTP服务器,只有100行代码,不需要Nginxfcgiwrap,只需要一个可执行文件就可以运行 这样的git server就非常方便作为CI/CD的一个组件,可以直接部署到生产环境

我们这个版本不支持TLS和认证,只是一个简单的实现,如果要用于生产环境,需要增加认证和TLS支持

我们知道git http server的工作原理是通过CGI来实现的,所以我们只需要实现CGI协议就可以提供服务

go内置的cgi的库,无需依赖其他库

代码解析

先上代码:

code

代码主要是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 👏

友情链接:

Copyright© 2024 杭州园中葵科技有限公司 版权所有