一款用Go编写的,由开源社区驱动的代码托管平台Gitea

一、介绍

Gitea是一个由开源社区驱动的轻量级的代码托管解决方案,后端采用Go语言编写,采用MIT许可证协议。使用Gitea可以搭建一个自己托管的Git服务程序,与Github、Bitbucket和Gitlab比较类似,但更加轻量。Gitea是2016年11月从Gogs发展出来,并且做了很多改进,目标就是创建一个极易安装、运行快速、体验良好的自建Git服务。目前在Github上有16.9k个Star、1.9k个fork,657个贡献者,社区活力非常强劲,并且云原生下的Jenkins X也在支持Gitea,相信在不远的未来,一定能成为一款成熟的云原生下的Git服务平台。

二、特性

Gitea目前的功能特性也很强大,能够满足内部Git服务的基本要求,支持如下特性:

支持活动时间线

支持 SSH 以及 HTTP/HTTPS 协议

支持 SMTP、LDAP 和反向代理的用户认证

支持反向代理子路径

支持用户、组织和仓库管理系统

支持添加和删除仓库协作者

支持仓库和组织级别 Web 钩子(包括 Slack 集成)

支持仓库 Git 钩子和部署密钥

支持仓库工单(Issue)、合并请求(Pull Request)以及 Wiki

支持迁移和镜像仓库以及它的 Wiki

支持在线编辑仓库文件和 Wiki

支持自定义源的 Gravatar 和 Federated Avatar

支持邮件服务

支持后台管理面板

支持 MySQL、PostgreSQL、SQLite3, MSSQL 和 TiDB(实验性支持) 数据库

支持多语言本地化(21 种语言)

与其他Git托管工具的横向比较

以Gitea官网为主,由于并未定时检查,有些特性可能并不是最新的。

1、主要特性

2、代码管理

3、Issue 管理

4、Pull/Merge requests

5、第三方集成

三、安装

Gitea提供了多个平台、多种安装方式,不管是独立安装、容器部署还是基于源码安装都支持。

1、从Docker安装

在Docker Hub里有Gitea最新的Docker镜像,并且会保持持续更新,可以使用docker pull命令来拉取Gitea的镜像。

dockerpull gitea/gitea:latest

使用docker安装需要注意一点:容器每次启动都会基于镜像原始状态,因此每次重启时,容器内部所做的更改都会丢失。特别是对于需要持久化的代码仓库数据,一定要将目录挂载出来,防止容器重启丢失。假如,在外部磁盘有一个/var/lib/gitea的目录,我们可以这样启动docker容器:

docker run -d --name=gitea -p10022:22-p10080:3000-v /var/lib/gitea:/data gitea/gitea:latest

当容器成功启动后,就可以在浏览器中输入http://localhost:10080进行访问,可以尝试在上面创建项目,使用git clone ssh://git@hostname:10022/username/repo.git进行clone操作。

2、Linux安装

在Gitea的Github页面的Release里可以下载官方发布的任意版本的安装程序,在安装程序里默认集成了SQLite,同时也支持MySQL和PostgreSQL,以及所有需要的资源都已经嵌入到安装程序里。

以systemd方式运行

在命令行里执行如下命令,拷贝gitea.service里的内容,并取消和修改里面的初始化参数,如:user的home目录、自定义的端口等。

sudovim /etc/systemd/system/gitea.service

修改完后,激活gitea并将其作为系统自启动服务:

sudosystemctl enable giteasudosystemctl start gitea

3、Window安装

Window的安装程序也可以在Gitea的Github页面的Release里可以下载官方发布的任意版本,一个独立的安装包就可以启动运行。

要注册为Window的服务,首先要以Administrator身份运行 cmd,然后执行以下命令,其中C:\gitea为你安装Gitea的目录:

sccreategiteastart=autobinPath=""C:\gitea\gitea.exe" web --config "C:\gitea\custom\conf\app.ini""

