名称: graphql-inspector-ci 用户可调用: false 描述: 当在CI/CD流水线、GitHub Actions或GitLab CI中设置GraphQL Inspector进行自动模式验证时使用。 允许工具: [Read, Write, Edit, Bash, Glob, Grep]
GraphQL Inspector - CI/CD集成
专业知识,用于在持续集成和部署流水线中集成GraphQL Inspector,实现自动模式和操作验证。
概述
GraphQL Inspector提供多种CI/CD集成选项,从简单的CLI命令到专用的GitHub Apps和Actions。此技能涵盖所有自动化GraphQL质量保证的集成模式。
GitHub App
官方GitHub App提供最丰富的集成:
功能
- 在拉取请求中自动模式差异
- 评论包含破坏性变化摘要
- 在破坏性变化时阻止合并
- 自动与基础分支比较
安装
- 从GitHub Marketplace安装
- 配置
.github/graphql-inspector.yaml:
schema: 'schema.graphql'
branch: 'main'
endpoint: 'https://api.example.com/graphql'
diff: true
notifications:
slack: ${{ secrets.SLACK_WEBHOOK }}
GitHub Actions
基本模式差异
name: GraphQL模式检查
用户可调用: false
on:
pull_request:
paths:
- 'schema.graphql'
- '**/*.graphql'
jobs:
schema-check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: 设置Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: 安装GraphQL Inspector
run: npm install -g @graphql-inspector/cli
- name: 检查破坏性变化
run: |
graphql-inspector diff \
'git:origin/main:schema.graphql' \
'schema.graphql'
完整验证流水线
name: GraphQL验证
用户可调用: false
on:
pull_request:
paths:
- '**/*.graphql'
- 'src/**/*.tsx'
- 'schema.graphql'
jobs:
validate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: 设置Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: 安装依赖
run: npm install -g @graphql-inspector/cli
- name: 模式差异
id: diff
run: |
graphql-inspector diff \
'git:origin/main:schema.graphql' \
'schema.graphql' \
--onlyBreaking
continue-on-error: true
- name: 验证操作
run: |
graphql-inspector validate \
'src/**/*.graphql' \
'schema.graphql' \
--maxDepth 10
- name: 审计操作
run: |
graphql-inspector audit \
'src/**/*.graphql'
- name: 在PR上评论
if: steps.diff.outcome == 'failure'
uses: actions/github-script@v7
with:
script: |
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: '⚠️ 检测到破坏性GraphQL模式变化!'
})
多模式矩阵策略
name: 多模式验证
用户可调用: false
on: pull_request
jobs:
validate:
runs-on: ubuntu-latest
strategy:
matrix:
service:
- { name: 'users', schema: 'services/users/schema.graphql' }
- { name: 'orders', schema: 'services/orders/schema.graphql' }
- { name: 'products', schema: 'services/products/schema.graphql' }
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: 安装GraphQL Inspector
run: npm install -g @graphql-inspector/cli
- name: 差异${{ matrix.service.name }}
run: |
graphql-inspector diff \
'git:origin/main:${{ matrix.service.schema }}' \
'${{ matrix.service.schema }}'
GitLab CI
基本配置
stages:
- validate
graphql-diff:
stage: validate
image: node:20
before_script:
- npm install -g @graphql-inspector/cli
script:
- graphql-inspector diff "git:origin/main:schema.graphql" schema.graphql
rules:
- changes:
- "**/*.graphql"
graphql-validate:
stage: validate
image: node:20
before_script:
- npm install -g @graphql-inspector/cli
script:
- graphql-inspector validate 'src/**/*.graphql' schema.graphql
rules:
- changes:
- "**/*.graphql"
- "src/**/*.tsx"
合并请求评论
graphql-diff:
stage: validate
image: node:20
script:
- npm install -g @graphql-inspector/cli
- |
OUTPUT=$(graphql-inspector diff "git:origin/main:schema.graphql" schema.graphql 2>&1 || true)
if [[ "$OUTPUT" == *"Breaking"* ]]; then
curl --request POST \
--header "PRIVATE-TOKEN: $GITLAB_TOKEN" \
--data "body=⚠️ 检测到破坏性GraphQL变化" \
"$CI_API_V4_URL/projects/$CI_PROJECT_ID/merge_requests/$CI_MERGE_REQUEST_IID/notes"
fi
CircleCI
version: 2.1
jobs:
graphql-check:
docker:
- image: cimg/node:20.0
steps:
- checkout
- run:
name: 安装GraphQL Inspector
command: npm install -g @graphql-inspector/cli
- run:
name: 模式差异
command: |
graphql-inspector diff \
'git:origin/main:schema.graphql' \
'schema.graphql'
- run:
name: 验证操作
command: |
graphql-inspector validate \
'src/**/*.graphql' \
'schema.graphql'
workflows:
validate:
jobs:
- graphql-check
配置文件
创建.graphql-inspector.yaml用于所有命令:
# 模式配置
schema:
path: './schema.graphql'
# 或用于联邦
# federation: true
# 差异配置
diff:
rules:
- suppressRemovalOfDeprecatedField
failOnBreaking: true
failOnDangerous: false
notifications:
slack: ${SLACK_WEBHOOK_URL}
# 验证配置
validate:
documents: './src/**/*.graphql'
maxDepth: 10
maxAliasCount: 5
maxComplexityScore: 100
# 审计配置
audit:
documents: './src/**/*.graphql'
高级模式
缓存依赖
# 带缓存的GitHub Actions
- name: 缓存npm
uses: actions/cache@v4
with:
path: ~/.npm
key: ${{ runner.os }}-graphql-inspector
- name: 安装GraphQL Inspector
run: npm install -g @graphql-inspector/cli
Slack通知
- name: 在破坏性变化时通知Slack
if: failure()
uses: slackapi/slack-github-action@v1
with:
payload: |
{
"text": "⚠️ 在${{ github.repository }}中检测到破坏性GraphQL变化",
"attachments": [{
"color": "danger",
"title": "拉取请求#${{ github.event.pull_request.number }}",
"title_link": "${{ github.event.pull_request.html_url }}"
}]
}
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK }}
必需状态检查
配置仓库设置:
- 转到设置 → 分支 → 分支保护规则
- 启用“要求状态检查通过”
- 添加“GraphQL模式检查”作业作为必需项
远程模式比较
- name: 与生产环境差异比较
run: |
graphql-inspector diff \
'https://api.production.example.com/graphql' \
'schema.graphql'
env:
GRAPHQL_INSPECTOR_HEADERS: |
Authorization: Bearer ${{ secrets.PROD_API_TOKEN }}
最佳实践
- 快速失败 - 使用
--onlyBreaking专注于关键问题 - 缓存安装 - 使用npm缓存加速CI
- 必需检查 - 使模式验证成为必需检查
- 分支保护 - 在破坏性变化时阻止合并
- 通知 - 在破坏性变化时提醒团队
- 文档 - 在评论中链接到迁移指南
- 多环境 - 针对暂存和生产环境验证
- 并行作业 - 并行运行差异、验证和审计
故障排除
“权限被拒绝”用于git引用
- uses: actions/checkout@v4
with:
fetch-depth: 0 # 获取完整历史记录
CI中“模式未找到”
- 验证文件路径在仓库中是否正确
- 检查模式是否已提交(未被git忽略)
- 如果相对路径失败,使用绝对路径
本地与CI结果不同
- 确保GraphQL Inspector版本相同
- 检查Node.js版本匹配
- 验证git引用是否可访问
何时使用此技能
- 设置自动模式验证
- 在CI中配置破坏性变化检测
- 构建GraphQL质量门
- 与GitHub/GitLab工作流集成
- 为模式变化创建PR评论
- 在破坏性变化时阻止部署