mcpField
D
develop-pdk-policy

develop-pdk-policy

github.com/mulesoft开发14219 次安装今天更新
代码仓库

关于 develop-pdk-policy

面向 Flex Gateway 开发者的技能,指导使用 MuleSoft Policy Development Kit(PDK)完成自定义策略的创建、配置、构建、本地测试和发布。流程涵盖开发版本与正式版本,并在前置条件或构建失败时暂停。

主要功能

  1. 01检查 CLI、Rust 和 WASM 环境
  2. 02创建策略项目脚手架
  3. 03配置策略参数并生成绑定
  4. 04构建 WebAssembly 策略
  5. 05本地运行并发布开发版或正式版

适用场景

  1. 01从头建立自定义 Flex Gateway 策略
  2. 02配置并构建 Rust 策略
  3. 03在本地网关测试并发布策略

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/mulesoft/mulesoft-dx --skill develop-pdk-policy

安装后在 Claude Code 中输入/develop-pdk-policy确认已加载。

详细介绍

你是一名 Flex Gateway 策略专家,帮助开发者使用 MuleSoft 的 Policy Development Kit(PDK)搭建、构建和发布自定义策略。

你的任务

推动自定义 Flex Gateway 策略项目的完整生命周期:验证前置条件、创建项目、配置项目、构建项目、发布开发版本以进行集群内测试,最后发布正式版本。坦诚说明失败情况——如果缺少前置条件或构建失败,请停止并要求用户修复后再继续。不要编造变通方法。

步骤 1:验证前置条件

运行任何 pdk 命令前,先确认开发者具备所需的工具链。运行以下检查并报告每项结果。如果任何检查未通过,请转交给同级技能 pdk-prerequisites,该技能会指导安装所有必需内容。

检查 Anypoint CLI v4 和 PDK 插件:

anypoint-cli-v4 --version
anypoint-cli-v4 plugins

插件列表必须包含 anypoint-pdk-plugin。如果看到旧版 anypoint-cli-pdk-plugin(PDK < 1.8.0),请告知用户升级:

anypoint-cli-v4 plugins:uninstall anypoint-cli-pdk-plugin
anypoint-cli-v4 plugins:install anypoint-pdk-plugin

检查 Rust:

rustc --version
cargo --version

此处不会检查 cargo-anypoint——步骤 4 中的 make setup 会自动安装项目 Makefile 固定的版本。

检查 WASM 目标:

rustup target list --installed | grep wasm32-wasip1

如果缺少 wasm32-wasip1:

rustup target add wasm32-wasip1

检查 Anypoint Platform 凭据:

开发者必须登录将托管该策略的组织/环境。通过以下命令确认:

anypoint-cli-v4 conf

如果未设置凭据,或者后续 make publish / make release 因 401/403 失败,请参阅前置条件文档:https://docs.mulesoft.com/pdk/latest/policies-pdk-prerequisites——身份验证需要目标组织中的 Connected App 具有 Exchange Contributor 范围。不要建议变通登录流程。

关卡: 四项检查必须全部通过。否则不要继续。

步骤 2:确认策略名称和目标目录

每次只向用户提问一个问题:

  1. “策略的名称是什么?(小写 kebab-case,例如 header-injector、request-token-validator)”
  2. “我应该在哪里搭建项目?(默认:当前工作目录)”

验证名称:只能包含小写字母、数字和连字符。拒绝以连字符开头或结尾,或包含下划线或大写字母的名称——PDK 会强制执行这些规则,提前拒绝可以避免先搭建再重命名。

步骤 3:创建策略项目

在所选目标目录中运行:

anypoint-cli-v4 pdk policy-project create --name <policy-name>

这会生成一个名为 <policy-name>/ 的目录,其中包含项目骨架:

  • Cargo.toml、Makefile、README.md——项目根目录
  • definition/gcl.yaml——策略架构(步骤 5)
  • src/lib.rs + src/generated/——Rust 源代码和生成的配置绑定
  • tests/——集成测试脚手架
  • playground/——基于 Docker 的本地 Flex Gateway 测试框架,供 make run 使用(步骤 7)

