同步 OpenRPC 规范
自动化 OpenRPC 规范同步,保持 SDK 和文档的最新状态。使用 Fern 设置 GitHub Actions、webhook 和 CI/CD 集成。
保持 OpenRPC 规范与代码库同步对于维护准确的 SDK 和文档至关重要。Fern 提供多种自动化选项来简化这一过程。
GitHub Actions
使用 Fern 的 GitHub Action 在 OpenRPC 规范发生变化时自动更新 SDK 和文档:
.github/workflows/fern.yml
name: Fernon:push:branches:- mainpull_request:branches:- mainjobs:fern-check:runs-on: ubuntu-lateststeps:- name: Checkout repouses: actions/checkout@v4- name: Check OpenRPC specuses: fern-api/action@v0with:command: checkenv:FERN_TOKEN: ${{ secrets.FERN_TOKEN }}fern-generate:runs-on: ubuntu-latestif: github.event_name == 'push' && github.ref == 'refs/heads/main'steps:- name: Checkout repouses: actions/checkout@v4- name: Generate SDKs and docsuses: fern-api/action@v0with:command: generateenv:FERN_TOKEN: ${{ secrets.FERN_TOKEN }}
Webhook 集成
设置 webhook 在 OpenRPC 规范更新时触发 SDK 生成:
generators.yml
api:specs:- spec: openrpc.ymlgithub:repository: your-org/your-repowebhooks:- url: https://your-api.com/webhooks/fernevents: [generate]generators:- name: fern-typescript-sdkversion: 0.8.8output:location: npmpackage-name: "@your-org/jsonrpc-sdk"
从源自动同步
配置 Fern 自动从各种源拉取 OpenRPC 规范:
从 URL
generators.yml
api:specs:- spec: https://api.yourcompany.com/openrpc.ymlauto-sync: truegenerators:- name: fern-typescript-sdkversion: 0.8.8
从 git 仓库
generators.yml
api:specs:- spec:git:repository: https://github.com/your-org/api-specspath: openrpc/api.ymlbranch: maingenerators:- name: fern-typescript-sdkversion: 0.8.8
CI/CD 集成
CircleCI
.circleci/config.yml
version: 2.1orbs:fern: fernapi/fern@1.0workflows:version: 2build-and-test:jobs:- build- test:requires:- build- fern/generate:requires:- testfilters:branches:only: maincontext:- fern-context
GitLab CI
.gitlab-ci.yml
stages:- build- test- generatevariables:FERN_TOKEN: $FERN_TOKENbuild:stage: buildscript:- echo "Building JSON-RPC service..."generate-sdks:stage: generateimage: fernapi/fern:latestscript:- fern generateonly:- main
定期更新
设置定期更新以确保 SDK 保持最新状态:
.github/workflows/scheduled-update.yml
name: Scheduled OpenRPC Updateon:schedule:- cron: '0 2 * * 1' # Every Monday at 2 AM UTCworkflow_dispatch:jobs:update-specs:runs-on: ubuntu-lateststeps:- name: Checkout repouses: actions/checkout@v4- name: Update OpenRPC specsrun: |curl -o fern/openrpc/openrpc.yml https://api.yourcompany.com/openrpc.yml- name: Generate with latest specuses: fern-api/action@v0with:command: generateenv:FERN_TOKEN: ${{ secrets.FERN_TOKEN }}
从 JSON-RPC 服务器生成代码
对于能够生成自己的 OpenRPC 规范的服务器:
.github/workflows/auto-generate.yml
name: Auto-generate from JSON-RPC serveron:push:paths:- 'src/**/*.py' # Trigger on server code changes- 'src/**/*.js'- 'src/**/*.ts'jobs:generate-spec:runs-on: ubuntu-lateststeps:- name: Checkout repouses: actions/checkout@v4- name: Setup environmentuses: actions/setup-python@v4with:python-version: '3.9'- name: Install dependenciesrun: |pip install -r requirements.txt- name: Generate OpenRPC specrun: |python scripts/generate_openrpc.py --output fern/openrpc/openrpc.yml- name: Generate SDKsuses: fern-api/action@v0with:command: generateenv:FERN_TOKEN: ${{ secrets.FERN_TOKEN }}
监控变更
跟踪 OpenRPC 规范的变更:
generators.yml
api:specs:- spec: openrpc.ymlchange-detection:enabled: truebreaking-changes: errornotifications:slack: ${{ secrets.SLACK_WEBHOOK }}email: team@yourcompany.comgenerators:- name: fern-typescript-sdkversion: 0.8.8
多环境同步
为不同环境同步不同的规范:
generators.yml
environments:production:specs:- spec: https://api.prod.yourcompany.com/openrpc.ymloverlays:- prod-overlay.ymlgenerators:- name: fern-typescript-sdkversion: 0.8.8output:location: npmpackage-name: "@yourcompany/prod-sdk"staging:specs:- spec: https://api.staging.yourcompany.com/openrpc.ymloverlays:- staging-overlay.ymlgenerators:- name: fern-typescript-sdkversion: 0.8.8output:location: npmpackage-name: "@yourcompany/staging-sdk"development:specs:- spec: http://localhost:8080/openrpc.ymlgenerators:- name: fern-typescript-sdkversion: 0.8.8output:location: localpath: ./generated-sdk
JSON-RPC 服务器内省
对于支持 OpenRPC 发现的服务器:
scripts/sync_from_server.py
import requestsimport yamlimport jsondef fetch_openrpc_spec(server_url):"""Fetch OpenRPC spec from a JSON-RPC server that supports introspection"""payload = {"jsonrpc": "2.0","method": "rpc.discover","id": 1}response = requests.post(f"{server_url}/rpc", json=payload)spec = response.json()["result"]return specdef save_spec_as_yaml(spec, output_path):"""Convert JSON spec to YAML and save"""with open(output_path, 'w') as f:yaml.dump(spec, f, default_flow_style=False)if __name__ == "__main__":spec = fetch_openrpc_spec("https://api.yourcompany.com")save_spec_as_yaml(spec, "fern/openrpc/openrpc.yml")
这确保了对 OpenRPC 规范的任何破坏性更改都能被检测到,并且在更改传播到 SDK 和文档之前,相关团队成员会收到通知。