{"meta":{"title":"ワークフロー内とアクション内で式を評価する","intro":"GitHub Actions 内の式についての情報を見つけます。","product":"GitHub Actions","breadcrumbs":[{"href":"/ja/actions","title":"GitHub Actions"},{"href":"/ja/actions/reference","title":"リファレンス"},{"href":"/ja/actions/reference/workflows-and-actions","title":"ワークフローとアクション"},{"href":"/ja/actions/reference/workflows-and-actions/expressions","title":"式"}],"documentType":"article"},"body":"# ワークフロー内とアクション内で式を評価する\n\nGitHub Actions 内の式についての情報を見つけます。\n\n## リテラル\n\n式の一部として`boolean`、`null`、`number`、または `string` データ型を使用できます。\n\n| データ型      | \\[リテラル値] |\n| --------- | -------- |\n| `boolean` |          |\n\n```\n          `true` または `false` |\n```\n\n\\| `null`    | `null` |\n\\| `number`  | JSONでサポートされている任意の数値書式。 |\n\\| `string`  |\n`${` と `}` 内に文字列を囲む必要はありません。 ただし、そうする場合は、文字列の周りに単一引用符 (`'`) を使用する必要があります。 リテラル単一引用符を使用するには、追加の単一引用符 (`''`) を使用してリテラルの単一引用符をエスケープします。 二重引用符 (`\"`) で囲むとエラーがスローされます。 |\n\n条件の中で、偽の値 (`false`、`0`、`-0`、`\"\"`、`''`、`null`) が `false` に強制的に適用され、真の値 (`true`、および偽ではない他の値) が `true` に強制的に適用されることに注意してください。\n\n### リテラルの例\n\n```yaml\nenv:\n  myNull: ${{ null }}\n  myBoolean: ${{ false }}\n  myIntegerNumber: ${{ 711 }}\n  myFloatNumber: ${{ -9.2 }}\n  myHexNumber: ${{ 0xff }}\n  myExponentialNumber: ${{ -2.99e-2 }}\n  myString: Mona the Octocat\n  myStringInBraces: ${{ 'It''s open source!' }}\n```\n\n## オペレーター\n\n| 演算子               | 説明         |\n| ----------------- | ---------- |\n| `( )`             | 論理的なグループ化  |\n| `[ ]`             | インデックス     |\n| `.`               | プロパティの参照解除 |\n| `!`               | Not        |\n| `<`               | より小さい      |\n| `<=`              | 以下         |\n| `>`               | より大きい      |\n| `>=`              | 以上         |\n| `==`              | 等しい        |\n| `!=`              | 等しくない      |\n| `&&`              | And        |\n| <code>\\|\\|</code> | または        |\n\n> \\[!NOTE]\n>\n> * GitHub は、文字列を比較する際に大文字と小文字を区別しません。\n> *\n\n```\n          `steps.<step_id>.outputs.<output_name>` は文字列として評価されます。 ある式を、文字列型として扱うのではなく式として評価するためには、特定の構文を使って GitHub に指示する必要があります。 詳細については、「[AUTOTITLE](/actions/learn-github-actions/contexts#steps-context)」を参照してください。\n```\n\n> * 数値比較を行おうとする場合は、`fromJSON()` 関数を使用して文字列を数値に変換することができます。\n>   `fromJSON()` 関数の詳細については、「[fromJSON](#fromjson)」を参照してください。\n\nGitHub は、等価性を緩やかに比較します。\n\n* 型が一致しない場合、GitHub は型を強制的に数値とします。 GitHub は、以下の変換方法で、データ型を数字にキャストします。\n\n  | タイプ     | 結果  |\n  | ------- | --- |\n  | \\[Null] | `0` |\n  | ブール値    |     |\n\n  ```\n          `true` は `1` を返します <br /> \n          `false` は `0` を返します |\n  ```\n\n  \\| String  | 正規の JSON 数値形式から解析されます。それ以外の場合は `NaN` です。 <br /> 注: 空の文字列は `0` を返します。 |\n  \\| Array   | `NaN` |\n  \\| Object  | `NaN` |\n* `NaN` が、いずれかの関係比較演算子 (`>`、`<`、`>=`、`<=`) のオペランドの 1 つである場合、結果は常に `false` になります。 詳細については、[NaN Mozilla ドキュメント](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NaN)を参照してください。\n* GitHub は、文字列を比較する際に大文字と小文字を区別しません。\n* オブジェクトおよび配列は、同じインスタンスの場合にのみ等しいとみなされます。\n\n## Functions\n\nGitHub は、式で使用できる組み込み関数のセットを提供します。 一部の関数は、比較を行なうために、値を文字列型にキャストします。 GitHub は、以下の変換方法で、データ型を文字列にキャストします。\n\n| タイプ     | 結果   |\n| ------- | ---- |\n| \\[Null] | `''` |\n| ブール値    |      |\n\n```\n          `'true'` または `'false'` |\n```\n\n\\| 番号  | 10進数、大きい場合は指数 |\n\\| Array   | 配列は文字列型に変換されません |\n\\| Object  | オブジェクトは文字列型に変換されません |\n\n### contains\n\n`contains( search, item )`\n\n```\n          `true` に `search` が含まれている場合に `item` を返します。 \n          `search` が配列の場合、`true` が配列内の要素であれば、この関数は `item` を返します。 \n          `search` が文字列の場合、`true` が `item` の部分文字列であれば、この関数は `search` を返します。 この関数は大文字と小文字を区別しません。 値を文字列にキャストします。\n```\n\n#### 文字列の使用例\n\n```\n          `contains('Hello world', 'llo')` は `true` を返します。\n```\n\n#### オブジェクト フィルターの使用例\n\n```\n          イベントに関連する issue に \"bug\" というラベルがある場合、`contains(github.event.issue.labels.*.name, 'bug')` は `true` を返します。\n```\n\n詳細については、「[オブジェクト フィルター](#object-filters)」を参照してください。\n\n#### 文字列の配列に一致する例\n\n```\n          `github.event_name == \"push\" || github.event_name == \"pull_request\"` と書く代わりに、`contains()` と `fromJSON()` を使って、文字列の配列に `item` が含まれるかどうかをチェックできます。\n```\n\nたとえば、`contains(fromJSON('[\"push\", \"pull_request\"]'), github.event_name)` が \"push\" または \"pull\\_request\"、`true` は `github.event_name` を返します。\n\n### startsWith\n\n`startsWith( searchString, searchValue )`\n\n```\n          `true` が `searchString` で始まる場合は、`searchValue` を返します。 この関数は大文字と小文字を区別しません。 値を文字列にキャストします。\n```\n\n####\n\n```\n          `startsWith` の例\n\n          `startsWith('Hello world', 'He')` は `true` を返します。\n```\n\n### endsWith\n\n`endsWith( searchString, searchValue )`\n\n```\n          `true` が `searchString` で終わる場合は、`searchValue` を返します。 この関数は大文字と小文字を区別しません。 値を文字列にキャストします。\n```\n\n####\n\n```\n          `endsWith` の例\n\n          `endsWith('Hello world', 'ld')` は `true` を返します。\n```\n\n### format\n\n`format( string, replaceValue0, replaceValue1, ..., replaceValueN)`\n\n```\n          `string` 内の値を `replaceValueN` 変数に置き換えます。 \n          `string` 内の変数は、`{N}` 構文 (`N` は整数) を使用して指定されます。 少なくとも 1 つの `replaceValue` と `string` を指定する必要があります。 使用できる変数 (`replaceValueN`) の最大数はありません。 中括弧はダブルブレースでエスケープします。\n```\n\n####\n\n```\n          `format` の例\n```\n\n```javascript\nformat('Hello {0} {1} {2}', 'Mona', 'the', 'Octocat')\n```\n\n'Hello Mona the Octocat' を返します。\n\n#### 括弧をエスケープするサンプル\n\n```javascript\nformat('{{Hello {0} {1} {2}!}}', 'Mona', 'the', 'Octocat')\n```\n\n'{Hello Mona the Octocat!}' を返します。\n\n### 参加\n\n`join( array, optionalSeparator )`\n\n```\n          `array` の値には、配列または文字列を指定できます。 \n          `array` のすべての値が文字列に連結されます。 \n          `optionalSeparator` を指定した場合は、連結された値の間に挿入されます。 それ以外の場合は、既定の区切り記号の `,` が使用されます。 値を文字列にキャストします。\n```\n\n####\n\n```\n          `join` の例\n\n          `join(github.event.issue.labels.*.name, ', ')` では、'bug, help wanted' が返される場合があります\n```\n\n### toJSON\n\n`toJSON(value)`\n\n```\n          `value` を、書式を整えた JSON 表現で返します。 この関数を使って、コンテキスト内で提供された情報のデバッグができます。\n```\n\n####\n\n```\n          `toJSON` の例\n\n          `toJSON(job)` では、`{ \"status\": \"success\" }` が返される場合があります\n```\n\n### fromJSON\n\n`fromJSON(value)`\n\n```\n          `value` に対する JSON オブジェクト、あるいは JSON データ型を返します。 この関数を使用すると、JSON オブジェクトを渡して評価された式として提供すること、または、文字列、ブール値、null 値、配列、オブジェクトなど、JSON または JavaScript で表すことができる任意のデータ型を変換することができます。\n```\n\n#### JSONオブジェクトを返す例\n\nこのワークフローは JSON マトリックスを 1 つのジョブに設定し、それを出力と `fromJSON` を使って次のジョブに渡します。\n\n```yaml copy\nname: build\non: push\njobs:\n  job1:\n    runs-on: ubuntu-latest\n    outputs:\n      matrix: ${{ steps.set-matrix.outputs.matrix }}\n    steps:\n      - id: set-matrix\n        run: echo \"matrix={\\\"include\\\":[{\\\"project\\\":\\\"foo\\\",\\\"config\\\":\\\"Debug\\\"},{\\\"project\\\":\\\"bar\\\",\\\"config\\\":\\\"Release\\\"}]}\" >> $GITHUB_OUTPUT\n  job2:\n    needs: job1\n    runs-on: ubuntu-latest\n    strategy:\n      matrix: ${{ fromJSON(needs.job1.outputs.matrix) }}\n    steps:\n      - run: echo \"Matrix - Project ${{ matrix.project }}, Config ${{ matrix.config }}\"\n```\n\n#### JSONデータ型を返す例\n\nこのワークフローでは `fromJSON` を使い、環境変数を文字列からブール値もしくは整数に変換します。\n\n```yaml copy\nname: print\non: push\nenv:\n  continue: true\n  time: 3\njobs:\n  job1:\n    runs-on: ubuntu-latest\n    steps:\n      - continue-on-error: ${{ fromJSON(env.continue) }}\n        timeout-minutes: ${{ fromJSON(env.time) }}\n        run: echo ...\n```\n\nワークフローは、`fromJSON()` 関数を使用して環境変数 `continue` を文字列からブール値に変換し、エラーのまま続行する (continue-on-error) かどうかを判断することができます。 同様に、これは `time` 環境変数を文字列から整数型に変換し、ジョブのタイムアウトを分単位で設定します。\n\n### hashFiles\n\n`hashFiles(path)`\n\n```\n          `path` パターンに一致するファイル群から単一のハッシュを返します。 1 つの `path` パターンまたは複数の `path` のパターンをコンマで区切って指定できます。 \n          `path` は `GITHUB_WORKSPACE` ディレクトリに対する相対値であり、`GITHUB_WORKSPACE` 内のファイルのみを含めることができます。 この関数はマッチしたそれぞれのファイルに対するSHA-256ハッシュを計算し、それらのハッシュを使ってファイルの集合に対する最終的なSHA-256ハッシュを計算します。 \n          `path` パターンがどのファイルとも一致しない場合、空の文字列が返されます。 SHA-256 の詳細については、「[SHA-2](https://en.wikipedia.org/wiki/SHA-2)」を参照してください。\n```\n\nパターンマッチング文字を使ってファイル名をマッチさせることができます。\n`hashFiles` に対応するパターン マッチングは glob パターン マッチングに従っており、Windows では大文字と小文字を区別しません。 サポートされているパターン マッチング文字の詳細については、[](https://www.npmjs.com/package/@actions/glob#patterns) ドキュメントの「`@actions/glob`」セクションを参照してください。\n\n#### 単一のパターンを使用する例\n\nリポジトリ内の任意の `package-lock.json` ファイルと一致します。\n\n`hashFiles('**/package-lock.json')`\n\nルート レベルで `.js` ディレクトリ内にあるすべての `src` ファイルと比較しますが、`src` のサブディレクトリを無視します。\n\n`hashFiles('/src/*.js')`\n\nルート レベルで `.rb` ディレクトリ内にあるすべての `lib` ファイルと比較し、`lib` のサブディレクトリも比較に含めます。\n\n`hashFiles('/lib/**/*.rb')`\n\n#### 複数のパターンを使用する例\n\nリポジトリ内の任意の `package-lock.json` および `Gemfile.lock` ファイルのハッシュを作成します。\n\n`hashFiles('**/package-lock.json', '**/Gemfile.lock')`\n\nルート レベルで `.rb` ディレクトリ内にあるすべての `lib` ファイルのハッシュを作成します。このとき、`lib` のサブディレクトリを含めますが、`.rb` サブディレクトリ内の `foo` ファイルは除外します。\n\n`hashFiles('/lib/**/*.rb', '!/lib/foo/*.rb')`\n\n### ケース\n\n`case( pred1, val1, pred2, val2, ..., default )`\n\n述語を順番に評価し、 `true`に評価される最初の述語に対応する値を返します。 一致する述語がない場合は、最後の引数が既定値として返されます。\n\n#### 単一の述語を使用した例\n\n```yaml\nenv:\n  MY_ENV_VAR: ${{ case(github.ref == 'refs/heads/main', 'production', 'development') }}\n```\n\nref が`MY_ENV_VAR`されたときに`production`を`refs/heads/main`に設定し、それ以外の場合は`development`に設定します。\n\n#### 複数の述語を使用する例\n\n```yaml\nenv:\n  MY_ENV_VAR: |-\n    ${{ case(\n      github.ref == 'refs/heads/main', 'production',\n      github.ref == 'refs/heads/staging', 'staging',\n      startsWith(github.ref, 'refs/heads/feature/'), 'development',\n      'unknown'\n    ) }}\n```\n\nブランチに基づいて`MY_ENV_VAR`を設定します。`production`の`main`、`staging`の`staging`、`development`で始まるブランチの`feature/`、または他のすべてのブランチの`unknown`。\n\n## ステータスチェック関数\n\n```\n          `if` 条件では、次の状態チェック関数を式として使用できます。 これらの関数のいずれかを含めない限り、既定の `success()` の状態チェックが適用されます。 \n          `if` 条件の詳細については、「[AUTOTITLE](/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idif)」と「[AUTOTITLE](/actions/creating-actions/metadata-syntax-for-github-actions#runsstepsif)」を参照してください。\n\n          `if` の条件外の場合は、`job.status` を使用してジョブの状態にアクセスできます。 詳しくは、「[AUTOTITLE](/actions/reference/contexts-reference#job-context)」をご覧ください。\n```\n\n### 成功\n\nこれまでの手順がすべて成功した場合は `true` を返します。\n\n####\n\n```\n          `success` の例\n```\n\n```yaml\nsteps:\n  ...\n  - name: The job has succeeded\n    if: ${{ success() }}\n```\n\n### 常時\n\nステップが常に実行され、キャンセルされた場合でも `true` を返します。\n`always` 式は、ジョブが取り消された場合でも実行することが想定されるタスクでまたはステップ レベルで使うのが最適です。 たとえば、`always` を使用すると、ジョブがキャンセルされた場合でもログを送信できます。\n\n> \\[!WARNING]\n> ソースの取得など、重大なエラーが発生する可能性があるタスクには `always` を使用しないでください。そうしないと、タイムアウトになるまでワークフローがハングする可能性があります。成功または失敗に関係なくジョブまたはステップを実行する場合は、推奨される代替手段 `if: ${{ !cancelled() }}` を使用してください。\n\n####\n\n```\n          `always` の例\n```\n\n```yaml\nif: ${{ always() }}\n```\n\n### 取り消し済み\n\nワークフローがキャンセルされた場合に `true` を返します。\n\n####\n\n```\n          `cancelled` の例\n```\n\n```yaml\nif: ${{ cancelled() }}\n```\n\n### 失敗\n\nジョブの前のステップが失敗した場合に `true` を返します。 依存ジョブのチェーンがある場合、親要素ジョブが失敗した場合に `failure()` は `true` を返します。\n\n####\n\n```\n          `failure` の例\n```\n\n```yaml\nsteps:\n  ...\n  - name: The job has failed\n    if: ${{ failure() }}\n```\n\n#### 条件付きのエラー\n\nエラー後に実行するステップの追加条件を含めることができますが、状態チェック関数を含まない `failure()` 条件に自動的に適用される既定の `success()` の状態チェックをオーバーライドするには、引き続き `if` を含める必要があります。\n\n##### 条件を含む `failure` の例\n\n```yaml\nsteps:\n  ...\n  - name: Failing step\n    id: demo\n    run: exit 1\n  - name: The demo step has failed\n    if: ${{ failure() && steps.demo.conclusion == 'failure' }}\n```\n\n## オブジェクトフィルタ\n\n```\n          `*` 構文を使用して、フィルターを適用し、コレクション内の一致する項目を選択できます。\n```\n\nたとえば、`fruits` というオブジェクトの配列を考えます。\n\n```json\n[\n  { \"name\": \"apple\", \"quantity\": 1 },\n  { \"name\": \"orange\", \"quantity\": 2 },\n  { \"name\": \"pear\", \"quantity\": 1 }\n]\n```\n\nフィルター `fruits.*.name` は配列 `[ \"apple\", \"orange\", \"pear\" ]` を返します。\n\nオブジェクトで `*` 構文を使用することもできます。 たとえば、`vegetables` という名前のオブジェクトがあるとします。\n\n```json\n\n{\n  \"scallions\":\n  {\n    \"colors\": [\"green\", \"white\", \"red\"],\n    \"ediblePortions\": [\"roots\", \"stalks\"],\n  },\n  \"beets\":\n  {\n    \"colors\": [\"purple\", \"red\", \"gold\", \"white\", \"pink\"],\n    \"ediblePortions\": [\"roots\", \"stems\", \"leaves\"],\n  },\n  \"artichokes\":\n  {\n    \"colors\": [\"green\", \"purple\", \"red\", \"black\"],\n    \"ediblePortions\": [\"hearts\", \"stems\", \"leaves\"],\n  },\n}\n```\n\nフィルター `vegetables.*.ediblePortions` の評価結果は次のとおりです。\n\n```json\n\n[\n  [\"roots\", \"stalks\"],\n  [\"hearts\", \"stems\", \"leaves\"],\n  [\"roots\", \"stems\", \"leaves\"],\n]\n```\n\nオブジェクトは順序を保持しないため、出力の順序を保証することはできません。"}