Skip to content

ci(openapi): CI に OpenAPI lint(Spectral)を組み込む #204

Description

@win2cot

背景

#120 [Sprint 0 Readiness] のクローズ時(2026-05-22)に、api/openapi.yaml の構文・規約準拠を CI で自動検証する仕組みが存在しない ことが判明した。#120 の受け入れ条件 2(OpenAPI lint 無警告)は、手元に検証ツール(spectral / yq / pip3 等)が無い状況では確認手段がなく、claude-automation-review が PR ごとに目視チェックする運用に依存していた状態。

実害として、以下のリスクが恒常的にある:

  • $ref 切れ、未定義スキーマ参照、循環参照などの構文エラーが merge まで気付かれない可能性
  • 設計規約(レスポンスコード列挙順序、命名規約、description 必須など)違反が PR レビューの粒度に依存
  • クライアントコード生成 / API ドキュメント公開を始めた段階で初めて問題が顕在化するリスク

Sprint 0 本体(#121)着手前 〜 着手直後に CI 検証を整備し、以降の OpenAPI 変更を CI で恒常的にガードする。

対応内容

1. 検証ツールの選定

候補:

ツール 強み 弱み
Spectral(@stoplight/spectral-cli) OAS 3.1 対応、カスタムルール記述可、規約準拠まで検証可能 Node.js 依存、初期セットアップが必要
openapi-spec-validator 軽量、Python 製、$ref 解決まで検証 規約準拠(命名・description 等)はチェック不可
swagger-cli validate 軽量、構文・$ref をチェック カスタムルール不可、OAS 3.1 サポート要確認
Redocly CLI OAS 3.1 対応、規約準拠も検証可 Node.js 依存、Spectral と機能重複

第一候補: Spectral(OAS 3.1 + カスタムルール対応の総合力で他候補を上回る)。代替候補: Redocly CLI。

2. CI workflow への組み込み

.github/workflows/ 配下に新規 workflow(または既存に追加)で以下を実装:

  • トリガ: api/openapi.yaml を変更する PR、または定期実行
  • 実行内容:
    1. Node.js setup
    2. Spectral CLI を npx または npm install で導入
    3. spectral lint api/openapi.yaml を実行
    4. 警告 / エラーがあれば CI fail で merge ブロック

3. Spectral 設定ファイル(.spectral.yaml)

最初は extends: spectral:oas のデフォルトルールから開始。設計規約 §2 の項目を順次カスタムルール化する候補:

ただし 初期は最小ルールから開始し、運用しながら追加する方針が現実的(過剰なルールで merge 不能になる事故を避ける)。

4. ローカル実行手段の整備

開発者がローカルで CI と同じ lint を回せるよう、README または docs/specs/開発計画書.md に手順を記載:

#
npx -y @stoplight/spectral-cli@latest lint api/openapi.yaml

受け入れ条件

  • CI workflow に api/openapi.yaml の lint ジョブが追加され、PR で自動実行される
  • lint 失敗時に merge がブロックされる(branch protection の Required status check に追加)
  • .spectral.yaml(または相当の設定ファイル)がリポジトリにコミットされている
  • ローカル実行手順がドキュメント化されている
  • 現状の api/openapi.yaml がデフォルトルールセットで lint 無警告であることを確認(警告があれば事前に修正する別 PR を切る)

想定スコープ外(別 Issue 候補)

  • 設計規約準拠の カスタムルール 整備(本 Issue ではデフォルトルールまで)
  • 基本設計書・要件定義書と OpenAPI の整合性チェック自動化(別レベル / 別ツール)
  • API ドキュメント公開フロー(Swagger UI / Redoc ホスティング)

関連

備考

  • task-type: task-type:impl(CI workflow の追加)
  • 優先度: priority/p2(本体実装ブロッカではないが、Sprint 0 実装中に整備推奨)
  • area: area/ci + area/openapi

Metadata

Metadata

Assignees

No one assigned

    Labels

    area/ci.github/workflows / CI/CD パイプライン変更area/openapiOpenAPI 仕様(api/openapi.yaml)変更priority/p2Medium。完了が望ましいが柔軟に判断可task-type:implコード実装が主体のタスク

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions