新一代开源代码托管平台Gitea

概述

Gitea 是一个轻量级的 DevOps 平台软件。从开发计划到产品成型的整个软件生命周期,他都能够高效而轻松的帮助团队和开发者。包括 Git 托管、代码审查、团队协作、软件包注册和 CI/CD。它与 GitHub、Bitbucket 和 GitLab 等比较类似。Gitea 最初是从Gogs分支而来,几乎所有代码都已更改

Gitea是一个基于Go语言开发的开源自助Git服务,它是Gogs的一个分支(或者说是一个社区驱动的Fork)。Gogs是一款轻量级的自助Git服务,最初由Unknwon开发,于2014年5月发布首个版本。然而,由于Gogs项目的一些社区成员对项目的发展方向和功能有不同的看法,并希望推动一些新的特性和改进,因此一些社区成员选择从Gogs分叉出一个新的项目,这就是Gitea。

目标

Gitea的首要目标是创建一个极易安装,运行非常快速,安装和使用体验良好 的自建 Git 服务。

采用Go作为后端语言,只需生成一个可执行程序即可。支持 Linux, macOS 和 Windows等多平台, 支持主流的x86,amd64、 ARM 和 PowerPC等架构。

功能特性

  • 代码托管:Gitea⽀持创建和管理仓库、浏览提交历史和代码⽂件、审查和合并代码提交、管理协作者、管理分⽀等。它还⽀持许多常见的Git特性,⽐如标签、Cherry-pick、hook、集成协作⼯具等。
  • 轻量级和快速: Gitea 的设计目标之一就是轻量级和快速响应。它不像一些大型的代码托管平台那样臃肿,因此在性能方面表现出色,适用于资源有限的服务器环境。由于其轻量级设计,Gitea 在资源消耗方面相对较低,可以在资源有限的环境下运行良好。
  • 易于部署和维护: 轻松地部署在各种服务器上,不需要复杂的配置和依赖。这使得个人开发者或小团队可以方便地设置和管理自己的 Git 服务。
  • 安全性: Gitea 注重安全性,提供了用户权限管理、访问控制列表等功能,可以确保代码和数据的安全性。
  • 代码评审:代码评审同时支持 Pull Request workflow 和 AGit workflow。评审⼈可以在线浏览代码,并提交评审意见或问题。提交者可以接收到评审意见,并在线回 复或修改代码。代码评审可以帮助用户和企业提⾼代码质量。
  • CI/CD: Gitea Actions⽀持 CI/CD 功能,该功能兼容 GitHub Actions,⽤⼾可以采用熟悉的YAML格式编写workflows,也可以重⽤⼤量的已有的 Actions 插件。Actions 插件支持从任意的 Git 网站中下载。
  • 项目管理:Gitea 通过看板和⼯单来跟踪⼀个项⽬的需求,功能和bug。⼯单⽀持分支,标签、⾥程碑、 指派、时间跟踪、到期时间、依赖关系等功能。
  • 制品库: Gitea支持超过 20 种不同种类的公有或私有软件包管理,包括:Cargo, Chef, Composer, Conan, Conda, Container, Helm, Maven, npm, NuGet, Pub, PyPI, RubyGems, Vagrant等
  • 开源社区支持: Gitea 是一个基于 MIT 许可证的开源项目,Gitea 拥有一个活跃的开源社区,能够持续地进行开发和改进,同时也积极接受社区贡献,保持了平台的更新和创新。
  • 多语言支持:Gitea 提供多种语言界面,适应全球范围内的用户,促进了国际化和本地化。

其他版本控制系统的比较

Gitea、GitLab 和 GitHub 都是流行的版本控制系统,它们在某些方面有所不同。

1. 功能特点:

Gitea:轻量级的 Git 服务,提供基本的代码托管、问题跟踪、团队协作等功能,适合个人开发者和小团队使用。GitLab:功能丰富的全面开源平台,提供了包括代码托管、CI/CD、问题跟踪、Wiki 等在内的一系列功能,适合中小型企业和大型团队使用。GitHub:全球最大的代码托管平台,提供了强大的社交功能和广泛的集成,是开源社区、个人开发者和企业最受欢迎的版本控制系统之一。

2. 部署方式:

Gitea:轻量级、易于部署,可以在个人服务器上快速搭建。GitLab:功能丰富,部署和配置相对复杂,适合需要定制化和扩展性的场景。GitHub:作为托管服务,无需用户自行部署,但提供了企业版 GitHub Enterprise,可以在私有环境中部署。

3. 扩展性:

Gitea:作为轻量级的 Git 服务,扩展性较有限,但支持丰富的插件和自定义配置。GitLab:提供了丰富的集成和扩展功能,可以满足不同规模和需求的团队。GitHub:提供了大量的集成和第三方应用,但定制化程度相对较低。

4. 社区支持:

Gitea:作为一个相对较新的项目,社区规模相对较小,但活跃度不断增加。GitLab:拥有庞大的社区支持和活跃的开发者社区,提供了丰富的文档和支持资源。GitHub:拥有庞大的开发者社区和全球范围的用户基础,是开源社区的首选平台之一。

5. 商业化支持:

Gitea:目前主要由社区贡献者维护,没有官方的商业支持。GitLab:提供了企业版和托管服务 GitLab.com,以及专业的技术支持和咨询服务。GitHub:作为微软旗下的产品,提供了企业版 GitHub Enterprise 和 GitHub Actions 等商业化服务。

