Gitea是一款使用Golang编写的可自运营的代码管理工具。
在这个领域,名气最响的应该是Gitlab。但实际使用中Gitlab也有点问题,首先就是资源占用。Gitlab是使用ruby编写的,好几年之前刚出来的时候,一台1G内存的虚拟主机连安装运行都做不到,着实震惊。时至今日都已经发展到了以docker镜像分发,gitlab仍旧会有体积和运行时资源占用的问题。另一点就是功能,对于一般标准团队来说,gitlab的功能太过于丰富,这是往好的地方说,往坏的地方说就是它包含了太多不需要的东西,而这些东西还占用磁盘和运行时资源。
于是着手查看开源的alternative方案,很快就找到了golang研发的gitea。使用golang研发的软件分发都很容易,体积小,安装使用简单,运行时占用资源少。且gitea的功能很完备,某些自身不具备的功能也能通过第三方来解决,比如CI就可以结合同样是golang研发的drone来实施。
相关资源:
安装使用仍旧推荐使用官方镜像:gitea/gitea。官方指引:从Docker安装。
localbuild_gitea:
image: gitea/gitea:1.10.0
container_name: localbuild_gitea
hostname: localbuild_gitea
networks:
- net
ports:
- 13000:13000
- 122:122
logging:
driver: json-file
options:
max-size: 512m
restart: always
healthcheck:
test: wget http://127.0.0.1:13000 -q -O - > /dev/null 2>&1
interval: 10s
timeout: 20s
retries: 10
volumes:
- ./vendor/gitea:/data
关于启动时的环境变量相关,官方有一个讨论帖:Configure with env variables #350,但貌似还没有任何结论,当前最佳实践是做好配置文件之后映射到容器内。
关于gitea使用的数据库,如果是默认配置的话,是会使用Postgre数据库,存放在容器内的/data/gitea/gitea.db
位置。
gitea的数据全部都放在容器内的/data
文件夹下,一般需要将这个文件夹映射出来。
/data
文件夹内部文件结构如下:
/-
| git /- # 存放所有git仓库数据
| | repositories /- # 代码库存放位置
| | | fullstack /- # 组织
| | | | common.git # 组织下的代码库
| | | | gateway.git
| | | | server.git
| gitea /- # 存放gitea自身的系统文件
| | conf /-
| | | app.ini # gitea配置文件
| | log # gitea日志文件
| | gitea.db # Postgre数据库文件
| ssh # 秘钥文件
官方文档在:配置说明。
映射路径在容器内的/data/gitea/conf/app.ini
。一般主要是URL和端口之类的需要调整下,还有就是数据库的访问方式。
gitea还可以作为一个命令行工具来执行CLI命令,官方文档在:Command Line。执行的时候可能还会需要用到部分环境变量,见:环境变量清单。
不过作为命令行工具来使用的机会比较少见。
gitea提供RESTful的API,这块是自动化的主力,需要好好看下如何使用。
官方API文档在:Gitea API 使用指南。这篇指引主要是阐明了如何使用API,如何处理访问控制之类的。具体的API调用参数和返回值,以及API列表,可以查看官方的swagger:Gitea API.。
给几个curl调用的例子:
在fullstack组织下,创建代码库common
$ curl -X POST "http://127.0.0.1:13000/api/v1/admin/users/fullstack/repos" \
-H "accept: application/json" \
-H "Authorization: token 752e305de4936a769d2ed962b3e019f8866e510a" \
-H "Content-Type: application/json" -d "{ \"name\": \"common\", \"auto_init\": false, \"private\": true }"
删除fullstack组织下的代码库common
$ curl -X DELETE "http://127.0.0.1:13000/api/v1/repos/fullstack/common" \
-H "accept: application/json" \
-H "Authorization: token 752e305de4936a769d2ed962b3e019f8866e510a"
授权主要有两种方式。
Token授权是最简单的。通过发行token,让拥有token的终端可以直接调用API进行操作。
发行Token也很简单:
用户头像
设置
应用
管理Access Tokens
部分输入Token名,点击生成令牌
需要注意的是,令牌生成之后内容只会展现一次,后续就只有删除操作。如果遗忘的话就只能删除然后申请新的了。
OAuth2也算是现在比较常见的授权方法,和Token不同的是两者的应用场景:
操作上也很简单,在Token同一界面上的管理 OAuth2 应用程序
界面部分,按提示操作即可。一样的,秘钥只会在创建完成后展示一次,后续秘钥只能重置,不能再次展示。
EOF