Gitea介绍

Gitea概述

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

Gitea特性

功能特性
代码托管: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 介绍参考:关于Gitea

Gitea正式部署

资源获取

代码仓库计划采用轻量级开源 Gitea 技术栈。

  • 获取资源
    通过 helm 获取部署资源。
[root@master01 ~]# mkdir -p gitea/tls
[root@master01 ~]# cd gitea/
[root@master01 gitea]# helm repo add gitea https://dl.gitea.com/charts
[root@master01 gitea]# helm repo update

[root@master01 gitea]# helm pull gitea/gitea
[root@master01 gitea]# ll
total 448K
-rw-r--r-- 1 root root 445K Jan 10 12:21 gitea-12.4.0.tgz
drwxr-xr-x 2 root root    6 Jan 10 12:21 tls

准备证书

将证书上传至对应目录。

[root@master01 gitea]# ll tls/
total 12K
-rw-r--r-- 1 root root 4.4K Jan  9 20:58 gitea.k8sy.com.key
-rw-r--r-- 1 root root 1.7K Jan  9 20:58 gitea.k8sy.com.pem

[root@master01 tls]# kubectl -n mygitea create secret tls gitea-k8sy-com-cert \
  --cert=/root/gitea/tls/gitea.k8sy.com.pem \
  --key=/root/gitea/tls/gitea.k8sy.com.key

自定义配置

根据当前环境创建自定义配置:

  1. 开启ingress,并配置域名,使用提前创建的证书;
  2. 使用持久化存储,并直接使用已有的 StorageClass ;
  3. Valkey Cluster 与 Valkey 不可同时启用,PostgreSQL 与 PostgreSQL-HA 不可同时开启,默认开启了 Cluster 和 PostgreSQL-HA ,需要手动关闭;
  4. 设置相关持久卷的大小。

当前 helm 部署 gitea 会默认启用 Valkey Cluster 和 PostgreSQL-HA 且这两个组件为子 chart 方式引入,Valkey Cluster 充当缓存,PostgreSQL-HA 是高可以数据库,gitea 支持的数据库有多种,可以手动指定。
本环境为内部测试使用,将取消Valkey Cluster 和 PostgreSQL-HA ,采用 Valkey 和 PostgreSQL 。

提示:更多Gitea Chart 修改参考Gitea Helm Chart

  • 修改主配置
[root@master01 gitea]# cat >myvalues.yaml<<'EOF'
service:
  ssh:
    type: NodePort
    nodePort: 30022 
    externalTrafficPolicy: Local
    
ingress:
  enabled: true
  className: "nginx"
  hosts:
    - host: gitea.k8sy.com
      paths:
        - path: /
          pathType: Prefix
  tls:
    - secretName: gitea-k8sy-com-cert
      hosts:
        - gitea.k8sy.com

persistence:
  storageClass: "longhorn"
  size: 2Gi

valkey-cluster:
  enabled: false

valkey:
  enabled: true
  primary:
    persistence:
      storageClass: longhorn
      size: 1Gi

postgresql-ha:
  enabled: false

postgresql:
  enabled: true
  global:
    postgresql:
      auth:
        username: gitea
        password: giteaPass123
        database: gitea
      service:
        ports:
          postgresql: 5432
  primary:
    persistence:
      enabled: true
      storageClass: longhorn
      size: 2Gi

gitea:
  admin:
    username: gitadmin
    password: AdminPassword123
    email: admin@gitea.k8sy.com
  actions:
    ENABLED: true
EOF

正式部署

[root@master01 gitea]# helm upgrade --install gitea gitea/gitea --create-namespace --namespace mygitea -f myvalues.yaml

确认验证

  • 部署确认
[root@master01 gitea]# kubectl -n mygitea get pods -o wide
NAME                     READY   STATUS    RESTARTS   AGE   IP             NODE       NOMINATED NODE   READINESS GATES
gitea-875c84b98-sjhrm    1/1     Running   0          98s   10.10.30.73    worker02   <none>           <none>
gitea-postgresql-0       1/1     Running   0          87s   10.10.30.122   worker02   <none>           <none>
gitea-valkey-primary-0   1/1     Running   0          98s   10.10.19.127   worker03   <none>           <none>
[root@master01 gitea]# kubectl -n mygitea get svc -o wide
NAME                    TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE   SELECTOR
gitea-http              ClusterIP   None           <none>        3000/TCP       99s   app.kubernetes.io/instance=gitea,app.kubernetes.io/name=gitea
gitea-postgresql        ClusterIP   10.20.49.130   <none>        5432/TCP       99s   app.kubernetes.io/component=primary,app.kubernetes.io/instance=gitea,app.kubernetes.io/name=postgresql
gitea-postgresql-hl     ClusterIP   None           <none>        5432/TCP       99s   app.kubernetes.io/component=primary,app.kubernetes.io/instance=gitea,app.kubernetes.io/name=postgresql
gitea-ssh               NodePort    10.20.73.142   <none>        22:30022/TCP   99s   app.kubernetes.io/instance=gitea,app.kubernetes.io/name=gitea
gitea-valkey-headless   ClusterIP   None           <none>        6379/TCP       99s   app.kubernetes.io/instance=gitea,app.kubernetes.io/name=valkey
gitea-valkey-primary    ClusterIP   10.20.166.64   <none>        6379/TCP       99s   app.kubernetes.io/component=primary,app.kubernetes.io/instance=gitea,app.kubernetes.io/name=valkey
[root@master01 gitea]# kubectl -n mygitea get ingress -o wide
NAME    CLASS   HOSTS            ADDRESS         PORTS     AGE
gitea   nginx   gitea.k8sy.com   10.20.173.226   80, 443   105s
  • 访问确认

