【GitLab/CI】前端 CI

整体流程概览(流水线高层)

  1. 开发者把代码 push / open MR → 触发 GitLab Pipeline。
  2. Pipeline 按 stages(例如 install → lint → test → build → deploy)顺序执行,每个 stage 内的 job 并行。
  3. Runner(你为项目/组配置的)拉取镜像或启动容器,执行 job 的 before_script / script;job 可以产出 artifacts(构建产物)并写入 cache(依赖缓存)。
  4. 若某一步失败,CI 报红并把日志返回给 MR;成功后可触发部署(到测试/预发布/生产),或生成 Review App。

典型前端流水线(各阶段目的)

  • prepare(可选):准备环境、注入 secrets、生成 .npmrc、写 CA 等。
  • install:安装依赖(pnpm / npm / yarn),做 lockfile 校验(--frozen-lockfile)。
  • lint:静态代码检查(eslint 等)。快速失败,减少无效构建。
  • test:单元/集成测试(Jest、Vitest 等)。
  • build:生产构建(如 pnpm build),生成 dist
  • e2e(可选):端到端测试(Cypress / Playwright)。通常需要独立环境或 service。
  • deploy:将 dist 发布到测试/生产环境。

必备与常见的 .gitlab-ci.yml 配置项(逐条解释)

下面用示例同时讲解每个配置的作用。

yaml 复制代码
stages:
  - prepare
  - install
  - lint
  - test
  - build
  - deploy

variables:
  FRONTEND_DIR: frontend
  PNPM_STORE_DIR: .pnpm-store
  NODE_ENV: production

image: node:20

cache:
  key: ${CI_COMMIT_REF_SLUG}-pnpm-store
  paths:
    - .pnpm-store
    - frontend/node_modules

before_script:
  - cd ${FRONTEND_DIR}

install:
  stage: install
  script:
    - npm -g pnpm@7
    - pnpm config set store-dir ${PNPM_STORE_DIR}
    - pnpm install --frozen-lockfile
  cache:
    policy: pull-push

lint:
  stage: lint
  script:
    - pnpm lint

test:
  stage: test
  script:
    - pnpm test --reporter=jest-junit
  artifacts:
    reports:
      junit: junit.xml
    when: always

build:
  stage: build
  script:
    - pnpm build
  artifacts:
    paths:
      - dist
    expire_in: 1 week

deploy:
  stage: deploy
  script:
    - ./deploy-script.sh
  only:
    - main

解释(按配置项):

  1. stages:流水线的阶段顺序。stage 的顺序决定执行顺序,stage 内 job 并行。

  2. variables:定义 pipeline 内的环境变量(可在 job 中引用)。放敏感信息不要放在这里,要放 GitLab 的 CI/CD Variables。

  3. image:Runner 在执行 job 时用的容器镜像(Docker/Kubernetes executor 会拉这个镜像)。选稳定的 Node 镜像,或自建含依赖的镜像。镜像下载的策略:

    • never: 当使用这个策略,会禁止Gitlab Runner从Docker hub或者其他地方下拉镜像,只能使用自己手动下拉的镜像
    • if-not-present: 当使用这个策略,Runner会先检测本地是否有镜像,有的话使用该镜像,如果没有再去下拉。这个策略如果再配合定期删除镜像,就能达到比较好的效果
    • always: 这个是gitlab-ci默认使用的策略,即每一次都是重新下拉镜像,导致的结果就是比较耗时间
  4. cache:用于存依赖等来加速后续 job。key 决定缓存隔离粒度(按分支、commit、共享等)。paths 列出要缓存的目录。policy 可设 pull-push(默认),或 pull

  5. before_script:在每个 job 执行实际 script 前会执行的命令(可复用),常用于 cd、设置环境、解码 secrets。after_script同理。

  6. script:job 的要执行的命令(必须有)。很多错误就在这里可以看到。

  7. artifacts:job 成功后保留的文件供下个 stage 使用或供下载(如 dist、测试报告、coverage)。expire_in 控制保存时间。

  8. only/exceptrules:控制何时触发 job。rules 更灵活,推荐使用 rules 替代 only/except

  9. artifacts.reports:特殊用途的 artifacts,比如 junit 测试报告或 coverage,可在 GitLab UI 显示测试结果。

  10. when:controls when artifact is uploaded (always, on_success, on_failure)。

  11. needs:允许跳过 stage 顺序,直接使用另一个 job 的 artifacts,能加速 pipeline(注意并发与资源)。

  12. services:只想其他 docker 镜像,这些镜像会合 image 制定的镜像绑定。

  13. retry, timeout, parallel:job 重试次数、最长时长、并行 matrix(并发运行多个相同 job)。

