Skip to Content

GraphQLアクション

GraphQLアクションは、GraphQLのクエリやミューテーションをHTTPで送り、レスポンスのdataとerrorsを分けて返します。

外部アクションとしてmozership/probe-graphql で公開しています。ワークフローが初めて使うときにProbeがダウンロードし、固定したコミットのaction.ymlが示すSHA-256と一致する実行ファイルだけを実行します。Probe v1.17.0以降が必要です。ガードの下で実行するには、またprobe checkでwithを検査するには、v1.21.0以降が必要です。

基本的な構文

ステップでは40文字のコミットSHAでアクションを固定します。各リリース のノートの先頭に、コピーして使うusesの行があります。

steps: - name: Look up Japan uses: github.com/mozership/probe-graphql@41e4ffa222db58c63c7169117c919e6d252bdbf9 # v0.2.0 with: url: https://countries.trevorblades.com/graphql query: | query Country($code: ID!) { country(code: $code) { name capital currency } } variables: code: JP test: res.code == 200 && len(res.errors) == 0 && res.data.country.capital == "Tokyo"

パラメータ

パラメータ型必須デフォルト説明
urlStringはい-GraphQLのエンドポイント。httpまたはhttps
queryStringはい-クエリまたはミューテーションのドキュメント
variablesObjectいいえ-ドキュメントが宣言する変数の値
operation_nameStringいいえ-ドキュメントに複数の操作があるときに実行する操作
headersObjectいいえ-Authorizationなどのリクエストヘッダー。下記の既定値を上書きします
timeoutDurationいいえ30sリクエストの制限時間。10sのような形式か秒数で指定します。0を指定すると制限しません

これら以外のキーをwithに書くと、何も送る前にステップが失敗します。action.ymlはこれらをparamsとして申告しているため、probe checkがそのキーを行番号とともに報告します。

リクエストはJSONのボディを持つPOSTで、Content-Type: application/json、Accept: application/graphql-response+json, application/json、User-Agent: probe-graphql/<version>を付けて送ります。

レスポンスオブジェクト

プロパティ型説明
res.codeIntegerHTTPステータスコード
res.statusString"200 OK"のようなHTTPステータス行
res.headersObject正規化した名前をキーとするレスポンスヘッダー
res.dataAnyレスポンスのdata。ないときはnull
res.errorsArrayレスポンスのerrors。ないときは空
res.bodyAnyレスポンスボディ全体。JSONなら解析した値、それ以外は文字列
res.rawbodyString解析前のボディ。ボディがJSONのときに入ります
reqObject送ったurl、query、variables、operation_name、headers
rtDuration往復の時間
statusIntegerステータスコードが2xxで、ボディがJSONで、errorsが空なら0。それ以外は1

サーバーが返したレスポンスはすべて結果として扱います。そのため、GraphQLのエラーや500もテストで確かめられます。接続の拒否やタイムアウトのように、レスポンスを得られなかったリクエストだけが、ステップをエラーとして失敗させます。

steps: - name: An unknown field is reported in res.errors uses: github.com/mozership/probe-graphql@41e4ffa222db58c63c7169117c919e6d252bdbf9 # v0.2.0 with: url: https://countries.trevorblades.com/graphql query: '{ country(code: "JP") { nope } }' test: status == 1 && len(res.errors) > 0

ガードの下での動作

このアクションは実行のガードを守り、action.ymlでguard: [read-only, allow-host]を申告しています。そのため、どちらのガードの下でも--allow-actionなしで実行します。拒否したステップは、何も送る前に種類refusedで失敗します。

  • --read-onlyの下では、クエリだけを送ります。実行する操作(operation_nameが指すもの、または文書の中の唯一の操作)をGraphQLのパーサーで読み、ミューテーションとサブスクリプションは拒否します。文書を解析できない場合、操作が複数あるのにoperation_nameがない場合、operation_nameが指す操作が文書にない場合も拒否します。
  • --allow-hostの下では、urlのホストと、各リダイレクト先のホストが、実行が許可するものでなければなりません。ポートのないURLは、スキームの既定のポートとして扱います。

ガードを参照してください。

関連項目

  • 外部アクション - Probeが外部アクションを解決し、照合する仕組み
  • HTTP - そのほかのHTTPリクエスト
  • JMAP - Probeとあわせて公開しているもう1つの外部アクション
更新日時