浏览器访问网页: https://gitea.k8sy.com

001

使用 gitadmin / AdminPassword123 登录平台。

002

登录后可以创建仓库、组织等。

003

客户端使用

git 客户端可使用 git 相关命令使用该仓库。

提示:建议使用 ssh 方式更安全,当前 gitea 部署在 Kubernetes 中,直接在 master01 节点查看已有 SSH 公钥,也可使用ssh-keygen -t rsa -f ~/.ssh/id_rsa -N '' -b 4096 -C "x120952576@126.com"生产公钥。

  • 公钥生成
[root@master01 ~]# cat /root/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCQi5CYD/PmrSHjuQJ682Hn5GsD7s4EfdIv8EZxiwsvWIf1mvPB8DXrFFgQpP++glP+cNiIeqFG+UN9Ce+Yu2jSdru+vpj5K/Oenm9vYkUf+XLl22mrSwN5Rhv/zJWDGtkWVe8SSapfw2OAOQyb+WVG/bRBbAQFLqCKgnz7WyZPtn7ab0OPajzBYzzBb76i5o9tHZ3WIfmi4B3TJzgT3TEMs9PwB/AkI3VZya6Eg6i+npbyqcwlAWknSKOReu3tGct4fm1vqWDODCBxTZF1s9z2Y0yPZNhZxiRvZ/YaUqJL3Lkjon3LSFd0vs81LcyboveJ29+EAuTV28WLIi55fUmnZrMmFupPGActj1tT2RQkyfLx6AzLP5QAKHg7Li7vSfUCEVTVB+PYuy50LaoB4jycACI8OKD48zWVY1jOcXrsGXuc3i8+v0xHezhuaNCrnpB+dCajjLMHAqgbUjEWEAVFm/qjwN04k2n6S4nr/5qhSHK2E9gqPsrdl21uh+7W5Ps= root@master01
  • 配置公钥
    增加密钥:

004

填上公钥:

005

确认添加:

006

  • 客户端使用

在您的 Gitea 个人资料页面显示一个 Markdown 文件,只需创建一个名为 .profile 的仓库,并编辑其中的 README.md 文件。Gitea 将自动获取该文件并在您的仓库上方显示。

[root@master01 ~]# vim /etc/hosts
# ……
172.24.8.100 gitea.k8sy.com

[root@master01 ~]# ssh -p 30022 -T git@gitea.k8sy.com

[root@master01 ~]# vim .ssh/config 
Host gitea.k8sy.com
    HostName gitea.k8sy.com
    Port 30022
    User gitadmin

[root@master01 ~]# git remote -v
origin  ssh://git@gitea.k8sy.com:30022/gitadmin/.profile.git (fetch)
origin  ssh://git@gitea.k8sy.com:30022/gitadmin/.profile.git (push)

[root@master01 ~]# git config --global user.name "xhy"              # 配置自定义名称
[root@master01 ~]# git config --global user.email "xhy@itzgr.com"   # 配置联系邮箱

[root@master01 ~]# cat >README.md<<EOF 
## 个人仓库
### 仓库说明
个人仓库,私有化使用。
EOF

[root@master01 ~]# git init
[root@master01 ~]# git checkout -b main
[root@master01 ~]# git add README.md

[root@master01 ~]# git commit -m "first commit"
[root@master01 ~]# git remote add origin git@gitea.k8sy.com:gitadmin/.profile.git
[root@master01 ~]# git push -u origin main

007

008

提示:如上直接添加 VIP 地址,该地址为 HAProxy+KeepAlived 部署的 Kubernetes 高可以,Kubernetes 的部署参考:Kubernetes_v1.34.3生产环境高可用部署

部署gitea runner

获取 runner部署资源

gitea runner部署官方有四种方式:act_runner

本指南基于Kubernetes进行部署,该方式有两种部署文件,参考:Kubernetes Docker in Docker Deployment with act_runner

