CI/CD学习
GitHub Flow(简单):只有 main 分支 + feature 分支,提交到 feature→PR→合并到 main 触发 CI/CD,适合 “高频迭代、快速发布” 的互联网项目(如 API 服务);Git Flow(复杂):多分支(master/main、develop、feature、release、hotfix),适合 “版本周期长、需多环境测试” 的项目(如传统软件);事件触发:
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 中添加 “回滚任务”,手动触发时执行上述命令,避免手动操作出错。
更多推荐
所有评论(0)