Skip to Content
リファレンスYAMLフィールド

YAML設定リファレンス

Probeがワークフローファイルから読み取るキー、式が評価されるコンテキスト、バリデーションの規則をまとめます。

ワークフローの構造

以下の雛形は、ワークフローファイルに書けるプロパティと、それぞれの位置を示しています。

name: string # 必須: ワークフロー名 description: string # 任意: ワークフローの説明 vars: # 任意: ワークフロー変数 key: value secrets: # 任意: 出力で伏せる環境変数 - NAME jobs: # 必須: ジョブのリスト - name: string # 必須: ジョブ名 id: string # 任意: ジョブ ID。needs から参照する needs: [job-id, ...] # 任意: 依存するジョブ skipif: expression # 任意: 真ならジョブをスキップ defaults: # 任意: アクションごとの with の既定値 http: url: string repeat: # 任意: ジョブを繰り返す count: integer interval: duration steps: # 必須: ステップのリスト - name: string # 任意: ステップ名 id: string # 任意: ステップ ID。outputs の公開に必要 uses: string # 必須: アクション名 with: # 任意: アクション引数 key: value test: expression # 任意: アサーション echo: string # 任意: レポートに出力する文字列 vars: # 任意: ステップ変数 key: value outputs: # 任意: 後続へ渡す値 key: expression skipif: expression # 任意: 真ならステップをスキップ wait: duration # 任意: 実行前の待機 timeout: duration # 任意: ステップのタイムアウト iteration: # 任意: 要素ごとにステップを繰り返す - key: value retry: # 任意: 失敗時のリトライ max_attempts: integer interval: duration initial_delay: duration

jobsはリストです。ジョブIDをキーにしたマップで書くと読み込みに失敗します。

トップレベルのenvとdefaultsはありません。環境変数はvarsを通して読み、defaultsはジョブに書きます。

トップレベルのプロパティ

ワークフローファイルのルートには、jobsのほかに4つのプロパティを置きます。名前、説明、開始時点の値、そしてそのうち表示してはいけない値です。

name

型: String(必須) 説明: ワークフロー名。レポートの先頭に表示されます。

name: "API Health Check"

description

型: String(任意) 説明: ワークフローの説明。

description: | 本番 API を確認します。 - エンドポイントの死活 - レスポンスタイム

vars

型: Object(任意) 説明: すべてのジョブとステップからvars.<name>で参照できる変数です。

環境変数が見えるのはvarsの中だけで、変数名をそのまま書いて参照します。値は最初のジョブが始まる前に一度だけ評価されます。

vars: # 環境変数を読む api_url: "{{API_URL}}" # デフォルト付き timeout: "{{REQUEST_TIMEOUT ?? '30s'}}" # 読み込み時に計算する run_id: "{{random_str(8)}}" # ネストした値も書ける auth: user: "{{API_USER}}"

ステップの式から環境変数を直接読むことはできません。式のコンテキストにenvは存在しないため、varsに置いてvars.<name>で参照します。

ある変数から別の変数をvars.<name>で参照できます。参照先がブロックのどこに書かれていても構いません。各変数は参照している変数の後に評価されるため、ランダムなパスワードのように一度だけ計算される値は、それを使って組み立てたどの変数でも同じになります。

vars: http_port: "{{HTTP_PORT ?? '18080'}}" base: "http://localhost:{{vars.http_port}}" password: "{{PASSWORD ?? random_str(24)}}" basic_auth: "Basic {{encode_base64('alice:' + vars.password)}}"

