Git服务

Git是一种功能强大、灵活高效的分布式版本控制系统。它具有版本控制、分支管理、协作功能等一系列强大的功能,可以帮助开发者更好地组织和管理代码。Git还具有高度可靠性和安全性,保证代码的完整性和安全性。通过引入一些奇特的概念和术语,Git让代码管理变得更加有趣和简单。无论是个人开发者还是大型团队,Git都是不可或缺的工具,它的功能和特点将为软件开发带来巨大的便利和效益。

引自百科

服务器

自己使用开源git服务器搭建

  • gitlab-ce: 内存至少4G,否则特别卡顿, CI/CD使用gitlab-runner
  • gogs: Gogs 是一款极易搭建的自助 Git 服务,其目标是打造一个最简单、最快速和最轻松的方式搭建自助 Git 服务。使用 Go 语言开发使得 Gogs 能够通过独立的二进制分发,并且支持 Go 语言支持的 所有平台,包括 Linux、Mac OS X、Windows 以及 ARM 平台
  • gitea: Gitea的首要目标是创建一个极易安装,运行非常快速,安装和使用体验良好的自建 Git 服务,该服务采用golang编写,适合在树莓派等低内存设备上运行,支持跨平台例如:x86,arm,arm64v8等多个平台,CI/CD使用act runner。查看帮助文档: https://docs.gitea.com/ (推荐使用,目前笔者树莓派4B 8G版正在运行该软件) 其他: Gitosis, Gitolite,Gidder这些笔者没测试过,生产环境也没用过,暂时不做介绍

公共代码托管服务器

  • github.com: 全球知名代码托管平台,国内dns不稳定,需要科学上网
  • bitbucket: 以前公司使用的是这家,外企使用的比较多
  • gitee.com: 开源中国代码托管,目前用于github.com仓库镜像使用

CI/CD:

  • jenkins: 企业级推荐,支持多种插件,实现自动化构建、测试与部署,功能完善、如果遇到问题百度、谷歌搜索基本可以解决,同时也吃内存,毕竟是用java写的, 目前笔者在树莓派4B上正在运行
  • gitlab-runner: gitlab推荐的, 笔者很久以前的一个公司一直在使用
  • github actions: github.com自带的action,需要了解使用语法
  • CircleCI:它主要以容器化技术为基础,提供快捷且高效的构建环境。CircleCI的特点是很容易与GitHub、Bitbucket等代码托管平台集成, 并且提供灵活的配置选项以适应各种工作流
  • Travis CI: (笔者没用过) 是一个广为人知的CI服务,特别是对于开源项目。它能够与GitHub紧密集成,当代码推送到GitHub后,Travis CI会自动运行预设的构建和测试任务
  • 其他:Bamboo(Atlassian 出品的CI/CD工具),TeamCity(由 JetBrAIns 开发)

环境搭建

介绍一下笔者树莓派上运行的服务

  • gitea:代码仓库托管
  • jenkins:自动化编译与部署
  • docker-compose: docker编排工具
  • docker-compose-restful: 用于接受jenkins编译后的触发项目部署,在树莓派上运行的一个服务(内部主要是对docker-compose功能的cmd封装),这样可以在切换不同的CI/CD后,减少各个平台对后置事件的学习和测试

docker运行gitea

1.创建网络

1docker network create traefik
2docker network create spider-cluster

2.docker-compose.yaml, 注意端口22容易被占用, 在终端启动 docker-compose up -d

 1version: '3.9'
 2
 3services:
 4  gitea:
 5    image: gitea/gitea:1.22.1
 6    container_name: gitea
 7    restart: always
 8    volumes:
 9      - ./data:/data
10      - /etc/localtime:/etc/localtime
11    ports:
12      - "3000:3000"
13      - "322:22"
14    labels:
15      # https://soulteary.com/2020/02/04/gitea-git-server-with-docker-and-traefik-v2.html
16      - "traefik.enable=true"
17      - "traefik.http.routers.giteaweb.middlewares=https-redirect@file"
18      - "traefik.http.routers.giteaweb.entrypoints=http"
19      - "traefik.http.routers.giteaweb.rule=Host(`git.linuxcrypt.cn`)"
20
21      - "traefik.http.routers.giteassl.middlewares=content-compress@file"
22      - "traefik.http.routers.giteassl.entrypoints=https"
23      - "traefik.http.routers.giteassl.tls=true"
24      - "traefik.http.routers.giteassl.rule=Host(`git.linuxcrypt.cn`)"
25
26      - "traefik.http.services.giteabackend.loadbalancer.server.scheme=http"
27      - "traefik.http.services.giteabackend.loadbalancer.server.port=3000"
28
29      - "traefik.tcp.routers.giteassh.rule=HostSNI(`*`)"
30      - "traefik.tcp.routers.giteassh.tls=true"
31      - "traefik.tcp.routers.giteassh.entrypoints=git"
32      - "traefik.tcp.routers.giteassh.service=gitea"
33    networks:
34      - traefik
35      - spider-cluster
36
37networks:
38  traefik:
39    external: true
40  spider-cluster:
41    external: true

3.启动容器后,在项目根目录下查看目录结构如下

1tree .
 1.
 2├── data
 3│   ├── git               仓库目录
 4│   ├── gitea
 5│   │   ├── conf
 6│   │   │   └── app.ini   核心配置文件,可以配置邮箱、数据库配置,主机域名、白名单等等配置。
 7│   │   └── log
 8│   └── ssh               ssh相关配置
 9│       ├── ssh_host_ecdsa_key
10│       ├── ssh_host_ecdsa_key.pub
11│       ├── ssh_host_ed25519_key
12│       ├── ssh_host_ed25519_key.pub
13│       ├── ssh_host_rsa_key
14│       └── ssh_host_rsa_key.pub
15└── docker-compose.yml   docker编排文件

