これまでGraphQLスキーマはサーバー側で必要ないため、リポジトリで管理していませんでした。今回リポジトリで管理するようにしたことでいくつかメリットがあったので、そのことについて書きました。

スキーマをリポジトリで管理して良かったこと

1. スキーマの変更差分をコードレビューできる

サーバー側ではGraphQLスキーマを使用しないため、リポジトリで管理せず、生成されたGraphQLスキーマファイルをそのままフロントエンド開発者に渡していました。

このため、GraphQLの実装を変更した場合、生成されたスキーマから実装変更に該当する箇所を見つけ、どのような型になっているかチェックする必要がありました。この作業は手間がかかるため、スキーマをリポジトリで管理することにしました。これにより、変更した型の差分を簡単に見ることができ、生成された型が意図したものかどうかを確認しやすくなりました。

2. フロント開発者にスキーマを共有する必要がなくなった

以前は、スキーマファイルをSlackで共有していました。しかし、今では共有する手間が省け、共有したファイルがSlackで流れていくことがなくなりました。

さらに、フロントエンド開発者はサーバー側のリポジトリを見ることでスキーマを取得できるようになったため、作業がしやすくなったと思います。

スキーマが最新であることのテストを追加

フロントエンド開発者がサーバー側のリポジトリの GraphQL スキーマを確認することができるようにするためには、リポジトリで管理されているスキーマが最新であることを保証する必要があります。

そのため、スキーマを最新のものに更新することを忘れないようにするために、以下のようなテストを追加しました。

RSpec.describe "Schema" do
  let(:current_definition) { SampleSchema.to_definition }
  let(:printout_definition) { Rails.root.join("docs/graphql/schema.graphql").read }

  it "GraphQLのスキーマが最新の状態であること" do
    expect(current_definition).to eq(printout_definition)
  end
end

テストは、SampleSchema.to_definitionで出力される最新のスキーマの内容と、リポジトリで管理しているスキーマの内容を比較することで行われています。

リポジトリで管理しているスキーマを更新しやすくする

graphql-rubyでは、デフォルトでスキーマをダンプするためのコマンド(rails graphql:schema:idl)が用意されています。 このコマンドは、プロジェクト直下にスキーマが生成されますが、スキーマの管理をスムーズに行うために、指定された場所(docs/graphql/schema.graphql)にスキーマを生成するためのrakeタスクを作成しました。

namespace :graphql do
  namespace :schema do
    desc "リポジトリで管理されているdocs/graphql/schema.graphqlを最新にする"
    task update: :environment do
      exec <<-COMMANDS
        bin/rails graphql:schema:idl;
        mv schema.graphql docs/graphql/schema.graphql;
        echo 'Schema update complete!🎉'
      COMMANDS
    end
  end
end

これで rails graphql:schema:update を実行すれば、リポジトリで管理しているスキーマ (docs/graphql/schema.graphql) をよりスムーズに更新できるようになります。

まとめ

  • スキーマをリポジトリで管理することにより、以下のメリットがあった
    • スキーマの変更差分が見やすくなり、意図しない型定義が生成されていないかコードレビューできるようになった
    • フロントエンドの開発者に最新のスキーマをスムーズに提供できるようになった
  • スキーマの差分確認をするテストを追加し、リポジトリにあるスキーマが常に最新であることを保証した
  • スキーマを更新しやすくするためのrakeタスクを追加した