一、为什么要自建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 集群上。