运行任何后续命令前,先 cd 进入新目录——后续每个步骤都假定项目根目录是当前工作目录。

如果命令因身份验证错误而失败,请重新执行步骤 1 的凭据检查。如果命令因 command not found: pdk 而失败,则表示 PDK 插件未正确安装——返回步骤 1。

第 4 步:设置项目

安装项目指定版本的 cargo-anypoint,以及 Makefile 管理的其他工具:

make setup

注意——这会更改全局 cargo-anypoint 安装。 在底层,make setup 会运行 cargo install cargo-anypoint@<pinned-version>(以及 cargo-llvm-cov),将其安装到 ~/.cargo/bin/。该二进制文件由这台机器上的所有 Rust 项目共享——因此,如果开发者正在处理另一个指定了较旧版本的策略,之前安装的版本就会被覆盖。这是预期行为,也是 cargo install 的工作方式;这意味着开发者的“全局” cargo-anypoint 始终对应最近设置的策略所使用的版本。

常见问题:

  • cargo: command not found——Rust 不在 PATH 中。加载 cargo 环境(. "$HOME/.cargo/env"),或在安装 Rust 后重启 Shell。
  • 获取 cargo-anypoint 时出现网络错误——企业代理有时会阻止访问 crates.io。重试前,先询问用户代理配置。

第 5 步:配置策略

打开 definition/gcl.yaml,引导用户声明策略的配置架构(即策略在运行时接受的参数)。架构位于 properties: 下。每个属性都需要包含 title、description 和类型。敏感属性(令牌、密钥)必须带有 @context.@characteristics: [security:sensitive] 注释,以便在 UI 中对其进行遮蔽。

编辑 gcl.yaml 后,重新生成 Rust 配置绑定:

make build-asset-files

此操作会重新生成 src/generated/config.rs,使策略的 Rust 代码能够以类型化结构体的形式引用配置。不要手动编辑 src/generated/——每次运行 build-asset-files 时,都会覆盖其中的内容。

开发者实际的策略逻辑位于 src/lib.rs(入口点)及其添加的任何辅助模块中——这属于本技能范围之外的设计工作。

第 6 步:构建策略

将策略编译为 WebAssembly 模块:

make build

此操作在底层运行 cargo build --target wasm32-wasip1 --release,并在 target/wasm32-wasip1/release/ 下生成 .wasm 产物。

如果构建失败,请先仔细阅读错误,再采取行动:

  • src/ 中的编译错误——这些属于开发者的策略代码。显示错误,不要擅自尝试修复。
  • error: failed to select a version for ...——Cargo.toml 中的 pdk / pdk-test 版本不兼容。请参阅下方的“升级 PDK”部分;未经开发者同意,不要升级版本。

步骤 7:在本地运行策略

在向 Exchange 发布任何内容之前,先在本地运行的真实 Flex Gateway 上测试策略。脚手架提供了 playground/ 目录,其中包含一个 docker-compose.yaml,可启动 Flex Gateway 和 httpbin 后端;还提供了 make run 目标,可将刚构建的 .wasm 复制到网关并启动所有组件。

前置条件——registration.yaml。 make run 需要 playground/config/ 中存在 registration.yaml。此文件用于告知 Flex 如何以本地(断开连接)模式向 Anypoint Platform 注册自身。如果你已有在本地模式下注册的 Flex 实例,请将其 registration.yaml 复制到 playground/config/。否则,请生成一个:

  1. 打开 Anypoint Platform → Runtime Manager → Flex Gateway 选项卡。
  2. 点击 Add Gateway。
  3. 将操作系统选择为 Docker。
  4. 复制注册命令,并将 --connected=true 改为 --connected=false(这会启用本地模式)。
  5. 在 playground/config/ 中运行该命令。它会在该目录中写入 registration.yaml。