注意以上docker-compose.yaml文件中的labels标签,主要用于内网直接连接gitea服务, 不会再外网绕一圈,减少vps服务的流量(因为笔者的树莓派4B通过frp与vps打通的)

4.打开http://localhost:3000进行安装和配置

a.选择数据库, 根据自己的环境选择使用,笔者使用过MySQL、SQLite3 选择数据库, 根据自己的环境选择使用,笔者使用过MySQL、SQLite3

b.基础配置,注意挂载的目录/data,以及基础URL用于克隆 基础配置,注意挂载的目录/data,以及基础URL用于克隆

c.配置邮箱,通过第三方开启配置,增加管理员 配置邮箱,通过第三方开启配置,增加管理员

5.登陆

a.登陆 登陆

6.个人中心

a. 用户中心,个人信息

用户中心,个人信息

b.个人中心,菜单 个人中心,菜单

c.个人中心,应用,后期对接jenkins需要启用token 个人中心,应用,后期对接jenkins需要启用token

7.管理后台

admin后台管理界面 admin后台管理界面

8.上传代码

demo项目 demo项目

9.上传后gitea服务端的文件树结构

  1.
  2├── data
  3│   ├── git
  4│   │   ├── lfs
  5│   │   └── repositories
  6│   │       └── clibing
  7│   │           └── demo.git
  8│   │               ├── HEAD
  9│   │               ├── branches
 10│   │               ├── config
 11│   │               ├── description
 12│   │               ├── git-daemon-export-ok
 13│   │               ├── hooks
 14│   │               │   ├── applypatch-msg.sample
 15│   │               │   ├── commit-msg.sample
 16│   │               │   ├── post-receive
 17│   │               │   ├── post-receive.d
 18│   │               │   │   └── gitea
 19│   │               │   ├── post-update.sample
 20│   │               │   ├── pre-applypatch.sample
 21│   │               │   ├── pre-commit.sample
 22│   │               │   ├── pre-merge-commit.sample
 23│   │               │   ├── pre-push.sample
 24│   │               │   ├── pre-rebase.sample
 25│   │               │   ├── pre-receive
 26│   │               │   ├── pre-receive.d
 27│   │               │   │   └── gitea
 28│   │               │   ├── pre-receive.sample
 29│   │               │   ├── prepare-commit-msg.sample
 30│   │               │   ├── proc-receive
 31│   │               │   ├── proc-receive.d
 32│   │               │   │   └── gitea
 33│   │               │   ├── push-to-checkout.sample
 34│   │               │   ├── sendemail-validate.sample
 35│   │               │   ├── update
 36│   │               │   ├── update.d
 37│   │               │   │   └── gitea
 38│   │               │   └── update.sample
 39│   │               ├── info
 40│   │               │   ├── exclude
 41│   │               │   └── refs
 42│   │               ├── logs
 43│   │               │   ├── HEAD
 44│   │               │   └── refs
 45│   │               │       └── heads
 46│   │               │           └── main
 47│   │               ├── objects
 48│   │               │   ├── 8e
 49│   │               │   │   └── 2372258763bcef1dddd67d4ba4aa129d9dfb06
 50│   │               │   ├── e6
 51│   │               │   │   └── 9de29bb2d1d6434b8b29ae775ad8c2e48c5391
 52│   │               │   ├── f9
 53│   │               │   │   └── 3e3a1a1525fb5b91020da86e44810c87a2d7bc
 54│   │               │   ├── info
 55│   │               │   │   └── packs
 56│   │               │   └── pack
 57│   │               └── refs
 58│   │                   ├── heads
 59│   │                   │   └── main
 60│   │                   └── tags
 61│   ├── gitea
 62│   │   ├── actions_artifacts
 63│   │   ├── actions_log
 64│   │   ├── attachments
 65│   │   ├── avatars
 66│   │   │   ├── d4fcdeb1937686868f5633d23fc4caad
 67│   │   │   └── tmp
 68│   │   ├── conf
 69│   │   │   └── app.ini
 70│   │   ├── gitea.db
 71│   │   ├── home
 72│   │   ├── indexers
 73│   │   │   └── issues.bleve
 74│   │   │       ├── index_meta.json
 75│   │   │       ├── rupture_meta.json
 76│   │   │       └── store
 77│   │   │           └── root.bolt
 78│   │   ├── jwt
 79│   │   │   └── private.pem
 80│   │   ├── log
 81│   │   ├── packages
 82│   │   ├── queues
 83│   │   │   └── common
 84│   │   │       ├── 000001.log
 85│   │   │       ├── CURRENT
 86│   │   │       ├── LOCK
 87│   │   │       ├── LOG
 88│   │   │       └── MANIFEST-000000
 89│   │   ├── repo-archive
 90│   │   ├── repo-avatars
 91│   │   ├── sessions
 92│   │   │   ├── 0
 93│   │   │   │   └── 4
 94│   │   │   ├── 8
 95│   │   │   │   └── 9
 96│   │   │   │       └── 89ee589f8c7985d9
 97│   │   │   ├── b
 98│   │   │   │   └── 2
 99│   │   │   │       └── b20631975fa94021
100│   │   │   └── f
101│   │   │       └── 0
102│   │   └── tmp
103│   │       └── package-upload
104│   └── ssh
105│       ├── ssh_host_ecdsa_key
106│       ├── ssh_host_ecdsa_key.pub
107│       ├── ssh_host_ed25519_key
108│       ├── ssh_host_ed25519_key.pub
109│       ├── ssh_host_rsa_key
110│       └── ssh_host_rsa_key.pub
111└── docker-compose.yml