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: durationjobsはリストです。ジョブ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はジョブ名からジョブ定義へのマップです。ジョブは順に実行するステップをまとめ、依存先を宣言します。
ジョブのプロパティ
ジョブの定義では以下のプロパティを指定します。
| プロパティ | 型 | 必須 | 説明 |
|---|---|---|---|
name | String | 必須 | ジョブ名。テンプレート式が使えます |
id | String | 任意 | 他ジョブのneedsから参照する識別子。省略時は自動採番されます |
needs | Array | 任意 | 先に完了している必要があるジョブのID |
steps | Array | 必須 | 実行するステップ |
skipif | Expression | 任意 | 真ならジョブ全体をスキップ |
defaults | Object | 任意 | アクション名をキーとしたwithの既定値 |
repeat | Object | 任意 | ジョブを繰り返す |
ジョブに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: GETdefaults
ジョブ内の該当アクションを使うステップの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 == 200httpアクションはメソッドの指定が必須です。methodを明示するか、get / post / put / delete / patchといった省略記法を使います。省略記法の値は完全なURLか、urlからの相対パスです。
- name: Explicit method
uses: http
with:
url: "{{vars.api_url}}/health"
method: GETrepeat
repeatはジョブ全体を一定の間隔で繰り返します。テストを監視に変えるのはこの指定です。
| プロパティ | 型 | 必須 | 説明 |
|---|---|---|---|
count | Integer | 必須 | 実行回数。上限はPROBE_MAX_REPEAT_COUNT(既定10000) |
interval | Duration | 任意 | 実行間隔 |
async | Boolean | 任意 | 繰り返しを並行実行する |
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回のアクション呼び出しと、その周辺の指定から成ります。実行するかを決める条件、成功したかを決めるテスト、後続のステップに残す出力です。
ステップのプロパティ
ステップの定義では以下のプロパティを指定します。
| プロパティ | 型 | 必須 | 説明 |
|---|---|---|---|
uses | String | 必須 | 実行するアクション。http、shellなどの組み込みアクションか、外部アクション |
name | String | 任意 | ステップ名 |
id | String | 任意 | このステップのoutputsの名前空間になる識別子 |
with | Object | 任意 | アクション引数 |
test | Expression | 任意 | アサーション。偽ならステップは失敗します |
echo | String | 任意 | レポートに出力する文字列 |
vars | Object | 任意 | ステップ内だけの変数 |
outputs | Object | 任意 | 後続のステップやジョブへ渡す値 |
skipif | Expression | 任意 | 真ならステップをスキップ |
wait | Duration | 任意 | 実行前の待機時間 |
timeout | Duration | 任意 | ステップのタイムアウト(既定5m) |
iteration | Array | 任意 | 要素ごとにステップを繰り返す。値はvarsから参照します |
retry | Object | 任意 | 失敗時のリトライ |
キーは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_attempts | Integer | 必須 | 試行回数。1以上で、上限はPROBE_MAX_ATTEMPTS(既定10000) |
interval | Duration | 任意 | 試行間隔 |
initial_delay | Duration | 任意 | 最初の試行前の待機 |
steps:
- name: Flaky endpoint
uses: http
with:
url: "{{vars.api_url}}/slow"
method: GET
test: res.code == 200
retry:
max_attempts: 3
interval: 2siteration
要素ごとにステップを繰り返します。各要素のキーは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式のコンテキスト
ステップの式から見えるのは次の名前だけです。
| 名前 | 型 | 説明 |
|---|---|---|
vars | Object | ワークフローの変数にステップのvarsをマージしたもの |
res | Object | アクションのレスポンス |
req | Object | 送信したリクエスト |
rt | Object | レスポンスタイム。rt.duration(文字列)とrt.sec(秒、浮動小数点数) |
status | Integer | アクションの終了ステータス。成功は0 |
outputs | Object | 先行ステップが公開した値 |
repeat_index | Integer | ジョブ繰り返し時の現在のインデックス |
このコンテキストにenv、jobs、stepsはありません。
httpのres
resの内容はアクションごとに異なります。httpでは以下が入ります。
| フィールド | 型 | 説明 |
|---|---|---|
res.code | Integer | ステータスコード(例: 200) |
res.status | String | ステータス行(例: "200 OK") |
res.headers | Object | レスポンスヘッダー。キーはContent-Typeのような正規形 |
res.body | Any | レスポンスボディ。JSONならオブジェクトや配列に解析され、それ以外は文字列 |
res.rawbody | String | 解析前のボディ。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マージの規則はファイルマージを参照してください。