安装

这里使用二进制文件安装。所有打包的二进制程序均包含 SQLite,MySQL 和 PostgreSQL 的数据库连接支持,同时网站的静态资源均已嵌入到可执行程序中,这一点和曾经的 Gogs 有所不同。

使用wget 下载

使用以下命令下载适用于 64-bit Linux 平台的二进制文件。

代码语言:javascript
复制
wget -O gitea https://dl.gitea.com/gitea/1.21.1/gitea-1.21.1-linux-amd64
chmod +x gitea
服务器设置

创建工作路径并赋予权限

代码语言:javascript
复制
sudo mkdir -p /var/lib/gitea/{custom,data,log}
sudo chown -R www:www /var/lib/gitea/
sudo chmod -R 750 /var/lib/gitea/

创建配置路径并赋予权限

代码语言:javascript
复制
sudo mkdir /etc/gitea
sudo chown root:www /etc/gitea
sudo chmod 770 /etc/gitea

配置 Gitea 工作路径

提示: 如果使用 Systemd 管理 Gitea 的 Linux 服务,你可以采用WorkingDirectory参数来配置工作路径。否则,使用环境变量GITEA_WORK_DIR来明确指出程序工作和数据存放路径。

代码语言:javascript
复制
export GITEA_WORK_DIR=/var/lib/gitea/

复制二进制文件到全局位置

代码语言:javascript
复制
cp gitea /usr/local/bin/gitea

运行 Gitea

代码语言:javascript
复制
GITEA_WORK_DIR=/var/lib/gitea/ /usr/local/bin/gitea web -c /etc/gitea/app.ini
以 service 方式运行

新建gitea.service 服务文件。

代码语言:javascript
复制
sudo vim /etc/systemd/system/gitea.service

示例代码 gitea.service

代码语言:javascript
复制
[Unit]
Description=Gitea (Git with a cup of tea)
After=network.target
###
# Don't forget to add the database service dependencies
###
#
#Wants=mysql.service
#After=mysql.service
#
#Wants=mariadb.service
#After=mariadb.service
#
#Wants=postgresql.service
#After=postgresql.service
#
#Wants=memcached.service
#After=memcached.service
#
#Wants=redis.service
#After=redis.service
#
###
# If using socket activation for main http/s
###
#
#After=gitea.main.socket
#Requires=gitea.main.socket
#
###
# (You can also provide gitea an http fallback and/or ssh socket too)
#
# An example of /etc/systemd/system/gitea.main.socket
###
##
## [Unit]
## Description=Gitea Web Socket
## PartOf=gitea.service
##
## [Socket]
## Service=gitea.service
## ListenStream=<some_port>
## NoDelay=true
##
## [Install]
## WantedBy=sockets.target
##
###

[Service]

Uncomment the next line if you have repos with lots of files and get a HTTP 500 error because of that

LimitNOFILE=524288:524288

RestartSec=2s
Type=simple
User=git
Group=git
WorkingDirectory=/var/lib/gitea/

If using Unix socket: tells systemd to create the /run/gitea folder, which will contain the gitea.sock file

(manually creating /run/gitea doesn't work, because it would not persist across reboots)

#RuntimeDirectory=gitea
ExecStart=/usr/local/bin/gitea web --config /etc/gitea/app.ini
Restart=always
Environment=USER=git HOME=/home/git GITEA_WORK_DIR=/var/lib/gitea

If you install Git to directory prefix other than default PATH (which happens

for example if you install other versions of Git side-to-side with

distribution version), uncomment below line and add that prefix to PATH

Don't forget to place git-lfs binary on the PATH below if you want to enable

Git LFS support

#Environment=PATH=/path/to/git/bin:/bin:/sbin:/usr/bin:/usr/sbin

If you want to bind Gitea to a port below 1024, uncomment

the two values below, or use socket activation to pass Gitea its ports as above

#CapabilityBoundingSet=CAP_NET_BIND_SERVICE
#AmbientCapabilities=CAP_NET_BIND_SERVICE

In some cases, when using CapabilityBoundingSet and AmbientCapabilities option, you may want to

set the following value to false to allow capabilities to be applied on gitea process. The following

value if set to true sandboxes gitea service and prevent any processes from running with privileges

in the host user namespace.

#PrivateUsers=false

[Install]
WantedBy=multi-user.target

修改userhome目录以及其他必须的初始化参数,如果使用自定义端口,则需修改 PORT 参数,反之如果使用默认端口则需删除 -p 标记。激活 gitea 并将它作为系统自启动服务

代码语言:javascript
复制
sudo systemctl enable gitea
sudo systemctl start gitea

查看服务状态

代码语言:javascript
复制
sudo systemctl status gitea.service

使用

服务启动没问题,就可以通过公网IP+3000端口访问了

Nginx配置
代码语言:javascript
复制
server {
listen 80 ;
server_name git.tinywan.com;
location / {
proxy_pass http://localhost:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}

通过配置域名访问

创建仓库

代码语言:javascript
复制
PS D:\frontend\webman.tinywan.com> git push
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 214 bytes | 53.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
remote: . Processing 1 references
remote: Processed 1 references in total
To http://git.tinywan.com/resty/webman.tinywan.com.git

  • [new branch] main -> main