前言:为什么你需要掌握 CI/CD 和 Git?
// 从前,我们都是这样部署的...
public class OldSchoolDeployment {
public void manualDeploy() {
// 1. 本地打包
mvn clean package -DskipTests; // 跳过测试,反正线上没问题吧?
// 2. FTP 上传服务器
scp target/app.jar user@server:/tmp/;
// 3. 手动备份、停止、替换、重启
ssh user@server "kill -9 $(ps aux | grep java | grep -v grep | awk '{print $2}')";
ssh user@server "nohup java -jar /tmp/app.jar > logs/app.log 2>&1 &";
// 4. 祈祷一切正常
// 5. 如果出问题,熬夜回滚...
}
}
传统方式的痛点:
- 🚨 人为错误:手工操作容易出错
- ⏰ 效率低下:重复劳动耗时耗力
- 🔍 难以追溯:谁在什么时候部署了什么?
- 😵 回滚困难:出问题时手忙脚乱
现代 CI/CD 的优势:
- 🤖 自动化:代码提交后自动测试、构建、部署
- ✅ 质量保证:每次变更都经过完整测试
- 🔄 快速迭代:分钟级完成发布流程
- 📊 可视化:整个过程透明可追溯
第一部分:Git 核心技能 - 从入门到精通
1.1 Git 基础概念
工作区、暂存区、仓库
工作区 (Working Directory) -- 你正在编辑的文件
↓ git add
暂存区 (Staging Area) -- 准备提交的文件
↓ git commit
仓库 (Repository) -- 永久存储的版本历史
基础工作流
# 初始化项目
git init
git remote add origin https://github.com/yourname/yourproject.git
# 日常开发流程
git add . # 添加修改到暂存区
git commit -m "feat: 添加用户登录功能" # 提交到本地仓库
git push origin main # 推送到远程仓库
1.2 分支管理策略
主流分支模型
# 查看分支
git branch # 本地分支
git branch -r # 远程分支
git branch -a # 所有分支
# 分支操作
git checkout -b feature/user-auth # 创建并切换特性分支
git push -u origin feature/user-auth # 推送并建立追踪
# 合并分支
git checkout main
git merge feature/user-auth # 合并特性分支
git branch -d feature/user-auth # 删除已合并分支
Git Flow 工作流
# 初始化 Git Flow
git flow init
# 开发新功能
git flow feature start user-payment
# ... 开发完成 ...
git flow feature finish user-payment
# 发布版本
git flow release start v1.2.0
git flow release finish v1.2.0
# 热修复
git flow hotfix start fix-login-bug
git flow hotfix finish fix-login-bug
1.3 提交规范与最佳实践
约定式提交 (Conventional Commits)
# 格式:type(scope): description
# 示例:
git commit -m "feat(auth): 添加JWT令牌支持"
git commit -m "fix(api): 修复用户列表分页问题"
git commit -m "docs(readme): 更新安装说明"
git commit -m "style(css): 调整登录页样式"
git commit -m "refactor(service): 重构用户服务类"
git commit -m "test(user): 添加用户注册测试用例"
提交信息模板
创建 ~/.gitmessage:
# <类型>(<范围>): <主题>
#
# <正文描述>
#
# <脚注>
# 示例:
# feat(auth): 添加OAuth2登录支持
#
# - 实现GitHub OAuth2登录
# - 添加用户授权表
# - 更新登录页面UI
#
# Closes #123
配置使用模板:
git config --global commit.template ~/.gitmessage
1.4 高级 Git 技巧
重写历史
# 修改最近一次提交
git commit --amend
# 交互式重写多个提交
git rebase -i HEAD~3
# 找回丢失的提交
git reflog # 查看操作历史
git reset --hard commit_id # 恢复到指定提交
储藏工作
# 临时保存未完成的工作
git stash # 储藏当前修改
git stash save "WIP: 用户模块" # 带描述储藏
# 查看储藏列表
git stash list
# 恢复储藏
git stash pop # 应用并删除最新储藏
git stash apply stash@{1} # 应用指定储藏
第二部分:CI/CD 核心概念 - 理解自动化流水线
2.1 什么是 CI/CD?
CI (持续集成) CD (持续交付/部署)
↓ ↓
代码集成自动化 发布部署自动化
CI/CD 流水线示例
# 理想的 CI/CD 流程
代码提交 → 自动测试 → 代码扫描 → 构建镜像 → 部署测试环境 → 自动化测试 → 部署生产环境
↓ ↓ ↓ ↓ ↓ ↓ ↓
触发流水线 质量门禁 安全检测 打包制品 集成测试环境 验收测试 生产发布
2.2 CI/CD 核心组件
1. 版本控制 (Git)
存储代码和配置,触发流水线
2. CI/CD 工具
- Jenkins:老牌经典,插件丰富
- GitLab CI:与 GitLab 深度集成
- GitHub Actions:GitHub 原生,易用性强
- ArgoCD:Kubernetes 原生 GitOps 工具
3. 制品仓库
- Docker Registry:存储容器镜像
- Nexus/Artifactory:存储各种构建制品
4. 部署环境
- 开发环境 → 测试环境 → 预生产环境 → 生产环境
第三部分:实战 CI/CD - 从零搭建自动化流水线
3.1 基于 GitHub Actions 的 CI/CD
基础工作流配置
创建 .github/workflows/ci.yml:
name: CI Pipeline
on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main ]
jobs:
test:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Setup Java
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
- name: Build and test
run: |
mvn clean compile test
mvn verify
- name: Upload test results
uses: actions/upload-artifact@v3
with:
name: test-results
path: target/surefire-reports/
完整 CI/CD 流水线
name: Full CI/CD Pipeline
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
env:
IMAGE_NAME: myapp
REGISTRY: ghcr.io
jobs:
# 1. 代码质量检查
quality-check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: SonarQube Scan
uses: SonarSource/sonarqube-scan-action@v1
env:
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
- name: Checkstyle
run: mvn checkstyle:check
# 2. 单元测试
unit-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-java@v3
with:
java-version: '17'
- name: Run tests
run: mvn test
- name: Upload coverage
uses: codecov/codecov-action@v2
# 3. 集成测试
integration-test:
runs-on: ubuntu-latest
services:
postgres:
image: postgres:13
env:
POSTGRES_PASSWORD: postgres
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
steps:
- uses: actions/checkout@v3
- uses: actions/setup-java@v3
with:
java-version: '17'
- name: Run integration tests
run: mvn verify -Pintegration-test
env:
DATABASE_URL: jdbc:postgresql://localhost:5432/postgres
DATABASE_USERNAME: postgres
DATABASE_PASSWORD: postgres
# 4. 构建镜像
build-image:
needs: [unit-test, integration-test]
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/main'
steps:
- uses: actions/checkout@v3
- name: Build Docker image
run: |
docker build -t $REGISTRY/${{ github.repository }}/$IMAGE_NAME:${{ github.sha }} .
docker build -t $REGISTRY/${{ github.repository }}/$IMAGE_NAME:latest .
- name: Push to Registry
run: |
echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin
docker push $REGISTRY/${{ github.repository }}/$IMAGE_NAME:${{ github.sha }}
docker push $REGISTRY/${{ github.repository }}/$IMAGE_NAME:latest
# 5. 部署到测试环境
deploy-staging:
needs: build-image
runs-on: ubuntu-latest
environment: staging
steps:
- name: Deploy to staging
run: |
# 使用 kubectl 或 helm 部署到 Kubernetes
kubectl set image deployment/myapp myapp=ghcr.io/${{ github.repository }}/myapp:${{ github.sha }}
- name: Run smoke tests
run: |
./scripts/smoke-test.sh
# 6. 部署到生产环境(手动触发)
deploy-production:
needs: deploy-staging
runs-on: ubuntu-latest
environment: production
if: github.ref == 'refs/heads/main'
steps:
- name: Wait for approval
uses: trstringer/manual-approval@v1
with:
secret: ${{ github.TOKEN }}
approvers: ${{ vars.PRODUCTION_APPROVERS }}
- name: Deploy to production
run: |
kubectl set image deployment/myapp myapp=ghcr.io/${{ github.repository }}/myapp:${{ github.sha }}
- name: Post-deployment verification
run: |
./scripts/health-check.sh
3.2 Dockerfile 配置
# 多阶段构建优化镜像大小
FROM maven:3.8-openjdk-17 AS builder
WORKDIR /app
COPY pom.xml .
COPY src ./src
RUN mvn clean package -DskipTests
FROM openjdk:17-jre-slim
WORKDIR /app
# 创建非root用户
RUN groupadd -r spring && useradd -r -g spring spring
USER spring
COPY --from=builder /app/target/*.jar app.jar
# 健康检查
HEALTHCHECK --interval=30s --timeout=3s \
CMD curl -f http://localhost:8080/actuator/health || exit 1
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/app.jar"]
第四部分:Git 与 CI/CD 的最佳实践
4.1 分支保护策略
主流分支保护规则
# .github/branch-protection.yml
main:
required_status_checks:
strict: true
contexts:
- "ci/build"
- "ci/test"
- "codecov/project"
required_pull_request_reviews:
required_approving_review_count: 1
dismiss_stale_reviews: true
require_code_owner_reviews: true
enforce_admins: false
restrictions: null
required_linear_history: true
allow_force_pushes: false
allow_deletions: false
4.2 环境配置管理
多环境配置
# 目录结构
config/
├── application.yml # 公共配置
├── application-dev.yml # 开发环境
├── application-test.yml # 测试环境
├── application-staging.yml # 预生产环境
└── application-prod.yml # 生产环境
CI/CD 环境变量管理
# GitHub Secrets 配置
DATABASE_URL: ${{ secrets.DATABASE_URL }}
API_KEY: ${{ secrets.API_KEY }}
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
# 环境特定配置
- name: Deploy
run: ./deploy.sh
env:
ENVIRONMENT: ${{ github.ref == 'refs/heads/main' && 'production' || 'staging' }}
VERSION: ${{ github.sha }}
4.3 自动化测试策略
测试金字塔在 CI/CD 中的实现
# 分层测试策略
jobs:
unit-tests: # 单元测试 - 快速反馈
runs-on: ubuntu-latest
steps:
- run: mvn test
integration-tests: # 集成测试 - 服务间调用
runs-on: ubuntu-latest
services:
- postgres
- redis
steps:
- run: mvn verify -Pintegration-test
api-tests: # API 测试 - 接口验证
runs-on: ubuntu-latest
steps:
- run: npm run api-test
e2e-tests: # 端到端测试 - 用户场景
runs-on: ubuntu-latest
steps:
- run: npm run e2e-test
第五部分:故障排除与优化
5.1 常见问题解决
CI 流水线失败排查
# 1. 查看详细日志
git log --oneline -10 # 查看最近提交
git show <commit-id> # 查看具体提交内容
# 2. 本地重现问题
mvn clean test # 在本地运行相同命令
docker build . # 本地构建镜像
# 3. 检查环境差异
java -version # JDK 版本
mvn -version # Maven 版本
node -v # Node 版本
Git 问题解决
# 合并冲突解决
git status # 查看冲突文件
# 编辑冲突文件,解决冲突
git add . # 标记冲突已解决
git commit -m "fix: 解决合并冲突"
# 撤销错误提交
git reset --soft HEAD~1 # 撤销提交但保留更改
git reset --hard HEAD~1 # 彻底撤销提交和更改
# 找回误删分支
git reflog # 查看操作历史
git checkout -b feature/xxx commit_id # 从历史创建分支
5.2 性能优化技巧
CI/CD 流水线优化
# 1. 缓存依赖
- name: Cache Maven dependencies
uses: actions/cache@v3
with:
path: ~/.m2/repository
key: maven-${{ hashFiles('**/pom.xml') }}
restore-keys: maven-
# 2. 缓存 Docker 层
- name: Cache Docker layers
uses: actions/cache@v3
with:
path: /tmp/.buildx-cache
key: buildx-${{ github.sha }}
restore-keys: buildx-
# 3. 并行执行任务
jobs:
unit-test:
# 单元测试任务
integration-test:
# 集成测试任务,与单元测试并行执行
code-quality:
# 代码质量检查,与其他任务并行
Git 仓库优化
# 清理历史大文件
git filter-branch --tree-filter 'rm -f large-file.zip' HEAD
# 压缩仓库
git gc --aggressive --prune=now
# 使用浅克隆
git clone --depth 1 https://github.com/user/repo.git
第六部分:进阶主题
6.1 Git Hooks 自动化
预提交检查
#!/bin/bash
# .git/hooks/pre-commit
# 运行测试
mvn test -q
if [ $? -ne 0 ]; then
echo "测试失败,请修复后再提交"
exit 1
fi
# 代码格式检查
mvn checkstyle:check
if [ $? -ne 0 ]; then
echo "代码格式检查失败"
exit 1
fi
# 禁止提交到大分支
current_branch=$(git symbolic-ref --short HEAD)
protected_branches=("main" "develop")
for branch in "${protected_branches[@]}"; do
if [ "$current_branch" = "$branch" ]; then
echo "禁止直接提交到 $branch 分支,请创建特性分支"
exit 1
fi
done
6.2 GitOps 实践
ArgoCD 应用配置
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: myapp-production
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/yourname/yourproject.git
targetRevision: main
path: k8s/manifests
destination:
server: https://kubernetes.default.svc
namespace: production
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true
总结:从新手到专家的成长路径
🎯 学习路线图
阶段 1:基础掌握(1-2个月)
- ✅ Git 基本操作(clone, commit, push, pull)
- ✅ 分支创建与合并
- ✅ 理解 CI/CD 基本概念
- ✅ 编写简单的 GitHub Actions 工作流
阶段 2:熟练应用(3-6个月)
- ✅ 复杂的 Git 操作(rebase, stash, cherry-pick)
- ✅ 团队协作流程(PR、Code Review)
- ✅ 搭建完整的 CI/CD 流水线
- ✅ 多环境部署策略
阶段 3:专家水平(6-12个月)
- ✅ Git 高级技巧(submodule, worktree)
- ✅ CI/CD 性能优化
- ✅ 安全最佳实践
- ✅ GitOps 实践
- ✅ 故障排查和调优
🚀 立即开始行动
- 创建个人项目实践:选择一个 side project,应用所学知识
- 参与开源项目:通过 PR 学习团队协作流程
- 在工作中推广:在团队中引入 CI/CD 最佳实践
- 持续学习:关注新技术发展,不断优化流程
记住:熟练来自于实践。从今天开始,在每个项目中应用这些技巧,你很快就会从新手成长为 CI/CD 和 Git 的熟练工程师!
最后的建议:
- 📚 文档是你的朋友:git --help, GitHub Docs
- 🔄 实践出真知:多动手,多犯错,多学习
- 🤝 分享与交流:在团队中分享经验,共同成长
- 🎯 持续改进:定期回顾和优化你的工作流程
祝你在这条自动化之路上一帆风顺!