☕ 404 星球 · 前端晨间广播 | 2025-10-30
1️⃣ Vite 7.0 正式发布,Rolldown 成默认打包核心
- 基于 Rust 的 Rolldown 替代传统 Rollup,冷启动提速 40%,大型项目 HMR 中位数 <60 ms
- 内置
import.meta.hot.data持久化缓存,页面刷新不丢状态 - 官方提供
vite-6to7迁移插件,零配置即可升级
2️⃣ VoidZero × NuxtLabs 推出 Vite DevTools
- 统一面板可视化依赖图谱、模块耗时、产物体积,支持一键回滚到任意 HMR 快照
- 插件市场已上线 30+ 社区面板,Figma-to-Tokens、i18n 覆盖率等即装即用
3️⃣ Chrome 136 开启 CSS scroll-state() 起源试用
- 可检测元素是否"吸顶/吸底":
:scroll-state(stuck: top),无需 JS 监听滚动 - 配合
transition-behavior: allow-discrete实现粘性导航栏平滑显隐动画 - 预计 2026 Q2 转正,粘性布局将告别
scroll事件时代
4️⃣ Node.js 23 进入 LTS 倒计时,自带原生 .env 加载
- 执行
node --env-file=.env.production index.js即可注入环境变量,告别dotenv依赖 - 实验性支持 TypeScript 5.8 即将推出的 "Import Attributes" 语法检查
- 10 月 30 日起官方停止维护 Node 20,提醒 CI 及时切换
5️⃣ 「前端+AI」新组合:CodiumAI 插件登陆 VS Code 中国市场
- 右键函数 → Generate Tests,自动生成 Jest/Mocha 单元测试,覆盖边界与断言
- 免费版每日 200 次生成,支持中文注释与 Alibaba/Facebook 开源风格模板
- 与 SonarQube 社区版联动,一键推送技术债务报告到 GitHub PR
--- ☕️🌅 ---
一、为什么要"自找麻烦"做 CI/CD?
还在用"人肉 FTP+重启脚本"上线?
-- 周五 18:00 上线,凌晨 2 点回滚,心脏受不了。
-- 开发、测试、生产环境不一致,本地能跑,线上就 500。
-- 新人接手上古项目,编译 2 小时,依赖找不到。
CI/CD 不是"银弹",却是把这些重复、易错、低价值的手工操作 变成一行配置文件的最短路径。
二、一张图看懂 CI/CD 流水线
bash
┌────────┐ push ┌──────┐ build ┌─────┐ test ┌────────┐ deploy ┌──────┐
│ 开发机 │──────►│ Git │──────►│ CI │──────►│ 制品库 │─────────►│ 生产 │
└────────┘ └──────┘ └─────┘ └────────┘ └──────┘
- 持续集成(CI):每次提交自动拉代码→编译→单测→静态扫描→出包。
- 持续交付(CD):包自动进测试环境→接口/UI/性能测试→人工审批→"一键发布"。
- 持续部署(CD++):审批也省了,绿色就跑完直接上线(适合云原生无状态业务)。
三、30 分钟搭一套可运行的最小闭环
1. 准备工作
| 资源 | 免费获取方式 |
|---|---|
| 代码托管 | GitLab.com 新建仓库 |
| 容器镜像 | GitLab 内置 Container Registry |
| K8s 集群 | 腾讯云/阿里云"试用集群"或本地 k3s |
2. 目录结构
bash
demo-app/
├── .gitlab-ci.yml # 流水线定义
├── Dockerfile
├── src/
│ └── app.go # 随便写个 Hello World
├── main_test.go
└── k8s/
└── deployment.yaml
3. Dockerfile(多阶段,提速 80%)
dockerfile
FROM golang:1.22 AS builder
WORKDIR /src
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 go build -o app
FROM alpine:3.19
RUN apk add --no-cache ca-certificates
COPY --from=builder /src/app /usr/local/bin/app
ENTRYPOINT ["app"]
4. .gitlab-ci.yml(直接抄)
yaml
stages: [build, test, deploy]
variables:
IMAGE: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
build:
stage: build
image: docker:24-dind
services: [docker:24-dind]
before_script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
script:
- docker build -t $IMAGE .
- docker push $IMAGE
test:
stage: test
image: golang:1.22
script:
- go test ./...
deploy:
stage: deploy
image: bitnami/kubectl:1.29
only: ["main"]
script:
- kubectl set image deployment/demo-app demo-app=$IMAGE -n default
5. K8s 模板(首次手动 kubectl apply -f)
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-app
spec:
replicas: 2
selector:
matchLabels: {app: demo}
template:
metadata:
labels: {app: demo}
spec:
containers:
- name: demo-app
image: registry.gitlab.com/yourname/demo-app:latest
ports: [{containerPort: 8080}]
---
apiVersion: v1
kind: Service
metadata:
name: demo-svc
spec:
selector: {app: demo}
ports:
- port: 80
targetPort: 8080
type: ClusterIP
6. 跑起来
git push一次,马上在 GitLab → CI/CD → Pipelines 看到绿灯。- 镜像自动推送到 GitLab Registry。
- 最后 kubectl 把 deployment 镜像版本改掉,Pod 滚动升级。
- 浏览器访问 Service,Hello World 出现 → 整条链路打通!
四、把"玩具"做成"生产级"的 7 个细节
| 问题 | 玩具做法 | 生产做法 |
|---|---|---|
| 构建慢 | 全量下载依赖 | 缓存 go mod、docker layer、并行任务 |
| 测试弱 | 只跑单测 | 单测+接口+UI+安全扫描,失败即阻断 |
| 环境差异 | 只有一套 K8s | Dev/QA/Prod 三套,用 Helm values 区分 |
| 回滚慢 | 手动改镜像 | kubectl rollout undo 或 Argo CD 一键回滚 |
| 密钥裸奔 | 明文写配置 | 用 GitLab CI Variables + K8s Secret |
| 灰度缺失 | 全量滚动 | 金丝雀(Flagger)或蓝绿 |
| 合规审计 | 谁上线不知道 | 在 MR 里留痕,流水线加签名,镜像加 SBOM |
五、常见踩坑日记
-
dind 无法推送镜像
错误:
tls: bad certificate解决:在 GitLab → Settings → CI/CD → Variables 加
DOCKER_TLS_CERTDIR=""关闭 TLS 校验(仅测试)。 -
kubectl 权限不足
把 GitLab Runner 所在节点的 kubeconfig 权限缩小到只能改 demo-app deployment,遵循最小权限原则。
-
数据库迁移导致回滚失败
保持 migration 向前兼容(只增字段/表),回滚时不用逆迁移;重大变更用蓝绿+影子表方案。
六、进阶路线(路线图收藏)
-
GitOps
把
.gitlab-ci.yml里的kubectl set image换成 Argo CD 自动同步 Git 仓库里的 manifests,实现"声明式"部署。 -
Trunk Based + Feature Flag
主干开发,功能开关控制灰度,再也不用"分支地狱"。
-
混沌工程
流水线里插入 Chaos Mesh 故障,验证真正的高可用。
-
度量驱动
接入 Grafana:构建时长、单测覆盖率、Lead Time、MTTR,四个核心指标贴在墙上,每周复盘。
七、结语
CI/CD 不是"工具链堆砌",而是交付习惯的升级 :
"代码即基础设施,发布就像保存文档一样简单。"
先让流水线跑起来,再逐步加测试、加门禁、加灰度,小步快跑,持续迭代。
当你能在周三下午 15:00 把需求合并、16:00 灰度 10%、17:00 全量上线并准时下班,就会明白------
所有自动化,最终都是为了把夜晚和周末还给自己。