[root@master01 gitea]# wget https://gitea.com/gitea/act_runner/raw/branch/main/examples/kubernetes/dind-docker.yaml

创建注册TOKEN

通过 Web UI 获取(推荐),登录 Gitea:https://gitea.k8sy.com

  1. 进入 站点管理 → Actions → Runners
  2. 点击 创建新的 Runner
  3. 复制显示的 Registration Token
[root@master01 gitea]# echo -n 'cn4gxmDLXJlbGdsXT6iWeDsG9fi8jxisJTFMnXWu' | base64
Y240Z3htRExYSmxiR2RzWFQ2aVdlRHNHOWZpOGp4aXNKVEZNblhXdQ==

配置部署

根据实际情况配置部署文件内容。

---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: act-runner-vol
  namespace: mygitea                    # 补充namespace
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 2Gi                      # 可根据需求调整
  storageClassName: longhorn            # 改为 longhorn
---
apiVersion: v1
data:
  # The registration token can be obtained from the web UI, API or command-line.
  # You can also set a pre-defined global runner registration token for the Gitea instance via 
  # `GITEA_RUNNER_REGISTRATION_TOKEN`/`GITEA_RUNNER_REGISTRATION_TOKEN_FILE` environment variable.
  token: "Y240Z3htRExYSmxiR2RzWFQ2aVdlRHNHOWZpOGp4aXNKVEZNblhXdQ=="
kind: Secret
metadata:
  name: runner-secret
  namespace: mygitea
type: Opaque
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: act-runner
  name: act-runner
  namespace: mygitea
spec:
  replicas: 1
  selector:
    matchLabels:
      app: act-runner
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: act-runner
    spec:
      restartPolicy: Always
      volumes:
      - name: docker-certs
        emptyDir: {}
      - name: runner-data
        persistentVolumeClaim:
          claimName: act-runner-vol
      containers:
      - name: runner
        image: gitea/act_runner:nightly
        command: ["sh", "-c", "while ! nc -z localhost 2376 </dev/null; do echo 'waiting for docker daemon...'; sleep 5; done; /sbin/tini -- run.sh"]
        env:
        - name: DOCKER_HOST
          value: tcp://localhost:2376
        - name: DOCKER_CERT_PATH
          value: /certs/client
        - name: DOCKER_TLS_VERIFY
          value: "1"
        - name: GITEA_INSTANCE_URL
          value: http://gitea-http.mygitea.svc.cluster.local:3000  # 修改为你的 service
        - name: GITEA_RUNNER_REGISTRATION_TOKEN
          valueFrom:
            secretKeyRef:
              name: runner-secret
              key: token
        volumeMounts:
        - name: docker-certs
          mountPath: /certs
        - name: runner-data
          mountPath: /data
      - name: daemon
        image: docker:23.0.6-dind
        env:
        - name: DOCKER_TLS_CERTDIR
          value: /certs
        securityContext:
          privileged: true
        volumeMounts:
        - name: docker-certs
          mountPath: /certs

正式部署runner

[root@master01 gitea]# kubectl apply -f dind-docker.yaml

确认验证

  • 平台确认
[root@master01 gitea]# kubectl -n mygitea get pods -o wide
NAME                          READY   STATUS    RESTARTS   AGE     IP             NODE       NOMINATED NODE   READINESS GATES
act-runner-679649446f-x4djg   2/2     Running   0          25s     10.10.30.123   worker02   <none>           <none>
gitea-875c84b98-vr5lc         1/1     Running   0          9m11s   10.10.30.66    worker02   <none>           <none>
gitea-postgresql-0            1/1     Running   0          9m11s   10.10.19.107   worker03   <none>           <none>
gitea-valkey-primary-0        1/1     Running   0          9m11s   10.10.30.127   worker02   <none>           <none>

[root@master01 gitea]# kubectl -n mygitea logs -f act-runner-679649446f-x4djg 
Defaulted container "runner" out of: runner, daemon
waiting for docker daemon...
.runner is missing or not a regular file
level=info msg="Registering runner, arch=amd64, os=linux, version=v0.2.13+10-g90d11b8."
level=debug msg="Successfully pinged the Gitea instance server"
level=info msg="Runner registered successfully."
SUCCESS
time="2026-01-12T15:15:26Z" level=info msg="Starting runner daemon"
time="2026-01-12T15:15:26Z" level=info msg="runner: act-runner-679649446f-x4djg, with version: v0.2.13+10-g90d11b8, with labels: [ubuntu-latest ubuntu-24.04 ubuntu-22.04], declare successfully"

009

CI 使用

gitea的CI使用类似gitlab,在项目仓库的根目录创建ci.yaml,然后编写对应的内容即可。
可参考:Gitlab CICD流水线触发

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