自服务与脚手架

共 18 题
📑 题目列表 18 题
#
★★★

1. 自服务模板如何保证生成代码内置合规与质量门禁

自服务模板如何保证生成的代码内置合规与质量门禁?

  • 模板内置合规与门禁的方式
  • 安全与质量基线随模板固化
  • 门禁的强制执行与可审计

自服务模板保证生成代码内置合规与质量门禁,核心是把"合规与质量要求"固化进模板本身,并让门禁随项目默认开启。具体做法:第一,模板内置合规配置——依赖使用被批准且无漏洞的版本、密钥不使用硬编码而是调用平台密钥服务、日志采用标准格式、默认开启审计;第二,模板内置质量门禁——生成的 CI 流水线默认包含测试覆盖阈值、静态分析(Sonar)、依赖扫描、许可证扫描等质量门禁,且这些门禁作为"默认开启"而非"可选项";第三,门禁强制执行——把门禁绑定到合并/发布流程,未通过则阻止,保证合规无法被绕过;第四,可审计——模板生成的代码可追踪来自哪个模板版本,便于追溯与升级。通过"模板即合规源、门禁即默认",把质量与合规从"代码评审"提前到"代码生成"。

把门禁前置到模板生成,是"左移"思想在平台工程的体现。合规与质量不再依赖每个团队自觉,而是由模板统一保证。这大幅降低了分散团队的合规风险,也提升了质量一致性。

# 模板生成的 CI 门禁示例(默认开启,无法绕过)
quality_gates:
  test_coverage:
    min: 80
    fail_on: below
  sonar:
    gate: passed
    on_failure: block
  dependency_scan:
    block_on: high_cve
  license_scan:
    block_on: [AGPL, GPL]
  secret_scan:
    block_on: hardcoded_secret
#
★★★

2. 平台提供的标准化 CI/CD 模板与团队自定义空间

平台提供的标准化 CI/CD 模板,与团队自定义空间之间如何平衡?

  • 标准化 CI/CD 模板的价值
  • 团队自定义空间的边界
  • 平衡与治理策略

平台提供标准化 CI/CD 模板能保证一致性、可维护性与合规基线(门禁、阶段、部署策略统一),但完全剥夺团队自定义会导致僵化。平衡策略:第一,模板分层——基础阶段(构建、测试、安全扫描、部署)由平台统一并可扩展,团队在"扩展点"上自定义(如添加自定义脚本、自定义测试);第二,明确"契约"与"可定制的钩子"——团队可在平台预留的 hook/extend 位置注入自定义逻辑,但不能破坏核心门禁;第三,"默认安全但可覆盖"——合规门禁默认开启且不可绕过,而流程性配置(如部署方式、环境)可配置;第四,模板版本化——团队锁定模板版本,平台升级模板时团队可平滑升级或在自定义中适配。核心是"平台定义骨架与门禁,团队在骨架内自由发挥",既保证落地一致,又保留灵活性。

标准化与自定义的平衡在于"把不可变的部分(合规、门禁、骨架)固化,把可变的部分(业务逻辑、流程细节)开放"。通过分层与扩展点机制,平台既收敛又灵活,避免"要么僵化、要么失控"。

#
★★★

3. 临时环境(ephemeral environments)的自助开通实现

临时环境(ephemeral environments)的自助开通如何实现?

  • 临时环境的概念与价值
  • 自助开通的技术实现
  • 成本与生命周期管理

临时环境是随 PR/分支按需创建、用完即销毁的隔离环境,用于功能验证、审批与联调,避免长期占用共享环境。自助开通的实现:第一,触发器——基于 Webhook/PR 事件自动触发,或通过平台 CLI/门户手动创建;第二,渲染——基于模板(如 Helm、Kustomize)动态生成环境清单,注入分支对应的镜像与配置;第三,命名空间隔离——每个环境在独立命名空间/集群中运行,避免互相干扰;第四,生命周期管理——自动回收(TTL、PR 关闭时销毁),避免资源泄漏;第五,接入——环境地址自动回写到 PR 评论,方便开发者访问。价值在于:随时可验证、不阻塞共享环境、加速并行开发。成本控制通过 TTL 与资源配额实现。

临时环境是"把环境变成按需资源"的实践,它与"共享环境排队"形成对比,显著减少等待与冲突。实现的关键是"模板化渲染 + 自动创建/销毁 + 隔离命名空间",让环境成为可自助、可回收的流水线产物。

