通俗易懂地学习一下CI/CD
本文最后更新于192 天前,其中的信息可能已经过时,如有错误请发送邮件到2067863254@qq.com

好的!让我们用最通俗易懂的方式来理解软件开发中CI/CD的概念。这可能是你成为真正”现代软件开发者”的关键一步!


一个生动的比喻:想象你是一家”奶茶店”

假设你开了一家奶茶店,之前的工作流程是这样的:

  1. 你在后厨调制新口味的奶茶(写代码
  2. 觉得差不多了,就端给顾客尝(手动部署
  3. 顾客说:”太甜了!”或者”珍珠没煮熟!”(线上bug
  4. 你赶紧回后厨重新做(紧急修复

问题:​ 质量不稳定,顾客体验差,你自己也累得半死。 而CI/CD就像是给你的奶茶店装备了一套全自动智能生产线


CI/CD到底是什么?

CI – 持续集成:“自动化质检流水线”

比喻:​ 每当厨师(开发者)新做出一杯奶茶(提交新代码),系统就自动执行:

  1. 自动尝味道(运行自动化测试)
  2. 检查杯子干不干净(代码规范检查)
  3. 确认配方正确(编译构建)
  4. 只有通过所有检查,这杯奶茶才能进入待售区

技术解释:

  • 开发者频繁地把代码合并到主干(每天多次)
  • 每次合并都会自动触发一系列验证流程
  • 快速发现错误,避免”集成地狱”

CD – 持续交付/持续部署:“自动上架机器人”

持续交付(Continuous Delivery):

  • 比喻:​ 通过质检的奶茶,自动打包好、贴上标签,放在柜台后 ready状态,店员(运维)点一下按钮就能上架销售。
  • 技术解释:​ 代码始终处于可部署状态,但部署需要手动触发。

持续部署(Continuous Deployment):

  • 比喻:​ 通过质检的奶茶,机器人直接端给顾客,完全不需要店员操作。
  • 技术解释:​ 通过所有测试后,系统自动部署到生产环境。

大多数团队从”持续交付”开始,成熟后再过渡到”持续部署”。


CI/CD完整工作流程详解

让我们看一个具体的例子,假设你开发一个网站:

场景:你要给网站添加一个”点赞按钮”

没有CI/CD的传统流程:

  1. 你在自己电脑上开发点赞功能(3天)
  2. 本地简单测试后,代码发给测试人员
  3. 测试人员说:”点赞后页面崩溃了!”
  4. 你修复bug,重新测试(又1天)
  5. 终于可以部署了,运维手动操作,不小心漏了配置文件…
  6. 网站下线,紧急回滚!

有CI/CD的现代流程:第1步:你提交代码(推送到Git)

git add .
git commit -m "添加点赞功能"
git push origin main

第2步:CI流水线自动启动(就像质检流水线开始工作) 流水线按顺序执行以下任务:

  1. 编译阶段​ – “检查原材料”
    • 自动下载依赖包
    • 编译代码,确保没有语法错误
  2. 测试阶段​ – “多道质量检测”
    • 单元测试:验证点赞函数本身是否正确
    • 集成测试:验证点赞功能与数据库的交互
    • UI测试:自动化浏览器点击点赞按钮,检查效果
  3. 代码质量检查​ – “卫生检查”
    • 检查代码是否符合规范
    • 扫描安全隐患
    • 计算测试覆盖率(比如要求>80%)
  4. 构建镜像​ – “打包成品”
    • 运行docker build构建Docker镜像
    • 给镜像打上唯一标签,如v1.2.3-abc123

第3步:CD流水线接棒(自动部署)

  1. 部署到测试环境​ – “内部试喝”
    • 自动部署到测试服务器
    • 测试人员可以立即验证功能
  2. 部署到生产环境​ – “正式上架”
    • 如果所有检查通过,自动(持续部署)或一键(持续交付)部署到线上服务器
    • 用户立即能看到新功能!

CI/CD的核心好处

  1. 快速发现bug:提交代码后几分钟就知道有没有问题,而不是等到上线前
  2. 减少人为错误:自动化流程避免”手动部署时漏了步骤”
  3. 频繁交付:可以每天发布多次新功能,而不是每月一次”大版本”
  4. 心理安全感:有自动化测试守护,你敢放心重构代码
  5. 回滚轻松:如果新版本有问题,一键回滚到上一个稳定版本

实际工具链示例

一个典型的CI/CD流水线使用这些工具:

# 这是GitLab CI的配置文件.gitlab-ci.yml示例
stages:
  - test
  - build
  - deploy

单元测试:
  stage: test
  script:
    - npm install
    - npm run test

构建镜像:
  stage: build
  script:
    - docker build -t my-app:$CI_COMMIT_SHA .
    - docker push my-app:$CI_COMMIT_SHA
  only:
    - main

部署到生产:
  stage: deploy
  script:
    - kubectl set image deployment/my-app my-app=my-app:$CI_COMMIT_SHA
  only:
    - main

如何开始实践CI/CD?

给初学者的建议:

  1. 从简单的开始:先在项目中添加自动化测试
  2. 选择易用的工具:GitHub Actions或GitLab CI对新手很友好
  3. 先实现CI:确保每次提交都能通过基本测试
  4. 再实现CD:先从测试环境自动化部署开始
  5. 循序渐进:不要追求完美,先跑通最简单的流水线

最简单的CI/CD流水线可能只做三件事:

  1. 代码推送时自动运行测试
  2. 测试通过自动构建Docker镜像
  3. 镜像构建成功发送邮件通知

核心思想总结

CI/CD的本质是:把软件开发从”手工作坊”变成”现代化智能工厂”。

  • CI(持续集成)​ 关注的是代码质量,确保每次提交都是可靠的
  • CD(持续交付/部署)​ 关注的是交付效率,让发布变得快速、安全、可预测

一句话记住CI/CD:它是一套自动化流水线,让你的代码从”写完”到”上线”全程自动化、可追踪、安全可靠! 现在,你可以尝试在下一个项目中加入最简单的CI流水线,比如在GitHub上创建一个.github/workflows/ci.yml文件,体验一下自动化测试的魅力!这是从小作坊开发者走向现代化工程师的关键一步。



好的!让我用最通俗易懂的方式,手把手教你如何使用 GitLab CI/CD 实现前后端项目的自动化部署。


核心概念:GitLab CI/CD 就像你的”自动化机器人助手”

想象一下,你有一个不知疲倦的机器人助手,它的工作流程是:

  1. 监视你的代码仓库(你push代码它就醒来)
  2. 按照你给的说明书(.gitlab-ci.yml)一步步工作
  3. 自动完成测试、打包、部署等所有繁琐任务
  4. 实时向你报告成功还是失败

实战演示:一个完整的前后端项目自动化部署

假设我们有一个典型的项目:

  • 前端:Vue.js 项目(放在 frontend/目录)
  • 后端:Node.js API(放在 backend/目录)
  • 部署目标:一台云服务器

第一步:创建 GitLab CI 配置文件

在项目根目录创建 .gitlab-ci.yml文件:

# 定义工作流程的阶段,就像生产线的不同工序
stages:
  - install_dependencies
  - build
  - test
  - deploy

# 定义一些所有任务都可以复用的配置
.default_before_script: &default_before_script
  - echo "开始执行CI/CD流水线..."

# 1. 安装前端依赖
install_frontend:
  stage: install_dependencies
  tags:
    - docker  # 使用带有docker的GitLab Runner
  script:
    - cd frontend
    - npm install
  cache:  # 缓存node_modules,加速后续构建
    key: frontend-deps
    paths:
      - frontend/node_modules/
  only:
    - main    # 只有main分支变更时才运行
    - develop # 或者develop分支

# 2. 安装后端依赖  
install_backend:
  stage: install_dependencies
  tags:
    - docker
  script:
    - cd backend
    - npm install
  cache:
    key: backend-deps
    paths:
      - backend/node_modules/
  only:
    - main
    - develop

# 3. 构建前端项目
build_frontend:
  stage: build
  tags:
    - docker
  script:
    - cd frontend
    - npm run build
  artifacts:  # 将构建产物传递给后续任务
    paths:
      - frontend/dist/
    expire_in: 1 hour
  only:
    - main
    - develop
  dependencies:
    - install_frontend  # 依赖安装任务

# 4. 运行前端测试
test_frontend:
  stage: test
  tags:
    - docker
  script:
    - cd frontend
    - npm run test:unit
  only:
    - main
    - develop
  dependencies:
    - install_frontend

# 5. 运行后端测试
test_backend:
  stage: test
  tags:
    - docker
  script:
    - cd backend
    - npm test
  only:
    - main
    - develop
  dependencies:
    - install_backend

# 6. 部署到开发环境(develop分支)
deploy_to_develop:
  stage: deploy
  tags:
    - shell  # 使用能SSH连接到服务器的Runner
  script:
    - echo "部署到开发环境..."
    - |
      # 使用SSH连接到开发服务器执行部署命令
      ssh deploy@dev-server.example.com "
        cd /var/www/my-app &&
        git pull origin develop &&
        cd backend && npm install --production &&
        cd ../frontend && npm install --production &&
        docker-compose down &&
        docker-compose up -d
      "
  only:
    - develop  # 只有develop分支触发
  environment:
    name: development
    url: https://dev.myapp.com

# 7. 部署到生产环境(main分支)
deploy_to_production:
  stage: deploy
  tags:
    - shell
  script:
    - echo "部署到生产环境..."
    - |
      ssh deploy@prod-server.example.com "
        cd /var/www/my-app &&
        git pull origin main &&
        # 备份数据库
        docker-compose exec db mysqldump -u root -p\$DB_PASSWORD myapp > backup.sql &&
        # 滚动更新,零停机部署
        docker-compose up -d --no-deps --build backend &&
        docker-compose up -d --no-deps --build frontend &&
        # 清理旧镜像
        docker image prune -f
      "
  only:
    - main  # 只有main分支触发
  environment:
    name: production
    url: https://myapp.com
  when: manual  # 生产环境部署需要手动点击触发(安全第一!)

第二步:服务器和环境配置

1. 准备部署服务器

在服务器上安装必要的软件:

# 安装 Docker 和 Docker Compose
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER

# 创建项目目录
sudo mkdir -p /var/www/my-app
sudo chown deploy:deploy /var/www/my-app

2. 创建 Docker Compose 文件(在服务器上)

/var/www/my-app/docker-compose.yml

version: '3.8'
services:
  frontend:
    build: ./frontend
    ports:
      - "80:80"
    depends_on:
      - backend
    networks:
      - app-network

  backend:
    build: ./backend
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
      - DB_HOST=db
    depends_on:
      - db
    networks:
      - app-network

  db:
    image: mysql:8.0
    environment:
      - MYSQL_ROOT_PASSWORD=${DB_PASSWORD}
      - MYSQL_DATABASE=myapp
    volumes:
      - db_data:/var/lib/mysql
    networks:
      - app-network

volumes:
  db_data:

networks:
  app-network:

3. 创建前后端的 Dockerfile

前端 Dockerfile​ (frontend/Dockerfile):

# 构建阶段
FROM node:16 as build-stage
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build

# 生产阶段
FROM nginx:alpine
COPY --from=build-stage /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/nginx.conf
EXPOSE 80

后端 Dockerfile​ (backend/Dockerfile):

FROM node:16
WORKDIR /app
COPY package*.json ./
RUN npm install --production
COPY . .
EXPOSE 3000
CMD ["npm", "start"]

第三步:配置 GitLab 环境变量

在 GitLab 项目设置中配置敏感信息(避免写在代码里):

  1. 进入项目 → Settings​ → CI/CD​ → Variables
  2. 添加以下变量:
    • DB_PASSWORD:数据库密码
    • SSH_PRIVATE_KEY:部署服务器的SSH私钥
    • SERVER_HOST:服务器地址

第四步:配置 GitLab Runner

1. 安装 GitLab Runner

在专门机器或服务器上安装:

# 下载并安装
curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh" | sudo bash
sudo apt-get install gitlab-runner

# 注册Runner
sudo gitlab-runner register

2. 注册时填写的信息:

  • GitLab 实例URL:https://gitlab.com
  • 注册令牌(在项目 → Settings → CI/CD → Runners 找到)
  • 标签:docker, shell(与yml文件中的tags对应)
  • 执行器:docker(用于构建任务),shell(用于部署任务)

第五步:完整的工作流程体验

现在,当你推送代码时,魔法就发生了:

推送到 develop 分支:

git checkout develop
git add .
git commit -m "feat: 添加用户登录功能"
git push origin develop

自动触发以下流程:

  1. 安装依赖:前后端分别安装npm包
  2. 构建前端:Vue项目打包生成dist文件
  3. 运行测试:单元测试、API测试
  4. 自动部署:部署到开发服务器,零手动操作!

合并到 main 分支(生产环境):

  1. 创建Merge Request
  2. Code Review通过后合并
  3. CI/CD流水线自动运行所有检查
  4. 在GitLab界面手动点击“Deploy to Production”按钮
  5. 部署到生产环境!

高级技巧和最佳实践

1. 使用 CI/CD 模板减少重复

# 定义可复用的前端任务模板
.frontend_template: &frontend_template
  tags:
    - docker
  before_script:
    - cd frontend
  cache:
    key: frontend-deps
    paths:
      - frontend/node_modules/

# 使用模板
install_frontend:
  <<: *frontend_template
  stage: install_dependencies
  script:
    - npm install

2. 条件执行优化

deploy_to_develop:
  # ... 其他配置
  only:
    changes:  # 只有特定文件变更时才部署
      - frontend/**/*
      - backend/**/*
      - docker-compose.yml
    refs:
      - develop

3. 添加部署确认步骤

production_approval:
  stage: deploy
  script:
    - echo "等待批准部署到生产环境..."
  when: manual
  only:
    - main
  allow_failure: false

deploy_to_production:
  stage: deploy
  script: 
    - echo "开始生产环境部署..."
  needs: ["production_approval"]  # 需要先手动批准

核心要点总结

  1. 配置文件是核心.gitlab-ci.yml就是给你的”机器人助手”的工作说明书
  2. 分阶段执行:安装 → 构建 → 测试 → 部署,清晰有序
  3. 环境隔离:开发、测试、生产环境完全分离
  4. 安全第一:敏感信息用环境变量,生产部署加手动批准
  5. 快速反馈:每次推送立即知道代码质量如何

一句话记住 GitLab CI/CD:你只需要写好”说明书”(.gitlab-ci.yml),剩下的打包、测试、部署工作全部交给 GitLab 自动完成! 现在,你可以尝试在自己的项目中创建一个简单的 .gitlab-ci.yml文件,从最简单的”Hello World”任务开始,逐步构建完整的自动化部署流程!

文末附加内容
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