CI/CD学习

Git Flow 和 GitHub Flow 的区别?

  • Git Flow(复杂):多分支(master/main、develop、feature、release、hotfix),适合 “版本周期长、需多环境测试” 的项目(如传统软件);

  • GitHub Flow(简单):只有 main 分支 + feature 分支,提交到 feature→PR→合并到 main 触发 CI/CD,适合 “高频迭代、快速发布” 的互联网项目(如 API 服务);

CICD 的触发条件有哪些?怎么配置‘合并到 main 分支才触发部署’?

  • 事件触发:提交代码(push)、合并 PR(pull_request)、手动触发(webhook / 按钮);

  • 配置示例(以 GitLab CI 为例):在.gitlab-ci.yml中写only: [main],表示只有 main 分支的 push 才触发;

如何避免开发提交‘垃圾代码’触发 CI?

  • 提交前:用 pre-commit 钩子(如pre-commit工具)检查代码格式(eslint、pylint)、是否有 debug 日志;

  • CI 阶段:先跑单元测试(如 JUnit、pytest),测试不通过则终止 CI,避免后续流程浪费资源。

stages:          # 阶段顺序:build → test → deploy
  - build
  - test
  - deploy

variables:
  IMAGE_NAME: harbor.example.com/app/demo  # 镜像仓库地址
  IMAGE_TAG: $CI_COMMIT_SHORT_SHA          # 用Git短Commit ID做标签

build_job:
  stage: build
  image: maven:3.8-jdk-17  # 构建环境用Maven镜像
  script:
    - mvn clean package -DskipTests  # 编译打包
    - docker build -t $IMAGE_NAME:$IMAGE_TAG .  # 构建镜像
    - docker login -u $HARBOR_USER -p $HARBOR_PWD harbor.example.com  # 登录Harbor
    - docker push $IMAGE_NAME:$IMAGE_TAG  # 推镜像
  only:
    - main  # 只触发main分支

test_job:
  stage: test
  image: openjdk:17-jre
  script:
    - java -jar target/demo.jar --test  # 跑测试用例
  needs: [build_job]  # 依赖build_job完成

deploy_job:
  stage: deploy
  image: kubectl:1.25  # 部署用kubectl环境
  script:
    - kubectl set image deployment/demo demo=$IMAGE_NAME:$IMAGE_TAG -n app  # 更新K8s Deployment
  only:
    - main
  when: on_success  # 只有前面job成功才执行

K8s 部署有哪些策略?RollingUpdate 和 Recreate 的区别?怎么配置灰度发布(金丝雀)?

  • RollingUpdate(滚动更新):默认策略,逐个替换 Pod,不中断服务(例:5 个 Pod,先停 1 个、起 1 个新的,直到全更完);

  • Recreate(重建):先停所有旧 Pod,再起新 Pod,会中断服务(适合 “不支持多版本共存” 的应用,如数据库);

  • 灰度发布:用 K8s Service + 标签筛选(如先部署 10% 的 Pod 带version: v2,Service 只路由 10% 流量到 v2,验证没问题后全量),或用工具(Argo Rollouts、Istio)。

部署后发现线上 BUG,怎么通过 CICD 快速回滚?

  • 基于镜像标签:回滚到上一个版本的镜像(如kubectl set image deployment/demo demo=app:old-tag);

  • 基于 K8s 历史版本:kubectl rollout undo deployment/demo(前提是 Deployment 配置了revisionHistoryLimit,默认保留 10 个历史版本);

  • CICD 流程:在 Pipeline 中添加 “回滚任务”,手动触发时执行上述命令,避免手动操作出错。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