一、为什么要自建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)拉取最新提交代码

  • 可以设置为在 pushPRtag 时触发

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 }} <<EOF
            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 脚本中执行以下操作:

  1. 登录部署服务器(SSH)

  2. 拉取最新镜像(Docker)

  3. 停掉旧容器(如果存在)

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

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

Logo

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

更多推荐