直接または他の変数を経由して自分自身を参照する変数があると、最初のジョブが始まる前にvars: circular reference: a -> b -> aのように経路を示すエラーでワークフローが止まります。変数でない名前は nil として読まれるので、vars.<name> ?? 'default'はデフォルト値になります。vars[KEY]のように実行時に決まるキーでvarsを読む変数は、他のすべての変数の後に評価されます。テンプレートファイルから作る変数のようにtemplateを呼ぶ変数は、テンプレートが何を読むかが実行するまで分からないため、templateを呼ばないすべての変数の後に評価されます。テンプレートが、templateを呼ぶ別の変数のうちまだ評価していないものを読む場合は、その変数を先に評価します。両者の参照が循環していれば、ほかの変数の循環と同じくワークフローを止めます。

リストの中のテンプレートも、マップと同じくどの深さでも評価されます。ports: ["{{vars.http_port}}"]はポート番号を持ちます。

nil のフィールドを読む{{nothing.here}}のように評価できないテンプレートを持つ変数があると、最初のジョブが始まる前に終了ステータス2でワークフローが止まります。エラーにはvars.a: {{nothing.here}}: cannot fetch here from <nil>のように変数とテンプレートが示されます。評価できなかった変数を参照する変数は評価しないため、同じエラーが重ねて出ることはありません。

secrets

型: 文字列の配列(任意) 説明: Probeが表示・書き出すものに、値を出してはいけない環境変数の名前です。

secrets: - API_TOKEN - DB_PASSWORD vars: api_token: "{{API_TOKEN}}" db_password: "{{DB_PASSWORD}}"

列挙した変数の値が現れる箇所には、代わりに<secret:NAME>と書きます。対象は、端末のレポート、ステップ名、echo、失敗したステップについて表示するリクエストとレスポンス、--verboseの出力、アクション自身のログ、--reportで書き出すファイルです。エラーメッセージで引用符に囲まれたときやJSONに埋め込まれたときのエスケープされた形も伏せます。ステップ、テスト、outputsは本来の値をそのまま使い、変わるのは表示だけです。

設定されていない名前や空文字列の名前は、伏せる値が無いので無視します。短い値は現れるたびに置き換えるため、1のような値を指定すると出力中のすべての1が伏せられます。

secretsとは別に、Authorization、Proxy-Authorization、Cookie、Set-Cookieヘッダの値は常に<redacted>と表示します。ログインのステップが返し、後のリクエストで送るトークンのように、実行中に得た値はsecretsに書けませんが、これらのヘッダのどれかで送られます。Probeはアクションがこれらの値を送る直前と受け取った時点で値を覚え、以降はアクション自身のログも含めて伏せます。

アクションに渡す資格情報も同じです。withのどの階層にあってもpasswordとkey_passphraseの値は<redacted>と表示します。dbアクションのdsnのようなデータベースURLは、パスワードの部分だけを伏せ、それ以外はそのまま表示します。そのため、ステップに直接書いたパスワードは、secretsに書かなくても--verboseの出力やアクションのログに出ません。こうした値のテンプレートを評価できなかった場合、エラーにはwith.passwordのように値の場所を示しますが、理由は示しません。テンプレートにもエラーの文面にも資格情報が含まれうるためです。

ジョブ

jobsはジョブ名からジョブ定義へのマップです。ジョブは順に実行するステップをまとめ、依存先を宣言します。

ジョブのプロパティ

ジョブの定義では以下のプロパティを指定します。

プロパティ型必須説明
nameString必須ジョブ名。テンプレート式が使えます
idString任意他ジョブのneedsから参照する識別子。省略時は自動採番されます
needsArray任意先に完了している必要があるジョブのID
stepsArray必須実行するステップ
skipifExpression任意真ならジョブ全体をスキップ
defaultsObject任意アクション名をキーとしたwithの既定値
repeatObject任意ジョブを繰り返す

ジョブにif、continue_on_error、timeoutはありません。

needs

依存のないジョブは並列に開始します。needsが参照するのはジョブのIDなので、依存される側には明示的なidが必要です。

jobs: - id: setup name: Setup steps: - name: Prepare uses: hello echo: "ready" - name: Test needs: [setup] steps: - name: Run uses: hello echo: "testing"

skipif