之后在控制面板打开 “Windows Services”,搜索 “gitea”,右键选择 “Run”。在浏览器打开 http://localhost:3000 就可以访问了。(如果你修改了端口,请访问对应的端口,3000是默认端口)。

4、源码安装

因为Gitea是用Go语言编写,首先需要安装GoLang,并且已经安装了Git版本控制工具。

下载源码

首先需要从github上获取Gitea的源码,使用如下命令clone源码:

gitclonehttps://github.com/go-gitea/gitea.gitcd./gitea

编译源码

这里默认下载master分支,如果使用其他分支,可以checkout到目标分支。下面使用go build进行编译。

go build

测试程序

在执行了以上步骤之后,你将会获得 gitea 的二进制文件,在命令行执行./gitea web启动程序,也能打开上面的界面。

四、使用

组织结构

代码托管平台虽然是用来托管代码的,但代码库以及用户本身都会有组织的属性。代码库要属于系统、应用、项目或产品,而这些又属于某个团队、某个部门,同样,开发人员也有自己的团队、和部门。这些都在统计代码提交数据时都是非常重要的维度。在Gitea里,可以通过创建组织以及下一级的团队来实现组织结构,但不能创建多级组织。如下图所示:EE是一级组织(只支持字母和数字),在EE组织下面,可以创建多个团队,目前创建了DevOps这个团队。还可以看到整个组织以及团队的成员和代码库。

创建代码库

组织结构创建好了,就可以创建代码库了,在创建代码库的时候,可以选择这个代码库归属于哪个组织,以及代码库名称、描述和其他代码库相关的信息。

代码库页面

创建好的代码库如下所示,这个界面相信大家都非常熟悉了,和Github和Gitlab非常相似。

代码下载和提交

使用http或ssh协议将源码下载,然后修改README.md文件,增加“这是一个不错的git server”。然后,git add ,git commit,git push将变更提交到远程服务器上。

刷新代码库页面,可以发现README.md文件已经变了,同时提交数为2个。

查看变更

点开“2次提交”可以显示提交历史,当前有2次提交,第二次就是刚才的提交信息,包括提交者、commitID,备注,提交时间等信息。

点击CommitID就会打开本次提交的Diff视图,能够清晰的看到本次变更的内容。

Fork代码

如何要开发一个新需求,可以fork新建一个自己的代码仓库。

在fork后的代码库上提交变更。修改内容为README.md文件,增加“我觉得也是”。

合并请求

假如此时变更开发完成,需要合并到主干,可以创建合并请求。

合并请求创建完成后,可以在源代码库的合并请求标签页中显示请求信息,也包含讨论动态、代码提交和文件变动等信息。

经过检查,代码可以合入到主干后,可以点击“合并请求”按钮,将提交的请求进行合并。合并之前,该合并请求的状态就变成“已合并”。

同时,从提交图中也可以看出合并的操作。

除此之外,gitea还可以创建工单、版本发布、百科和动态的功能,大家可以去尝试,这里就不一一罗列了。

五、总结

如今,版本控制系统经过集中式的控制时代,进入了分布式版本控制时代,而分布式版本控制,用的非常多的工具就是Git,Git可以不仅可以实现代码的版本控制,还可以实现文档等二进制文件的版本控制,在基础设施及代码最佳实践中,所有基础设施的构建已经版本控制都会采用Git进行管理。

Gitea作为一个用Go语言编写的轻量级的Git Server,能够满足DevOps几乎全部的版本控制场景。Gitea的社区非常活跃,功能仍旧在不断完善中。另外,Jenkins X 云原生时代的CICD框架也开始支持Gitea,虽然目前还有问题。云原生时代的CICD与Git的结合,能够大大提高代码构建、环境准备、环境部署的效率。

DevOps提高的是效率和质量,选择一款合适的Git Server也是其中重要的一环,期待Gitea越来越好,成为云原生时代的爆款。