持续集成-gitea

持续集成-gitea

草稿阶段, 还有变更

官方文档 https://docs.gitea.cn/

源码仓库 https://github.com/go-gitea/gitea

简述

这个项目最开始是 fork gogs 的,看资讯说是 gogs 的作者控制欲太强, 很多功能和社区期望功能都不愿意加入进来,于是才有的分支。

目前看起来 gitea 的发展得更好,因为大家确实需要一个私有的 github, 而 gitlib 又太重量级了。

功能

核心的代码管理方面相关功能都有,如工单、软件包注册中心,Wiki、钩子等。

硬件需求很低, 1G 内存的主机就够了。

安装方式

支持 二进制部署, docker 部署, k8s 部署, 基本各平台都支持。
详细的这里就不介绍了,看官方文档就行,下面只是简单的介绍一下

基本过程如下

  1. 提前一个数据库和用户帐号, 如 mysql, pg
  2. 使用 docker 或 k8s yml 文件进行部署

docker-compose 方式

参考 附录文件的 docker-compose.yml 的配置文件说明
或者点击此链接下载文件 docker-compose.yml

说明,因为数据持久化用的外部命名卷, 所以这里提前创建一下

docker volume create gitea

docker-compose up -d

k8s 环境内部署

方法一: helm

1
2
helm repo add gitea <https://dl.gitea.io/charts/> \
helm pull gitea/gitea --untar

下载下来后修改一下 values 文件的相关配置在安装

方法二: 资源文件方式安装

更灵活一些

或者点击此链接下载我的文件 k8s.yml

  1. 准备 pv 和 pvc 文件, 持久化存储, 我的 pvc 名字是 pvc-nfs-gitea

  2. statefulset 方式部署, 参考附件的 statefulset.yml

  3. 初始配置, 因为需要前置的几个配置也比较少, 所以没有准备 configmap, 直接用的环境变量;
    还有个原因, gitea 会将中途修改的内容持久化到 配置文件中, 而配置文件又在卷路径下;
    所以最好还是不使用 configmap 来管理初始化配置

  4. services 采用的 traefik 的 IngressRoute IngressRouteTCP 方式进行的暴露
    参考附件的
    service.yml IngressRoute.yml IngressRouteTCP.yml

部署完成后事项

  1. 使用自己配置的域名地址进行访问
    https://git.services.wait/

  2. 第一个用户是超级管理员

  3. 然后就是正常的使用了

附录文件

直接下载文件
docker-compose.yml
k8s.yml

docker-compose.yml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
version: "3"

services:

  gitea:
    # 镜像提前从 docker hub 下载好了, 上传到的私有仓库
    image: registry.services.wait/cwx/gitea:1.18.5
    restart: always

    environment:
      # 自定义运行用户id, 如果是数据卷和新装,就没有必要指定;
      # 因为以前是 bind 挂载所以文件已经有了属主, 所以这里指定只是为了兼容
      - USER_UID=1000
      - USER_GID=1000

      # 指定数据库类型和帐号密码
      - DB_TYPE=mysql
      - DB_HOST=10.2.1.5:3306
      - DB_NAME=gitea
      - DB_USER=gitea
      - DB_PASSWD=passw0rd

      # 随便取一个应用名字
      - APP_NAME=WaitCode
      - RUN_MODE=prod

      # 项目主域,和后续页面上看到的 http 项目地址有关系
      - DOMAIN=git.services.wait

      # 和 ssh clone 时页面看到的地址有关系
      - SSH_DOMAIN=git.services.wait

      # 如果 ssh 使用 22 端口的话,需要宿主机让出22端口或配置 ssh透传
      # 这里简单使用就避开端口就行
      - SSH_PORT=10022

      # 禁止用户注册
      - DISABLE_REGISTRATION=true

      # 需要登陆才能查看项目
      - REQUIRE_SIGNIN_VIEW=true

      # 最终实际的 http 服务地址
      - ROOT_URL=https://git.services.wait/

      # 离线模式, 也就不会用到一些 cdn 或外部的 js 文件等
      - OFFLINE_MODE=true
    volumes:
      - gitea:/data
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro

      # 挂了一个私有CA证书, 因为有向外的 webhook https 请求
      - ./config/cwxCA.pem:/etc/ssl/certs/cwxCA.pem:ro
    ports:
      - "3000:3000"
      # - "10022:10022"
    depends_on:
      - mysql
    labels:
      - "service_name=gitea"

      # 我之前采用的 traefik 做的统一网关, 如果不需要则直接将这一段删除, 并修改一下 ports
      - "traefik.enable=true"
      - "traefik.http.routers.giteaHttps.entrypoints=https"
      - "traefik.http.routers.giteaHttps.service=giteaWeb"
      - "traefik.http.routers.giteaHttps.rule=Host(`git.services.wait`)"
      - "traefik.http.routers.giteaHttps.tls=true"
      - "traefik.http.services.giteaWeb.loadbalancer.server.port=3000"

      - "traefik.tcp.routers.giteaSSH.entrypoints=port10022"
      - "traefik.tcp.routers.giteaSSH.service=giteaSSH"
      - "traefik.tcp.routers.giteaSSH.rule=HostSNI(`*`)"
      - "traefik.tcp.services.giteaSSH.loadbalancer.server.port=10022"

    logging:
      options:
        labels: "service_name"