lockfile 与可重复构建

  • 强制使用 --frozen-lockfile(pnpm)或 npm ci(npm)可保证 CI 严格按锁文件安装。若本地修改了 package.json 却没更新锁文件,CI 会失败------这是好事,防止无意识升级。
  • 若想在 CI 自动更新 lockfile(不推荐),可在临时 job 使用 pnpm install --no-frozen-lockfile,并把新的 lockfile 提交/创建 MR。不过优先流程应是本地开发者更新并提交锁文件。

在 GitLab 上如何配置(UI 操作)

  1. 编写自己项目的 .gitlab-ci.yml 。包含想要执行的各种指令(代码检查、自动打包、自动部署等)。

  2. 项目 -> 构建 -> 流水线 -> 新流水线:

    • 可以创建流水线。
  3. 项目 → Settings → CI/CD → Variables:

    • 添加变量:KeyValue,并设置 Protected(仅在受保护分支/Tags 使用)、Masked(在 job 日志中隐藏)。
    • 用于 token(例如 PRIV_TOKEN)、CA(建议用 base64 存储 INTERNAL_CA_B64)、其他 secret。
  4. Pipeline 页面:可以查看最近的 pipeline,点击 pipeline id 查看各 job 日志、artifacts、测试报告。修改.gitlab-ci.yml文件,直接修改、增添远程仓库项目内容,合并请求等操作也会自动触发流水线。或者手动点击 run pipeline 触发流水线。

  5. Jobs 页面:查看某个 job 的详细日志;可在 job 上点 "Retry" 重新跑,或点击 Debug(如果 runner 支持交互调试)。pipeline 包含多个 stage 阶段,每个 stage 阶段包含多个 job 作业。

  6. Environments / Releases:用于管理部署环境(staging/prod),可以把 Deploy job 绑定到环境,并在 GitLab UI 看到部署历史。

  7. Protected Branches:设置哪些分支能触发 Protected CI(配合 Protected variables 使用)。

相关推荐
!win !3 小时前
前端跨标签页通信方案(下)
前端·javascript
f***45323 小时前
基于SpringBoot和PostGIS的各省与地级市空间距离分析
android·前端·后端
编码追梦人3 小时前
从 “手忙脚乱“ 到 “行云流水“:华为云 DevUI 与 MateChat 如何让前端开发飞起来
前端·华为云
S***H2834 小时前
前端动画实现经验,性能优化与兼容性
前端
xw55 小时前
前端跨标签页通信方案(下)
前端·javascript
正经教主5 小时前
【Git】Git05-01:Git 远程仓库协作流程原理
git·gitlab·github
zzlyx995 小时前
IoTSharp前端VUE采用npm run build编译提示require() of ES Module 出错
前端·vue.js·npm
全栈技术负责人5 小时前
拒绝“无法复现”:前端全链路日志排查实战手册
前端·全链路·问题排查思路
加洛斯5 小时前
前端小知识003:JS中 == 与 === 的区别
开发语言·前端·javascript
b***9105 小时前
【SpringBoot3】Spring Boot 3.0 集成 Mybatis Plus
android·前端·后端·mybatis