ブール式です。真と評価されるとジョブをスキップします。

jobs: - name: Production only skipif: vars.environment != "production" steps: - name: Check uses: http with: url: "{{vars.api_url}}/health" method: GET

defaults

ジョブ内の該当アクションを使うステップのwithにマージされる既定値です。ステップ側の指定が優先されます。

jobs: - name: API checks defaults: http: url: "{{vars.api_url}}" headers: authorization: "Bearer {{vars.token}}" accept: application/json steps: - name: Health uses: http with: get: /health # 既定の url からの相対パス test: res.code == 200

httpアクションはメソッドの指定が必須です。methodを明示するか、get / post / put / delete / patchといった省略記法を使います。省略記法の値は完全なURLか、urlからの相対パスです。

- name: Explicit method uses: http with: url: "{{vars.api_url}}/health" method: GET

repeat

repeatはジョブ全体を一定の間隔で繰り返します。テストを監視に変えるのはこの指定です。

プロパティ型必須説明
countInteger必須実行回数。上限はPROBE_MAX_REPEAT_COUNT(既定10000)
intervalDuration任意実行間隔
asyncBoolean任意繰り返しを並行実行する
jobs: - name: Poll until ready repeat: count: 10 interval: 5s steps: - name: Check uses: http with: url: "{{vars.api_url}}/status" method: GET test: res.code == 200

各回のステップは、同じ回の前のステップが公開した出力を読みます。asyncで複数の回が同時に動く場合も同じです。後続のジョブは、それぞれの出力について、最後にそれを公開した回の値を読みます。そのため、最後の回が飛ばしたステップの出力は、その前の回の値になります。

ステップ

ステップは1回のアクション呼び出しと、その周辺の指定から成ります。実行するかを決める条件、成功したかを決めるテスト、後続のステップに残す出力です。

ステップのプロパティ

ステップの定義では以下のプロパティを指定します。

プロパティ型必須説明
usesString必須実行するアクション。http、shellなどの組み込みアクションか、外部アクション
nameString任意ステップ名
idString任意このステップのoutputsの名前空間になる識別子
withObject任意アクション引数
testExpression任意アサーション。偽ならステップは失敗します
echoString任意レポートに出力する文字列
varsObject任意ステップ内だけの変数
outputsObject任意後続のステップやジョブへ渡す値
skipifExpression任意真ならステップをスキップ
waitDuration任意実行前の待機時間
timeoutDuration任意ステップのタイムアウト(既定5m)
iterationArray任意要素ごとにステップを繰り返す。値はvarsから参照します
retryObject任意失敗時のリトライ

キーはactionではなくuses、条件はifではなくskipifです。

outputs

後続のステップやジョブへ渡す値です。idを持つステップだけがoutputsを公開します。 idが無いとoutputsブロックは捨てられます。

値はテンプレートではなく式なので、波カッコは書きません。

steps: - name: Log in id: auth uses: http with: url: "{{vars.api_url}}/login" method: POST test: res.code == 200 outputs: token: res.body.access_token user_id: res.body.user.id

後続からはステップIDで名前空間を指定するか、出力名だけで参照します。

headers: Authorization: "Bearer {{outputs.auth.token}}" X-User: "{{outputs.user_id}}"

ハイフンを含むIDは式の識別子として解釈できないため、ブラケットで参照します。

echo: "{{outputs['create-user'].user_id}}"

retry

retryは、テストが通るか試行回数を使い切るまで、そのステップだけを繰り返します。

プロパティ型必須説明
max_attemptsInteger必須試行回数。1以上で、上限はPROBE_MAX_ATTEMPTS(既定10000)
intervalDuration任意試行間隔
initial_delayDuration任意最初の試行前の待機
steps: - name: Flaky endpoint uses: http with: url: "{{vars.api_url}}/slow" method: GET test: res.code == 200 retry: max_attempts: 3 interval: 2s

iteration

