手把手教你如何自己搭建一个git平台

503-365 2025-07-13 11:13:53 admin

一、为什么要自建Git平台?

在GitHub/GitLab官方托管代码存在隐私风险?企业需要私有化部署?或是想体验完全掌控代码仓库的快感?自建Git平台能为你带来:

100%数据自主控制权

定制化权限管理体系

无限制的私有仓库数量

与内部系统深度集成能力

二、三大主流开源方案对比

1. Gitea(推荐首选)

轻量级(Go语言开发)

内存占用<100MB

功能齐全的Web界面

支持SSH/HTTP协议

2. GitLab

企业级功能完善

持续集成流水线

需要4GB+内存

部署相对复杂

3. Gogs

极简主义设计

低资源消耗

插件生态较弱

本文选择的是:DevStar Studio

这是一个Gitea 发行版,在Git代码仓库托管的基础上提供了开发环境DevEnv执行引擎,与VS Code插件或自定义IDE深度融合,形成灵活适配基础软件工具的生态平台,从而为开发者用户提供智能(代码大模型AI+)、安全(完全云原生)、一站式开箱即用的CI/CD全生命周期研发平台。

搭建步骤参考如下:

mengning/DevStar: DevStar Studio

成功后如下:

这样我们就收获了一个自己的git代码托管平台。

如何使用git?

在网页中新建仓库,可以选择模板,用模板创建好后如下:

以idea为例,打开项目后,选择git,弹出如下窗口,填入url:

随后点击克隆,即可完成仓库克隆。

随后在idea种就可以进行代码开发,需要更新仓库代码只需要:

idea等常见的IDE往往都提供了完整的git操作,只需要连接到仓库,就能很方便的实现版本控制。

如果要使用git命令?

以一个python项目为例

一、创建Git仓库

1. 初始化本地仓库

mkdir my_python_project && cd my_python_project

git init

![初始化仓库截图:显示 Initialized empty Git repository 提示]

2. 创建基础文件

# 创建 main.py

echo "print('Hello Git!')" > main.py

# 创建README

echo "# My Python Project" > README.md

二、首次提交代码

1. 添加文件到暂存区

git add main.py README.md

2. 查看状态确认

git status

3. 执行首次提交

git commit -m "Initial commit: basic project structure"

三、分支开发流程

1. 创建功能分支

git checkout -b feature/add-logging

2. 开发新功能

# 修改 main.py 添加日志功能

import logging

logging.basicConfig(level=logging.INFO)

logger = logging.getLogger(__name__)

def main():

logger.info("程序启动")

print("Hello Git!")

if __name__ == "__main__":

main()

3. 提交到功能分支

git add main.py

git commit -m "feat: add logging support"

四、合并代码到主分支

1. 切换回主分支

git checkout main

2. 合并功能分支

git merge feature/add-logging

3. 查看合并结果

git log --graph --oneline

五、处理合并冲突(模拟场景)

1. 在两个分支修改同一文件

# 主分支修改

git checkout main

sed -i 's/Hello Git!/Hello Git World!/' main.py

git commit -am "修改问候语"

# 功能分支修改

git checkout feature/add-logging

sed -i 's/Hello Git!/Hello Git Universe!/' main.py

git commit -am "调整输出内容"

2. 尝试合并触发冲突

git checkout main

git merge feature/add-logging

3. 手动解决冲突

# 修改后的 main.py 内容

print('Hello Git World!') # 保留主分支修改

4. 标记冲突已解决

git add main.py

git commit -m "解决问候语冲突"

六、代码审查(通过Pull Request)

1. 推送到远程仓库

git remote add origin http://your-git-server/user/repo.git

git push -u origin main

2. 创建Pull Request

# 在Git平台(Gitea/GitLab)操作:

1. 选择 feature/add-logging 分支

2. 点击 "New Pull Request"

3. 添加审查者

七、发布正式版本

1. 创建版本标签

git tag -a v1.0.0 -m "正式发布版本"

2. 推送标签到远程

git push origin --tags

3. 查看版本历史

git tag -n

完整操作流程图解

[本地开发] --> [创建分支] --> [多次提交] --> [发起PR]

↓ ↑

[解决冲突] <-- [代码审查] <-- [合并到主分支]

[打标签发布] --> [推送远程]

CI/CD流水线

CI/CD 是 持续集成(Continuous Integration) 和 持续交付/部署(Continuous Delivery/Deployment) 的缩写。CI/CD 流水线是一种自动化流程,用于自动完成 代码构建 → 测试 → 发布 → 部署 的全过程。

CI/CD 流水线一般包含以下几个阶段:

1. 源码拉取(Source)

从代码仓库(如 GitHub、Gitee、GitLab)拉取最新提交代码

可以设置为在 push、PR、tag 时触发

2. 编译构建(Build)

对代码进行构建,例如:

Java 用 Maven/Gradle 编译打包 .jar/.war

Node 用 npm build

前端项目生成静态资源

3. 自动测试(Test)

自动化测试阶段执行:

单元测试(JUnit、pytest 等)

集成测试

静态代码扫描(如 SonarQube)

4. 发布/打包(Package)

打包构建产物(artifact),如:

上传到制品仓库(如 Nexus、Artifactory)

打包成 Docker 镜像上传到镜像仓库

5. 部署(Deploy)

将应用部署到目标环境,如:

测试服务器

生产环境

Kubernetes 集群

通过 Docker 容器运行

这里我们以一个Springboot的项目为例:

.

├── .gitea/

│ └── workflows/

│ └── ci.yaml ← 你要添加的CI脚本

├── src/

├── pom.xml ← Maven项目

...

这里提供一个我项目的yaml:

name: springboot-hzq-rpc CI/CD Pipeline

on:

push:

branches:

- main

pull_request:

branches:

- main

jobs:

build-and-deploy:

runs-on: ubuntu-latest

steps:

- name: 🔍 Checkout source code

uses: https://gitea.com/actions/checkout@v4

- name: ☕ Set up JDK 17

uses: actions/setup-java@v3

with:

java-version: '17'

distribution: 'temurin'

- name: 🛠️ Build with Maven and Run Tests

run: mvn clean package -DskipTests=false

- name: 📦 Build Docker image

run: |

docker build -t ${{ vars.DOCKER_REGISTRY_ADDRESS }}/${{ vars.DOCKER_REPOSITORY_ARTIFACT }}:latest .

docker tag ${{ vars.DOCKER_REGISTRY_ADDRESS }}/${{ vars.DOCKER_REPOSITORY_ARTIFACT }}:latest ${{ vars.DOCKER_REGISTRY_ADDRESS }}/${{ vars.DOCKER_REPOSITORY_ARTIFACT }}:main-${{ gitea.sha }}

- name: 🔐 Docker Login & Push

run: |

echo "${{ secrets.DOCKER_REGISTRY_PASSWORD }}" | docker login -u ${{ secrets.DOCKER_REGISTRY_USERNAME }} ${{ vars.DOCKER_REGISTRY_ADDRESS }} --password-stdin

docker push ${{ vars.DOCKER_REGISTRY_ADDRESS }}/${{ vars.DOCKER_REPOSITORY_ARTIFACT }}:latest

docker push ${{ vars.DOCKER_REGISTRY_ADDRESS }}/${{ vars.DOCKER_REPOSITORY_ARTIFACT }}:main-${{ gitea.sha }}

- name: 🚀 Deploy to server via SSH

run: |

ssh -o StrictHostKeyChecking=no ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }} <

docker pull ${{ vars.DOCKER_REGISTRY_ADDRESS }}/${{ vars.DOCKER_REPOSITORY_ARTIFACT }}:latest

docker stop hzq-rpc || true && docker rm hzq-rpc || true

docker run -d --name hzq-rpc -p 8080:8080 ${{ vars.DOCKER_REGISTRY_ADDRESS }}/${{ vars.DOCKER_REPOSITORY_ARTIFACT }}:latest

EOF

这样实现项目的自动构建、自动化测试、自动化部署等功能,通过提交代码合并pr的方式触发CI/CD脚本执行

以自动化测试为例,我在项目中有相应的JUnit单元测试:

import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.*;

public class RpcCoreTest {

@Test

public void testServiceDiscovery() {

RpcRegistry registry = new ZookeeperRegistry();

String url = registry.lookup("com.example.UserService");

assertNotNull(url);

}

}

在自动化测试中,便会执行相应的测试类

流程:

代码提交 -> CI 触发 -> 执行 mvn package -> 自动运行测试类 -> 通过则继续部署,失败则终止

如果测试失败了怎么办?

Gitea CI 会自动标记该 Job 为 failed

日志中会有详细的测试失败原因(断言失败、异常、返回值不符合预期等)

这样你可以在代码合并前及时修复 Bug

自动化部署:

使用 SSH + Docker 在远程服务器自动部署

实现思路

CI 脚本中执行以下操作:

登录部署服务器(SSH)

拉取最新镜像(Docker)

停掉旧容器(如果存在)

启动新容器(使用新镜像)

当然你也可以部署在部署在 K8s 集群上。