# 临时环境自动化的触发与生命周期示例
on:
  pull_request:
    types: [opened, synchronize, closed]
jobs:
  deploy-ephemeral:
    runs-on: ubuntu-latest
    steps:
      - uses: platform/to-ephemeral-env@v1
        with:
          namespace: "pr-${{ github.event.pull_request.number }}"
          image: "registry/app:${{ github.sha }}"
          ttl: "24h"
          # PR 关闭时自动销毁
#
★★★

4. 脚手架生成代码的「可升级性」中生成后代码与模板脱钩导致的版本漂移如何治理,codemod / 自动化升级路径如何设计?

脚手架生成代码与模板脱钩导致的版本漂移如何治理?codemod / 自动化升级路径如何设计?

  • 版本漂移的成因与风险
  • codemod 机制
  • 自动化升级路径设计

脚手架生成代码一旦生成,若模板后续升级,生成代码不会自动跟随,导致版本漂移(生成代码停留在旧模板,无法获得新能力、安全修复与兼容性)。治理策略:第一,标记生成代码——在生成代码中打上"generated marker"和模板版本号,便于识别与追踪;第二,codemod——模板升级时,提供自动化的代码迁移脚本(codemod),把已有生成代码里的旧 API/配置迁移到新模板,减少手工迁移;第三,自动化升级路径——平台提供"升级向导/命令",检测生成代码与最新模板的差异,自动应用 codemod 并提交 PR,团队评审后合并;第四,版本号与兼容性——模板维护版本与 changelog,升级时声明兼容性与破坏性变更;第五,定期导流——平台定期提醒/批量发起升级,避免长期不升级。通过"标记 + codemod + 升级命令",让生成代码与模板保持同步,抑制漂移。

版本漂移的本质是"生成是一次性,模板是持续演进"。codemod 是弥合"一次性生成"与"持续演进"鸿沟的关键技术,它把"升级模板"变成"可自动执行、可评审"的工程动作,而非依赖手工重写。

#
★★★

5. 生成代码与手写代码的冲突处理中重新生成时如何合并本地修改,generated marker 与分区策略如何设计?

脚手架生成代码与手写代码冲突时,重新生成如何合并本地修改?generated marker 与分区策略如何设计?

  • generated marker 的作用
  • 生成区与手写区的分区策略
  • 重新生成时的合并策略