要素ごとにステップを繰り返します。各要素のキーはvarsから参照できます。

steps: - name: Check {{vars.path}} uses: http iteration: - path: /health - path: /metrics - path: /version with: url: "{{vars.api_url}}{{vars.path}}" method: GET test: res.code == 200

式のコンテキスト

ステップの式から見えるのは次の名前だけです。

名前型説明
varsObjectワークフローの変数にステップのvarsをマージしたもの
resObjectアクションのレスポンス
reqObject送信したリクエスト
rtObjectレスポンスタイム。rt.duration(文字列)とrt.sec(秒、浮動小数点数)
statusIntegerアクションの終了ステータス。成功は0
outputsObject先行ステップが公開した値
repeat_indexIntegerジョブ繰り返し時の現在のインデックス

このコンテキストにenv、jobs、stepsはありません。

httpのres

resの内容はアクションごとに異なります。httpでは以下が入ります。

フィールド型説明
res.codeIntegerステータスコード(例: 200)
res.statusStringステータス行(例: "200 OK")
res.headersObjectレスポンスヘッダー。キーはContent-Typeのような正規形
res.bodyAnyレスポンスボディ。JSONならオブジェクトや配列に解析され、それ以外は文字列
res.rawbodyString解析前のボディ。JSONとして解析したときに入ります
test: | res.code == 200 && res.headers["Content-Type"] contains "application/json" && res.body.status == "ok" && rt.sec < 1

他のアクションのresはアクションリファレンスを参照してください。

データ型

ワークフローファイルの値のうち、独自の書き方を持つものが2つあります。時間の長さと、コンテキストを参照する式やテンプレートです。

Duration

Goのduration文字列か、秒数の数値で指定します。

timeout: "30s" timeout: "5m" interval: 10 # 10 秒

式とテンプレート

テンプレート式は文字列の中に書き、評価結果で置き換わります。

url: "{{vars.api_url}}/users/{{outputs.auth.user_id}}"

ブール式は波カッコなしでそのまま書きます。

test: res.code == 200 && rt.sec < 2 skipif: vars.environment == "local"

outputsの値も式なので、波カッコは書きません。

評価できないテンプレートはエラーになり、エラーの文面が値に入ることはありません。定義されていない名前は nil として読まれエラーになりませんが、nil のフィールドを読むことや、構文として解釈できない式はエラーです。

テンプレートの場所起きること
ステップのwith、vars、nameステップは種類templateで失敗し、アクションは実行されません。エラーにはwith.headers.authorizationのように値の場所が示されます
ワークフローのvars最初のジョブの前に終了ステータス2でワークフローが止まります
ジョブのnameジョブが失敗し、終了ステータスは2です
ステップのecho本文の代わりにエラーを表示し、ステップの結果は変わりません
# 先行するステップが outputs.login を出力していなければ、ステップは失敗する headers: authorization: "Bearer {{outputs.login.token}}" # 代わりの値を使う headers: authorization: "Bearer {{outputs.login?.token ?? 'none'}}"

式の中で使える関数は組み込み関数を参照してください。

バリデーション規則

  • ワークフローにはnameが必要で、jobsは空でないリストである必要があります
  • 各ジョブにはnameと1つ以上のステップが必要です
  • 各ステップにはusesが必要です
  • needsは存在するジョブIDを指し、依存関係は循環していない必要があります
  • repeat.countは0以上、retry.max_attemptsは1以上である必要があります
  • ステップにidが無いとoutputsは公開されません

probe checkは、受け付けないキー、解析できない式、公開される前に読む出力とあわせて、これらをワークフローを実行せずに報告します。CLIリファレンスを参照してください。

ファイルのマージ

複数のファイルをカンマ区切りで渡すと順に連結されます。複数回定義されたトップレベルのキーは、最後のファイルの値になります。

probe base.yml,production.yml

マージの規則はファイルマージを参照してください。

関連項目

更新日時