volumes:
  gitea:
    external: true

statefulset.yml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: gitea
  namespace: cwx
spec:
  selector:
    matchLabels:
      app: gitea
  serviceName: gitea
  replicas: 1
  template:
    metadata:
      labels:
        app: gitea
    spec:
      containers:
      - name: gitea
        image: registry.services.wait/cwx/gitea:1.20.2
        env:
          - name: USER_UID
            value: "1000"
          - name: USER_GID
            value: "1000"
          - name: DB_TYPE
            value: mysql
          - name: DB_HOST
            value: wcn7:3306
          - name: DB_NAME
            value: gitea
          - name: DB_USER
            value: gitea
          - name: DB_PASSWD
            value: passw0rd
          - name: APP_NAME
            value: WaitCode
          - name: RUN_MODE
            value: prod
          - name: DOMAIN
            value: git.services.wait
          - name: SSH_DOMAIN
            value: git.services.wait
          - name: SSH_PORT
            value: "10022"
          - name: SSH_LISTEN_PORT
            value: "10022"
          - name: DISABLE_REGISTRATION
            value: "true"
          - name: REQUIRE_SIGNIN_VIEW
            value: "true"
          - name: ROOT_URL
            value: https://git.services.wait/
          - name: OFFLINE_MODE
            value: "true"
        volumeMounts:
          - name: data
            mountPath: /data
          - name: timezone
            mountPath: /etc/timezone
            readOnly: true
          - name: localtime
            mountPath: /etc/localtime
            readOnly: true
          - name: ca
            mountPath: /etc/ssl/certs/cwxCA.pem
            subPath: cwxCA.pem
            readOnly: true
        resources:
          limits:
            cpu: "200m"
            memory: "300Mi"
        ports:
        - containerPort: 3000
          name: web
        - containerPort: 10022
          name: ssh
      volumes:
        - name: data
          persistentVolumeClaim:
            claimName: pvc-nfs-gitea
        - name: timezone
          hostPath:
            path: /etc/timezone
        - name: localtime
          hostPath:
            path: /etc/localtime
        - name: ca
          secret:
            secretName: cwx-ca-pem

service.yml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
apiVersion: v1
kind: Service
metadata:
  name: gitea
  namespace: cwx
spec:
  selector:
    app: gitea
  clusterIP: None
  ports:
  - port: 80
    name: web
    targetPort: 3000
  - port: 22
    name: ssh
    targetPort: 10022

IngressRoute.yml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
  name: giteaweb
  namespace: cwx
  annotations:
    kubernetes.io/ingress.class: "traefik-class"
spec:
  entryPoints:
    - https
  routes:
    - match: Host(`git.services.wait`)
      kind: Rule
      services:
        - name: gitea
          namespace: cwx
          port: 80
  tls:
    secretName: key-services-wait

ingressRouteTcp.yml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
apiVersion: traefik.io/v1alpha1
kind: IngressRouteTCP
metadata:
  name: giteassh
  namespace: cwx
  annotations:
    kubernetes.io/ingress.class: "traefik-class"
spec:
  entryPoints:
    - giteassh
  routes:
    - match: HostSNI(`*`)
      services:
        - name: gitea
          port: 22
          namespace: cwx
Licensed under CC BY-NC-SA 4.0
转载或引用本文时请遵守许可协议,知会作者并注明出处
不得用于商业用途!
最后更新于 2023-03-17 00:00 UTC