Table of Contents

1. 前言

Gitea是一款使用Golang编写的可自运营的代码管理工具。

在这个领域,名气最响的应该是Gitlab。但实际使用中Gitlab也有点问题,首先就是资源占用。Gitlab是使用ruby编写的,好几年之前刚出来的时候,一台1G内存的虚拟主机连安装运行都做不到,着实震惊。时至今日都已经发展到了以docker镜像分发,gitlab仍旧会有体积和运行时资源占用的问题。另一点就是功能,对于一般标准团队来说,gitlab的功能太过于丰富,这是往好的地方说,往坏的地方说就是它包含了太多不需要的东西,而这些东西还占用磁盘和运行时资源。

于是着手查看开源的alternative方案,很快就找到了golang研发的gitea。使用golang研发的软件分发都很容易,体积小,安装使用简单,运行时占用资源少。且gitea的功能很完备,某些自身不具备的功能也能通过第三方来解决,比如CI就可以结合同样是golang研发的drone来实施。

相关资源:

2. 使用

2.1 安装启动

安装使用仍旧推荐使用官方镜像: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                                              # 秘钥文件

2.2 配置

官方文档在:配置说明

映射路径在容器内的/data/gitea/conf/app.ini。一般主要是URL和端口之类的需要调整下,还有就是数据库的访问方式。

2.3 Command Line

gitea还可以作为一个命令行工具来执行CLI命令,官方文档在:Command Line。执行的时候可能还会需要用到部分环境变量,见:环境变量清单

不过作为命令行工具来使用的机会比较少见。

2.4 API

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"

2.5 访问授权

授权主要有两种方式。

2.5.1 Token授权

Token授权是最简单的。通过发行token,让拥有token的终端可以直接调用API进行操作。

发行Token也很简单:

  • 点击右上角用户头像
  • 点击下拉菜单的设置
  • 点击新页面导航栏中间的应用
  • 管理Access Tokens部分输入Token名,点击生成令牌

需要注意的是,令牌生成之后内容只会展现一次,后续就只有删除操作。如果遗忘的话就只能删除然后申请新的了。

2.5.2 OAuth2授权

OAuth2也算是现在比较常见的授权方法,和Token不同的是两者的应用场景:

  • Token:更多的用在自动化部署等,需要简单访问权限的场景
  • OAuth2:更多的用在第三方应用程序和gitea的整合,比如CI工具等

操作上也很简单,在Token同一界面上的管理 OAuth2 应用程序界面部分,按提示操作即可。一样的,秘钥只会在创建完成后展示一次,后续秘钥只能重置,不能再次展示。

EOF