第43章|GitLab CI CD:environments、deployments、review apps

CI 证明“构建可信”,CD 回答把它放哪儿、给谁看、怎么收回来。在 GitLab 里, environment 把一次 job 与命名空间 + URL + 部署历史绑在一起; Review App 则是挂在 MR 上的临时展台——每个合并请求一座快闪店,合并或关闭时拆摊。 本章打通从固定环境到动态预览的完整链路,并接上第 42 章的受保护环境与审批

Environment

Named target

  • name · url
  • deployment_tier
  • tracking & history
Deployments

What shipped

  • commit ↔ job
  • status & rollback
  • UI + API
Review

Ephemeral apps

  • dynamic env name
  • on_stop teardown
  • cost & safety

1. environment:不只是标签,而是“部署锚点”

在 job 上声明 environment 后,GitLab 会把该次执行登记为对某环境的一次部署尝试: 成功、失败、取消都会留下记录。你可以在项目 Operations → Environments 里看到当前 URL、最后一次部署、以及进入历史的入口。 常用字段包括 nameurldeployment_tier(如 development / staging / production,用于展示与策略), 以及用于回收的 on_stop(见后文 Review App)。

deploy_staging:
  stage: deploy
  script:
    - ./deploy.sh staging
  environment:
    name: staging
    url: https://staging.example.com
    deployment_tier: staging
Fixed environments: ladder from dev to prod Each deploy job pins a commit to an environment record development tier: development · fast iteration staging tier: staging · pre-prod validation production tier: production · approvals + protected Deployment history (per environment) commit SHA · job · user · time → rollback / redeploy workflows main@abc1234 → staging #712 ✓ | tag v1.4.0 → production #88 ✓
图 1:环境像逐级升压的站台;每次部署是一条可审计的“谁、何时、哪次提交”。

2. Deployments:可追溯的发布事实

Deployment 在 GitLab 中关联:环境、pipeline、job、提交、触发者。团队用它做发布沟通、变更管理、以及事故回溯(“线上当前是哪一版?”)。 若结合 Kubernetes、Flux 等 GitOps 工具,仍建议把 GitLab deployment 当作人类可读的里程碑,与集群真实状态交叉验证。

3. Review App:每个 MR 一座“快闪店”

核心模式:用动态环境名区分每个 MR(常用 CI_MERGE_REQUEST_IIDCI_COMMIT_REF_SLUG), 部署到独立子域或命名空间;在 environment 上配置 on_stop 指向清理 job,该 job 使用 action: stop 关闭环境,释放资源。 没有 teardown 的 Review App 会像忘收的展台——账单与攻击面一起涨。

review_app:
  stage: review
  script:
    - ./deploy_review.sh
  environment:
    name: review/mr-$CI_MERGE_REQUEST_IID
    url: https://mr-$CI_MERGE_REQUEST_IID.review.example.com
    on_stop: stop_review
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"

stop_review:
  stage: cleanup
  script:
    - ./teardown_review.sh
  environment:
    name: review/mr-$CI_MERGE_REQUEST_IID
    action: stop
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
      when: manual
落地提示:when: manual 的 stop job 适合需要人工确认销毁的场景;也可在 MR 合并或关闭时由另一条规则自动触发清理(依团队工作流选择)。 DNS / TLS 通配符证书、Ingress、数据库隔离策略都要与平台组对齐。
Review App lifecycle MR opened Deploy job env: review/mr-N register url in GitLab Preview live QA / PM click through isolate data · auth stub iterate on push → redeploy on_stop merge / close / manual Same pipeline philosophy as “create resource → bind URL → destroy resource”; infra-as-code keeps it repeatable.
图 2:打开 MR → 部署动态环境 → 验证 → 通过 on_stop 回收;缺失回收链路等于欠技术债。

4. 受保护环境、审批与第 42 章的汇合

production 等环境可配置 Protected environments部署前审批(能力依 GitLab 版本与 tier 有所不同)。 这与受保护分支、受保护变量一起构成“谁能触达线上”的闭环。平台组应把审批人、紧急绕过流程、审计保留写成 runbook,而不是只依赖 UI 记忆。

5. 成本、配额与安全

Review App ephemeral workload quota / TTL cost guardrail network boundary auth · VPN · WAF
图 3:Review App 在同心圆里——内核是实例,外圈是成本与网络安全边界。

6. 与 GitHub Actions / 其他 CD 的对照

概念 GitLab 常见对照
环境元数据 environment 块 + Environments UI GitHub Environments + protection rules
预览部署 Review App + dynamic env branch deploy / Vercel preview 等
清理 on_stop + action: stop workflow_dispatch cleanup / provider hooks

7. 本章清单

  1. 为 staging / production 配置 environmentdeployment_tier,核对 Operations 页展示。
  2. 实现最小 Review App:动态 name、可访问 url、可重复的部署脚本。
  3. 补齐 on_stop 清理 job,并在团队内约定触发方式(手动 / 自动)。
  4. 对生产环境启用审批与受保护策略,与第 42 章变量策略对齐。
  5. 监控预览环境数量与云成本,设置配额与告警。
← 上一章:安全与合规 下一章:Jenkins 入门 →