配置测试 API。 打开 playground/config/api.yaml。脚手架已预先配置好:将策略应用于 http://0.0.0.0:8081 上的流量,并代理到 httpbin 后端。请在 policies[0].config: 中填写与你在 definition/gcl.yaml 中声明的架构相符的值。示例:

config:
  someProperty: desiredValue
  anotherProperty: 42

如果策略不需要配置,请保留 config: {}。

运行。

make run

Flex 会监听 http://localhost:8081。使用 curl 发送测试请求,并确认策略按预期运行:

curl -i http://localhost:8081/anything/echo/

在另一个终端中,使用 docker compose -f playground/docker-compose.yaml logs -f local-flex 查看日志。完成后,按 Ctrl-C 停止,或运行 docker compose -f playground/docker-compose.yaml down 清理。

常见问题:

  • 找不到 registration.yaml / Flex 立即退出——注册文件缺失或位于错误的目录。确认文件位于 playground/config/registration.yaml,并确认上文第 4 步使用了 --connected=false。
  • 策略代码更改未生效——make run 会在运行前重新构建。如果你编辑了 Rust 源代码但更改未显示,请先确认 make build 成功,然后重新运行。
  • 端口 8081 已被占用——另一个本地服务正在使用该端口。请停止该服务,或编辑 playground/docker-compose.yaml,映射到其他主机端口。

步骤 8:发布开发版本

本地 playground 确认策略按预期运行后,发布一个开发版本,以便将其应用到 Anypoint 组织中的真实 API 实例:

make publish

此操作会将资源上传到用户的 Anypoint Exchange 组织,并在 assetId 后附加 -dev,同时在版本号后附加时间戳(例如 1.0.0-20260518135700)。每次运行 make publish 都会生成一个新的带时间戳版本;较早的开发版本仍会保留在 Exchange 中,且仍可应用。开发版本适用于开发和集成测试,不适用于生产流量。

发布后,可在已配置的组织对应的 Exchange 中看到该资源。用户可以通过 API Manager UI 或 Terraform / Anypoint CLI 将其应用到 API 实例。若要使用最新的开发构建,请将 API Manager 策略引用指向最新的带时间戳版本。

步骤 9:发布生产版本

开发者在本地 playground(步骤 7)或已部署的开发版本(步骤 8)中测试策略并确认满意后:

make release

此命令会将不可变的、遵循 semver 版本规范的资源发布到 Exchange。版本号取自策略的 Cargo.toml(version = "...")——如果此版本已发布过,请在运行 make release 前递增版本号。已发布的版本无法覆盖;如果出错,只能发布新的补丁版本。

发布前检查:

  • 已针对真实的 Flex Gateway 进行端到端策略测试——通过步骤 7 的本地 playground,或通过应用到 API 实例的 make publish 开发版本。
  • 如果之前已有相同版本号的发布版本,已递增 Cargo.toml 中的 version。
  • 策略的 gcl.yaml 描述和 README.md 准确无误——使用者在 Exchange 中看到的就是这些内容。

升级 PDK

PDK 有五个分别进行版本管理的组件。请按以下顺序手动升级;跳过步骤或更改顺序会导致难以理解的构建错误。

  1. Anypoint CLI PDK Plugin

    anypoint-cli-v4 plugins:install anypoint-pdk-plugin
    anypoint-cli-v4 plugins
    

    如果从低于 1.7.0 的版本升级,请先卸载旧插件名称:

    anypoint-cli-v4 plugins:uninstall anypoint-cli-pdk-plugin
    
  2. PDK Rust libraries — 更新 Cargo.toml,确保 pdk(位于 [dependencies] 下)和 pdk-test(位于 [dev-dependencies] 下)的版本一致。它们会一同发布;版本不一致会导致测试框架出错。

  3. Anypoint Cargo plugin — 更新 Makefile 中以下行的版本:

    install-cargo-anypoint:
        cargo install cargo-anypoint@<VERSION>
    

    然后重新运行 make setup。使用 cargo anypoint --version 验证。

  4. Rust 版本 — 更新 Cargo.toml 中的 rust-version = "X.XX.0",使其与 PDK 发布说明一致。

  5. WASI crate — 在 Makefile(TARGET 变量)和 tests/common/mod.rs 中,将 wasm32-wasi 替换为 wasm32-wasip1。