处理生成代码与手写代码冲突的核心是"分区"与"标记"。分区策略:把代码分成"生成区"(由模板管理、重新生成会覆盖)与"手写区"(由开发者维护、重新生成必须保留)。实现上,用 generated marker 标记生成区——文件头注释(如 // @generated)、或目录划分(如 gen/ 目录)、或代码块标记(// BEGIN GEN / // END GEN)。重新生成时,工具根据 marker 只覆盖生成区,保留手写区;若生成区与手写区存在交叉,则通过冲突检测提示开发者手动合并。设计原则:第一,尽量让生成区与手写区物理分离(不同文件/目录),减少交叉;第二,提供明确的 marker 与文档,让开发者知道哪些可改、哪些会被覆盖;第三,重新生成前用 diff 检测,若手写区有意外修改则告警。通过"分区 + marker + 检测",实现生成与手写的安全共存。

直接覆盖生成区会丢失手写修改,而完全不覆盖又无法享受模板升级。分区与 marker 是"安全的双向"机制:既让模板能更新生成区,又保护手写区。物理分离是减少冲突的最佳实践。

// 生成区(由代码生成器管理,重新生成会覆盖)
// @generated
public class GeneratedServiceTemplate {
    public static final String TEMPLATE_ID = "service-2024.1";
}
// 手写区(开发者维护,重新生成保留)
#
★★

6. 平台中密钥/配置的自助供给与最小权限原则

平台中密钥与配置的自助供给如何实现?如何遵循最小权限原则?

  • 密钥/配置的自助供给
  • 最小权限原则
  • 密钥生命周期管理

平台应提供密钥/配置的自助供给能力,让开发者通过 API/CLI/门户动态获取和管理密钥,而非在代码中硬编码。实现要点:第一,密钥托管——密钥存储在平台密钥管理系统(如 Vault)中,应用运行时通过注入/挂载获取,代码不接触明文;第二,自助供给——开发者按需申请密钥,平台自动生成(如数据库密码、token)并绑定到服务;第三,最小权限——每个服务/密钥只授予其运行所需的最小权限作用域(如只读某库、只访问某资源),避免"一票通";第四,自动轮换——定期轮换密钥并自动更新,降低泄露风险;第五,审计——密钥的创建、访问、轮换记录审计日志。最小权限还体现在"按需申请、按需授权、动态发放",避免预先授予大量权限。通过"先申请、后授权、最小化、可审计"的机制,实现安全的自助供给。

密钥自助供给与最小权限是互补的:自助降低了开发商摩擦,最小权限降低了安全风险。两者结合,平台既好用又安全。硬编码密钥是最大反模式,必须通过平台托管与注入消除。

#
★★

7. 平台能力与业务代码的耦合防止与边界划定

如何防止平台能力与业务代码的耦合?平台能力与业务代码的边界如何划定?

  • 平台与业务耦合的负面影响
  • 边界划定的原则
  • 通过契约与抽象解耦

平台能力与业务代码耦合会导致业务难以独立演进、平台升级波及业务、测试困难。防止耦合的边界划定原则:第一,面向契约而非实现——业务代码通过平台提供的稳定 API/接口使用平台能力,不依赖平台内部实现细节;第二,依赖注入/抽象——通过接口、配置、SDK 封装平台访问,业务代码不直接触碰平台细节(如底层云、K8s);第三,依赖方向——业务依赖平台抽象,平台不反向依赖业务,避免循环依赖;第四,按"能力边界"划分——平台能力聚合为独立模块/服务,业务通过明确入口调用,而非散落各处;第五,版本化契约——平台能力版本化,业务升级可选,避免被迫同步。核心是"业务代码只依赖平台暴露的稳定接口,平台内部实现可变",实现关注点分离与低耦合。

边界划定的本质是"控制依赖方向与契约"。平台是"基础设施层",业务是"应用层",依赖应单向从业务指向平台的抽象接口。良好的边界让平台与业务可独立演进、独立测试。

#
★★

8. 内部模板的版本演进与存量项目升级策略

内部模板如何进行版本演进?存量项目应如何升级到新模板?

  • 模板版本管理
  • 存量项目升级策略
  • 兼容性与迁移

内部模板的版本演进需要规范管理:第一,语义化版本——模板采用 semver(major/minor/patch),major 表示破坏性变更,minor 表示新特性,patch 表示修复;第二,changelog——记录每个版本的变更与迁移说明;第三,兼容性声明——明确哪些变更破坏现有生成代码、哪些向后兼容。存量项目升级策略:第一,检测差异——升级前扫描项目与目标模板的差异;第二,提供迁移工具——使用 codemod 自动迁移生成代码,减少手工;第三,分批升级——按项目/团队分批升级,先试点再推广;第四,可回滚——升级失败可回退到旧模板版本;第五,引导升级——平台定期提醒、提供升级 PR,团队评审后合并。核心是"模板演进有版本与兼容性管理,存量升级有检测、迁移与回滚",让升级可预期、可控制。

模板版本演进与软件版本管理同理,需要语义化版本与兼容性管理。存量升级的关键是"自动化迁移 + 分批 + 可回滚",把"升级模板"变成低风险、可评审的工程动作,避免升级恐惧导致的长期停滞。

#
★★

9. 平台 CLI/UI 的开发者体验(DX)设计原则

平台 CLI/UI 的开发者体验(DX)设计应遵循哪些原则?

  • DX 设计原则
  • CLI 与 UI 的体验要点
  • 一致性、可发现性与反馈

平台 CLI/UI 的 DX 设计原则包括:第一,一致性——命令、参数、输出格式跨工具统一,减少认知负担;第二,可发现性——好的 help、文档、补全、示例,让开发者能快速找到功能;第三,即时反馈——执行即时给出进度、成功/失败信息,错误信息可读、可操作(给出修复建议);第四,默认友好——默认值合理、常用操作最省事,遵循"少输入、快完成";第五,可学习性——命令直观、语义清晰,新手也能快速上手;第六,可组合性——命令可拆解、可脚本化、可自动化,支持 CI 集成;第七,渐进式——CLI 面向深用户体验,UI 面向可视化与探索,两者互补。DX 的核心是"减少摩擦、提升心流",让平台能力"用了就回不去"。

DX 设计直接影响平台采纳率。好的 DX 让开发者愿意用平台,糟糕的 DX 让开发者绕过平台。一致性、可发现性与即时反馈是 DX 的三大支柱,其目标是让开发者"少想、少做、快成"。

#
★★

10. 脚手架的价值中标准化与加速 onboarding?

脚手架的价值是什么?它如何实现标准化与加速 onboarding(新员工/新项目上手)?

  • 脚手架的价值维度
  • 标准化作用
  • 加速 onboarding 的机制

脚手架的价值在于把"从零搭建一个合规项目"的繁琐工作自动化,集中体现在标准化与加速 onboarding。标准化方面:脚手架生成的项目默认遵循统一的技术栈、目录结构、CI/CD、安全与可观测性配置,消除了"每个团队各写一套"的碎片化,让代码结构、门禁、部署方式保持一致,便于维护与协作。加速 onboarding 方面:新成员或新项目通过一条命令即可获得"开箱即用"的项目骨架,无需翻文档、查配置、手工搭建,从"几天才能跑起来"缩短到"几分钟";同时脚手架自带示例与文档,帮助新人快速理解约定。长远看,脚手架还降低了学习成本与重复劳动,让团队把精力放在业务上。价值核心是"把经验固化为模板,让正确实践成为默认"。

脚手架不是"省几次敲命令",而是"知识产品化"。它把组织的最佳实践、合规要求、工具配置沉淀进模板,让任何人都能复现同样高质量的项目起点,从而同时实现标准化与提速。

#
★★

11. 自服务的授权与审计中自助操作的可控性?

自服务操作如何保证授权与审计?自助操作的可控性如何实现?

  • 授权的粒度与模型
  • 审计的完整记录
  • 可控性与风险平衡

自服务要在"便利"与"安全"间取得平衡,需通过授权与审计保证可控性。授权方面:第一,基于角色的访问控制(RBAC)——不同角色(开发者、平台管理员、负责人)拥有不同权限,操作按角色授权;第二,最小权限——自助操作只授予完成任务所需的最小权限,高风险操作(如删除、生产环境变更)需更高权限或审批;第三,策略——用策略(如配额、审批流)约束自助操作的范围。审计方面:第一,全量记录——所有自助操作(创建、修改、删除、权限变更)都记录操作者、时间、对象、结果;第二,可追溯——审计日志可查询、可导出,支持问题回溯与合规审查;第三,预警——异常操作(如频繁删除、越权尝试)触发告警。可控性的核心是"自助但不放任":操作自由,但权限受控、行为可审计、风险可收敛。

自服务的失控风险来自"权限过大与操作不可追溯"。RBAC 与最小权限控制操作边界,审计提供追溯能力,两者结合让自助操作"既高效又可控"。可控性不是阻止自助,而是让自助在治理框架内进行。

#
★★

12. 自服务操作的追溯与成本归属中自助开通环境、权限与资源后的操作日志、审计与成本分摊(chargeback)如何设计?

自助开通环境、权限与资源后,操作日志、审计与成本分摊(chargeback)如何设计以支持追溯与成本归属?

  • 操作日志与审计的完整记录
  • 成本归属(chargeback)设计
  • 追溯与成本可观测

自服务打开了"自助开通"的便利之门,但必须有追溯与成本归属机制。操作日志与审计:所有自助操作(开通环境、申请权限、创建资源)记录操作者、时间、对象、参数与结果,配合策略(如标签、属性)让每笔资源可归属到团队/项目。成本归属(chargeback):第一,资源标签——所有云计算/环境资源创建时自动打上团队/项目/环境标签,作为成本归集的基础;第二,成本分摊——按标签聚合资源用量与费用,把成本分摊到对应团队/项目,形成"谁用谁付"的透明账单;第三,成本可视化——提供成本看板,让团队了解自己的资源消耗与成本;第四,配额与预算——结合配额与成本预算,防止资源浪费。通过"资源标签 + 成本聚合 + 看板 + 配额",自服务既方便又成本透明、可追溯。

没有追溯与成本归属的"自助"会变成"自助浪费"。标签驱动成本归集是 chargeback 的基础,审计日志提供追溯,配额与预算提供约束。这让自服务在"开放"与"问责"之间取得平衡。

#
★★

13. 脚手架生成项目的"可观测性基线"中模板如何默认携带日志、指标与追踪配置,减少事后补装与口径不一致?

脚手架如何默认携带可观测性基线(日志、指标、追踪)?如何减少事后补装与口径不一致?

  • 可观测性基线随模板固化
  • 日志/指标/追踪的标准配置
  • 口径统一的机制

脚手架应默认携带"可观测性基线",让新项目开箱即得日志、指标与追踪配置,避免事后补装与口径不一致。实现方式:第一,日志——模板默认配置结构化日志(JSON)、统一日志格式与级别、日志采集与上报,避免"print 文本";第二,指标——模板默认集成指标库(如 Prometheus 客户端)与默认业务指标(请求量、错误率、延迟、饱和度),并预置监控看板;第三,追踪——模板默认集成分布式追踪(如 OpenTelemetry),自动注入 trace/span,打通调用链;第四,统一口径——模板固化统一的命名规范、标签体系与上报地址,保证各服务指标口径一致,便于聚合与对比。通过"模板默认携带 + 统一口径",可观测性从"后补"变成"默认",从"各写各的"变成"统一基线"。

可观测性后补会导致"口径不一致、无法聚合"的痛点。把基线随模板固化,让每个新服务一出生就具备统一的日志、指标与追踪能力,这是"左移"在可观测性上的体现,也是黄金路径的一部分。

# 模板默认携带的可观测性配置
observability:
  logging:
    format: structured-json
    level: info
    collector: loki
  metrics:
    exporter: prometheus
    default_metrics: [requests_total, error_rate, latency_p99, saturation]
  tracing:
    exporter: otel-collector
    sampling: probabilistic-0.1
#
★★

14. 模板自身的质量保障中模板变更如何评审、生成结果如何冒烟测试,防止缺陷被批量复制?

模板自身的质量如何保障?模板变更如何评审、生成结果如何冒烟测试,防止缺陷被批量复制?

  • 模板变更的评审流程
  • 生成结果的冒烟测试
  • 防止缺陷批量复制

模板是"批量复制"的源头,模板缺陷会被复制到所有生成项目,因此模板自身质量必须严格保障。第一,模板变更评审——模板变更走 PR + 评审,像生产代码一样审查,明确变更意图、影响范围与兼容性;第二,生成结果冒烟测试——每次模板变更后,用模板生成一个"黄金样本"项目,跑通构建、测试、静态扫描、部署冒烟,验证生成结果可用;第三,自动化验证——模板变更触发 CI,自动生成样本并执行门禁(编译、测试、扫描、部署到临时环境),不合格则阻止合并;第四,版本治理——模板变更版本化,破坏性变更需显式声明并评估存量项目影响;第五,试运行——重大变更先在有限团队试点,验证后再全域推广。通过"评审 + 冒烟 + 自动化验证 + 试点",防止模板缺陷被批量复制。

模板是"放大的杠杆":好模板放大价值,坏模板放大缺陷。因此模板变更必须像版本发布一样受控,用"生成样本 + 冒烟测试"验证生成结果,用评审与试点控制风险,确保模板质量可控。

#

15. 自服务与治理(审计/配额)如何兼得

自服务与治理(审计、配额)如何兼得,避免要么僵化要么失控?

  • 自服务与治理的平衡
  • 审计与配额的作用
  • 治理框架设计

自服务与治理兼得的关键是"默认开放、边界治理"。具体做法:第一,默认自助——常规操作(开发环境、CI、资源)默认允许自助,降低摩擦;第二,审计全覆盖——所有自助操作记录审计日志,可追溯、可回溯,不因"自助"而失去监督;第三,配额约束——用配额(资源、环境数量、成本预算)限制自助的边界,防止滥用与浪费;第四,分级授权——高风险操作(生产变更、删除、提权)需更高权限或审批,低风险操作完全自助;第五,策略驱动——用可配置的策略(审批流、配额、安全规则)统一治理,而非人为卡点。核心是"治理内嵌于平台而非平台之外":平台自动执行审计与配额,让自助在治理框架内进行,实现"既高效又可控、既开放又安全"。

自服务与治理的对立是"效率与安全的张力"。解法不是二选一,而是"默认开放 + 边界治理":把治理做成自动化的策略与配额,而非人为审批瓶颈,让团队在安全边界内自由自助。

#

16. 脚手架的维护中模板演进与反馈?

脚手架的长期维护应如何开展?模板演进与反馈如何促进脚手架持续优化?

  • 脚手架维护的职责
  • 模板演进机制
  • 反馈驱动的优化

脚手架不是"建完就完",需要持续维护。维护包括:第一,模板演进——持续更新技术栈、升级依赖、修复模板缺陷、吸收新的最佳实践,保持模板与平台能力同步;第二,反馈收集——通过使用数据(哪些模板被用、生成频率)、工单、满意度调研收集反馈,识别模板的问题与改进点;第三,版本管理——模板版本化,发布 changelog 与迁移指南,支持存量项目平滑升级;第四,质量保障——模板变更走评审与冒烟测试,防止缺陷扩散;第五,社区运营——鼓励团队贡献模板、分享最佳实践,把优秀做法吸收进模板。通过"模板演进 + 反馈闭环 + 版本治理",脚手架持续优化、保持生命力,避免"模板过时、无人维护"。

脚手架的维护成本是平台工程常被低估的部分。模板是资产,需要像产品一样持续演进。反馈驱动的迭代让模板贴合真实需求,版本治理保证升级可控,两者共同支撑脚手架的长期价值。

#

17. 脚手架反馈机制中使用数据与迭代?

脚手架如何建立反馈机制?使用数据与迭代如何驱动脚手架演进?

  • 使用数据的采集
  • 反馈驱动迭代
  • 迭代的度量与验证

脚手架反馈机制通过"使用数据 + 反馈信号 + 迭代验证"闭环驱动演进。第一,采集使用数据——统计模板生成次数、生成后项目留存率、模板被修改/剥离的比例、onboarding 时间、常见问题,识别模板的"好不好用";第二,收集反馈信号——工单、满意度、开发者访谈,捕捉"模板缺什么、哪里难用";第三,分析决策——用数据定位高频痛点(如某配置频繁被改 = 默认值不合理),确定改进优先级;第四,迭代——针对性优化模板(改默认值、新增能力、改善文档),重新发布;第五,验证——迭代后对比数据(生成后修改率是否下降、onboarding 是否更快),确认改进有效。通过"数据驱动 + 反馈闭环",脚手架持续贴合真实使用,而非凭主观拍脑袋。

"生成后频繁被改"是脚手架最关键的信号——它说明默认值不符合真实需求。反馈机制让脚手架以数据为镜,持续迭代优化,避免"模板是好的、用起来是痛"的落差。

#

18. 脚手架与开发环境一致性中模板如何固定语言版本、依赖锁定与容器镜像,减少"在我机器上能跑"问题?

脚手架如何固定语言版本、依赖锁定与容器镜像,以保证开发环境一致性,减少"在我机器上能跑"问题?

  • 环境一致性问题的根源
  • 语言版本、依赖锁定与镜像固定
  • 一致性保证机制

"在我机器上能跑"源于环境不一致(语言版本、依赖、运行时差异)。脚手架通过固定"环境基线"减少此问题:第一,固定语言版本——模板声明确切的运行时版本(如 .tool-versions.nvmrcnode-version),开发与 CI 使用同一版本;第二,依赖锁定——用 lockfile(package-lock.jsonpom.xml 依赖管理)锁定依赖版本,保证可复现构建;第三,容器镜像——提供标准化 Dockerfile 与固定镜像标签,开发、CI、生产使用同一镜像,消除运行时差异;第四,统一开发容器——提供 devcontainer 或统一镜像,让开发者在一致的环境里开发;第五,CI 校验——CI 校验环境约束(版本、lockfile 一致性),防止漂移。通过"版本 + 锁定 + 镜像"的统一,让"哪台机器跑都一样",消除环境不一致导致的"我机器上能跑"问题。

环境不一致是"构建差异"的根源,会导致"本地通过、线上失败"的经典问题。脚手架把环境基线(语言版本、依赖、镜像)固化并锁定,是"可复现构建"的工程保障,让开发、CI、生产环境收敛到一致。

# 模板固定环境基线示例
runtime:
  node: "20.11.0"   # 与 .nvmrc 一致
package_lock: true
image:
  base: "node:20.11.0-slim"
  tag: "sha256:xxxx"  # 固定镜像摘要