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"パラメータ
| パラメータ | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
url | String | はい | - | GraphQLのエンドポイント。httpまたはhttps |
query | String | はい | - | クエリまたはミューテーションのドキュメント |
variables | Object | いいえ | - | ドキュメントが宣言する変数の値 |
operation_name | String | いいえ | - | ドキュメントに複数の操作があるときに実行する操作 |
headers | Object | いいえ | - | Authorizationなどのリクエストヘッダー。下記の既定値を上書きします |
timeout | Duration | いいえ | 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.code | Integer | HTTPステータスコード |
res.status | String | "200 OK"のようなHTTPステータス行 |
res.headers | Object | 正規化した名前をキーとするレスポンスヘッダー |
res.data | Any | レスポンスのdata。ないときはnull |
res.errors | Array | レスポンスのerrors。ないときは空 |
res.body | Any | レスポンスボディ全体。JSONなら解析した値、それ以外は文字列 |
res.rawbody | String | 解析前のボディ。ボディがJSONのときに入ります |
req | Object | 送ったurl、query、variables、operation_name、headers |
rt | Duration | 往復の時間 |
status | Integer | ステータスコードが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は、スキームの既定のポートとして扱います。
ガードを参照してください。