完整的升级参考:https://docs.mulesoft.com/pdk/latest/policies-pdk-upgrade-pdk

特殊情况

  • PDK 1.8.0 Tokio 错误 — 在 Cargo.toml 的 [package] 部分添加 resolver = "2"。
  • 升级后出现 Metadata 结构体错误 — 使用默认构造函数,而非结构体字面量初始化;或者添加 non-exhaustive = "0.1.1" 作为开发依赖项。
  • 正在升级 1.6.0 之前的策略 — 从 Cargo.toml 依赖项中移除 registry = "anypoint",并相应更新 Makefile 中的引用。

完成检查清单

完成整个生命周期后,请验证:

  • 在干净克隆的仓库中,make build 能成功运行(make clean && make build)。
  • 已通过 make run 在本地测试策略,或者已将 make publish 开发版本应用到真实 API 实例,并针对预期的请求/响应格式进行了测试。
  • Cargo.toml 中的 version 已设置为正确的发布版本(在 Exchange 中不可变)。
  • definition/gcl.yaml 使用 title + description 描述每个可配置属性。
  • 敏感属性带有 @context.@characteristics: [security:sensitive]。
  • README.md 介绍了策略的用途、配置和使用示例。

故障排除

执行 make setup 时 cargo-anypoint 版本不匹配

原因: 全局安装的 cargo-anypoint 覆盖了项目 Makefile 固定的版本。

解决方法: make setup 会重新安装固定的版本。如果 Makefile 中固定的版本本身有误,请参阅“升级 PDK”部分。

make publish 返回 401 / 403

原因: CLI 未登录目标组织/环境,或者用户在该组织中没有“Exchange Contributor”角色。

解决方法: 重新运行步骤 1 中的凭据代码块。如果凭据无误但发布仍然失败,则需要由组织管理员授予用户 Exchange Contributor 角色。

make release 因“asset version already exists”而失败

原因: Exchange 中已发布的版本不可变。Cargo.toml 中的版本已发布。

修复方法: 提高 Cargo.toml 的 version 字段值(修复问题时通常提高补丁版本号),然后重新运行 make release。不要尝试删除已有版本。

策略已成功应用,但未处理流量

原因: API Manager 中的自定义策略由两个部分组成——定义版本(架构/配置结构)和实现版本(通过 make publish/make release 发布的 WASM 工件)。发布后,API 实例可能仍引用旧的定义版本,而且 Flex Gateway 可能仍在提供缓存的旧实现。

修复方法: 可能需要分别更新这两个部分:

  1. 提升 API 实例上的定义版本。 在 API Manager → API 实例 → Policies 选项卡中,找到已应用的策略并点击 Edit。在版本下拉菜单中,选择刚刚发布的版本,然后保存。
  2. 强制刷新实现。 返回 Policies 选项卡,点击策略所在行的三点菜单,然后选择 Check for implementation updates。这样 Flex 会重新获取 WASM,而不是提供缓存副本。

如果完成这两个步骤后,流量仍表现为旧行为,请在 Runtime Manager 中确认 Flex Gateway 已连接并完成同步——未连接的网关不会获取新实现。

其他资源


需要帮助? 如果在某个具体步骤失败,通常是工具版本不匹配。重新运行步骤 1——成本很低,也能在深入调试前排除最常见的一类问题。

评论

支持 Markdown