- 核心分支结构
main (或 master) – 生产环境代码
├── staging – 测试/预发布环境
├── develop – 开发主分支
│ ├── feature/* – 功能分支
│ ├── bugfix/* – 缺陷修复分支
│ └── hotfix/* – 紧急修复分支
└── release/* – 发布分支
永久分支
1. main/master 分支 – 生产环境
权限:只有管理员可以合并
git checkout -b main
保护规则:禁止直接push,必须通过PR
2. staging 分支 – 测试/预发布环境
git checkout -b staging
保护规则:只有测试负责人可以合并
3. develop 分支 – 开发主分支
git checkout -b develop
保护规则:开发者可以创建分支,合并需要代码审查
临时分支
1. 功能分支 feature/
git checkout -b feature/user-authentication
从develop创建,合并回develop
命名:feature/功能名称-issue号
2. 缺陷修复分支 bugfix/
git checkout -b bugfix/login-error-123
从develop创建,合并回develop
命名:bugfix/问题描述-issue号
3. 紧急修复分支 hotfix/
git checkout -b hotfix/critical-security-456
从main创建,合并到main和develop
命名:hotfix/问题描述-issue号
4. 发布分支 release/
git checkout -b release/v1.2.0
从develop创建,合并到main和develop
命名:release/版本号
- GitLab权限配置示例 (.gitlab-ci.yml)
.gitlab-ci.yml
stages:
- test
- build
- deploy
variables:
PRODUCTION_BRANCH: “main”
STAGING_BRANCH: “staging”
DEVELOP_BRANCH: “develop”
分支保护规则
workflow:
rules:
– if: ‘$CI_COMMIT_REF_NAME == $PRODUCTION_BRANCH’
when: manual # 生产部署需要手动触发
– if: ‘$CI_COMMIT_REF_NAME == $STAGING_BRANCH’
when: on_success
– if: ‘$CI_COMMIT_REF_NAME =~ /^feature\/.*/’
when: on_success
– if: ‘$CI_COMMIT_REF_PROTECTED == “true”‘
when: never # 保护分支不允许直接push
代码质量检查
code_quality:
stage: test
script:
– echo “Running code quality checks…”
– sonar-scanner
only:
– develop
– staging
– merge_requests
单元测试
unit_test:
stage: test
script:
– echo “Running unit tests…”
– phpunit
only:
– develop
– staging
– merge_requests
构建
build:
stage: build
script:
– echo “Building application…”
– npm run build
only:
– develop
– staging
– tags
部署到开发环境
deploy_development:
stage: deploy
script:
– echo “Deploying to development…”
– ./deploy.sh development
only:
– develop
environment:
name: development
url: https://dev.example.com
部署到测试环境
deploy_staging:
stage: deploy
script:
– echo “Deploying to staging…”
– ./deploy.sh staging
only:
– staging
when: manual
environment:
name: staging
url: https://staging.example.com
部署到生产环境
deploy_production:
stage: deploy
script:
– echo “Deploying to production…”
– ./deploy.sh production
only:
– main
when: manual
environment:
name: production
url: https://example.com
分支保护规则
Git配置示例
1. main分支保护
git config branch.main.protect true
git config branch.main.requireReview 2
git config branch.main.requireCI true
git config branch.main.noDirectPush true
git config branch.main.requireSignedCommits true
2. staging分支保护
git config branch.staging.protect true
git config branch.staging.requireReview 1
git config branch.staging.requireCI true
3. develop分支保护
git config branch.develop.protect true
git config branch.develop.requireReview 1
功能开发流程
1. 从develop创建功能分支
git checkout develop
git pull origin develop
git checkout -b feature/user-login-123
2. 开发功能
git add .
git commit -m “feat: 添加用户登录功能 #123”
git push origin feature/user-login-123
3. 创建Pull Request
目标分支: develop
添加审查者: @reviewer1 @reviewer2
关联Issue: #123
4. 代码审查通过后,合并到develop
git checkout develop
git merge –no-ff feature/user-login-123
git branch -d feature/user-login-123
发布流程
1. 从develop创建release分支
git checkout develop
git pull origin develop
git checkout -b release/v1.2.0
2. 版本号更新、文档更新
修改version.txt, CHANGELOG.md等
git add .
git commit -m “chore: 准备发布v1.2.0”
3. 合并到staging进行测试
git checkout staging
git merge –no-ff release/v1.2.0
git push origin staging
4. 测试通过后,合并到main
git checkout main
git merge –no-ff release/v1.2.0
git tag -a v1.2.0 -m “发布v1.2.0”
git push origin main –tags
5. 合并回develop
git checkout develop
git merge –no-ff release/v1.2.0
git branch -d release/v1.2.0
紧急修复流程
1. 从main创建hotfix分支
git checkout main
git pull origin main
git checkout -b hotfix/critical-bug-456
2. 修复问题
git add .
git commit -m “fix: 修复严重bug #456”
git push origin hotfix/critical-bug-456
3. 快速测试后合并到main
git checkout main
git merge –no-ff hotfix/critical-bug-456
git tag -a v1.2.1 -m “紧急修复版本v1.2.1”
git push origin main –tags
4. 合并到develop
git checkout develop
git merge –no-ff hotfix/critical-bug-456
git branch -d hotfix/critical-bug-456
自动化部署脚本
!/bin/bash
deploy.sh
ENVIRONMENT=$1
VERSION=$2
case $ENVIRONMENT in
development)
echo “🚀 部署到开发环境…”
BRANCH=”develop”
SERVER=”dev-server.example.com”
DEPLOY_PATH=”/var/www/dev”
;;
staging)
echo “🚀 部署到测试环境…”
BRANCH=”staging”
SERVER=”staging-server.example.com”
DEPLOY_PATH=”/var/www/staging”
;;
production)
echo “🚀 部署到生产环境…”
BRANCH=”main”
SERVER=”prod-server.example.com”
DEPLOY_PATH=”/var/www/prod”
;;
*)
echo “❌ 未知环境: $ENVIRONMENT”
exit 1
;;
esac
检查当前分支
CURRENT_BRANCH=$(git rev-parse –abbrev-ref HEAD)
if [ “$CURRENT_BRANCH” != “$BRANCH” ]; then
echo “❌ 必须在 $BRANCH 分支上部署到 $ENVIRONMENT 环境”
exit 1
fi
部署
echo “1. 拉取最新代码…”
git pull origin $BRANCH
echo “2. 安装依赖…”
composer install –no-dev
npm install –production
echo “3. 构建…”
npm run build
echo “4. 同步到服务器…”
rsync -avz –delete \
–exclude=’.git’ \
–exclude=’.env’ \
–exclude=’node_modules’ \
./ $SERVER:$DEPLOY_PATH/
echo “5. 重启服务…”
ssh $SERVER “cd $DEPLOY_PATH && systemctl restart php-fpm && systemctl restart nginx”
echo “✅ 部署完成!”
分支命名规范
功能分支
feature/user-auth-123
feature/payment-gateway-456
缺陷修复
bugfix/login-error-123
bugfix/api-timeout-456
紧急修复
hotfix/security-patch-789
hotfix/db-connection-999
发布分支
release/v1.2.0
release/v2.0.0-beta
重构
refactor/user-service-123
refactor/database-layer-456