変更要約: GH-200 第1章を新規作成(トリガーとイベント=push/pull_request/schedule/workflow_dispatch/repository_dispatch/workflow_call・inputs/secrets、ワークフロー構造=jobs/steps/needs/if・env/$GITHUB_ENV・サービスコンテナ・strategy.matrix・コンテキスト/${{ }}式・YAMLアンカー、実行管理=アーティファクト/$GITHUB_OUTPUT/キャッシュ/$GITHUB_STEP_SUMMARY/バッジ/環境保護/retention REST API)
1.2ワークフロー構造、マトリックス、コンテキストと式
ジョブとステップ、ジョブ間の依存(needs)と条件分岐(if)、ランナーの選択、ワークフローコマンドと環境変数、サービスコンテナ、strategy/matrix によるジョブの並列展開(include/exclude・fail-fast・max-parallel)、YAML のアンカー/エイリアス、そして github/env/matrix/needs などのコンテキストと ${{ }} 式の評価を理解します。
ワークフローは 1 つ以上の ジョブ(jobs) からなり、各ジョブは ステップ(steps) の列です。ジョブは runs-on で実行する ランナー(GitHub ホスト型の ubuntu-latest 等、または self-hosted)を選び、既定では互いに並列に実行されます。ステップは上から順に実行され、run: でシェルコマンドを、uses: でアクションを呼びます。重要なのは、各ジョブは独立した仮想環境(クリーンな状態)で動く ことです——だからこそジョブ間でデータを渡すには明示的な仕組み(アーティファクトや outputs、第3節)が要ります。
1.2.1依存(needs)と条件分岐(if)
ジョブを順番に流したい場合は needs を使い、「ジョブ B は A の完了後に実行」と依存を宣言します(複数依存も可)。needs は 逐次化(直列化) と、後段ジョブが前段の outputs を参照する経路の両方を担います。実行可否は if 式で制御し、たとえば「main ブランチのときだけデプロイ」「前段が失敗しても必ず実行(if: always())」「失敗時のみ通知(if: failure())」などを表現します。success()・failure()・cancelled()・always() といった ステータス関数 を覚えておくと、堅牢なパイプラインを組めます。
1.2.2環境変数とワークフローコマンド
環境変数は env: でワークフロー・ジョブ・ステップの各レベルに定義でき、狭いスコープが優先されます。実行時に値を生成して後続ステップへ渡すには、特殊ファイル $GITHUB_ENV に echo "KEY=value" >> "$GITHUB_ENV" のように書き込みます(次のステップ以降で環境変数として使える)。同様に ワークフローコマンド(echo "::notice::..." など)でログにアノテーションを出したり、出力やマスクを制御できます。組織/リポジトリ/環境レベルの 変数(vars) は vars コンテキストで参照し、機密でない設定値の共有に使います。
1.2.3サービスコンテナ
テストがデータベースやキューなどの依存サービスを必要とする場合、services: を使ってジョブの実行中だけ補助コンテナ(PostgreSQL・Redis 等)を立ち上げます。ポートのマッピング・ヘルスチェック(health checks)・コンテナオプションを指定でき、ジョブ内のステップから localhost:<port> で接続できます。これにより、外部のテスト用 DB を用意せずに統合テストを再現性高く回せます。サービスはジョブ終了時に破棄されるため、ジョブごとにクリーンな状態が保てます。
1.2.4strategy と matrix によるジョブの展開
strategy.matrix は、1 つのジョブ定義を 複数のバリエーション に自動展開します。たとえば OS(ubuntu-latest/windows-latest/macos-latest)× 言語バージョン(Node 18/20/22)を掛け合わせ、組み合わせごとに並列ジョブを生成します。include で特定の組み合わせを追加(または既存に値を付与)し、exclude で不要な組み合わせを除外します。既定では 1 つでも失敗すると残りを打ち切る fail-fast: true が働きますが、false にすると全組み合わせを最後まで走らせて結果を比較できます。max-parallel で同時実行数を抑え、コストとランナー枠を調整します。なお windows-latest の Windows Server 2025 移行や ubuntu-20.04 の廃止など、ランナーイメージの更新にも注意します。
| 設定 | 意味 | 使いどころ |
|---|---|---|
| include | 組み合わせの追加/値の付与 | 特殊ケースだけ追加 |
| exclude | 不要な組み合わせを除外 | 非対応の OS×版を外す |
| fail-fast | true=即打ち切り / false=全実行 | 原因切り分けは false |
| max-parallel | 同時実行数の上限 | コスト/枠の調整 |
1.2.5コンテキストと ${{ }} 式、YAML アンカー
ワークフローはランタイムのメタデータに コンテキスト からアクセスします——イベント情報の github(github.ref・github.event 等)、env・vars・secrets・inputs、行列値の matrix、依存ジョブの結果 needs、runner・job・steps など。式は ${{ }} の中で評価し、if: や値の埋め込みに使います。式がワークフロー解析時(静的)に評価されるものと実行時(動的)に評価されるものの違い、そして シークレットをログや式に漏らさない ことが重要です。繰り返す YAML 断片は アンカー(&)とエイリアス(*)、マージキー(<<)で 1 ファイル内で再利用できます(複数ファイル間の共有ではない点に注意)。
頻出:
①ジョブは既定で並列、順序づけは needs(前段 outputs の参照経路でもある)。
②条件は if +ステータス関数 success()/failure()/cancelled()/always()。
③実行時に値を後続へ渡す=$GITHUB_ENV に追記。
④DB 等の依存サービス=services(サービスコンテナ)+ヘルスチェック。
⑤matrix は include/exclude・fail-fast(false で全実行)・max-parallel。
⑥${{ }} で式評価、コンテキスト github/env/matrix/needs、YAML アンカー/エイリアスは単一ファイル内の再利用。
混同・注意:
①ジョブ間はクリーンな別環境——変数やファイルは自動共有されない(outputs/アーティファクトで明示的に渡す)。
②env: は環境変数、with: はアクション/再利用WFへの入力——別物。
③fail-fast: true(既定)は失敗で残りを打ち切る——全結果が欲しいなら false。
④YAML アンカー/エイリアスは 同一ファイル内のみ——複数ワークフロー共有は reusable workflow を使う。
⑤シークレットを echo や式に入れない(マスクされても漏れる経路に注意)。
1.2.6この節のまとめ
- jobs は runs-on でランナー選択・既定で並列、steps は run:/uses: を順次実行。ジョブは独立環境
- 順序=needs(+前段 outputs の参照)、条件=if+success()/failure()/cancelled()/always()
- env: で環境変数、$GITHUB_ENV で実行時値を後続へ、services でDB等の依存サービス(ヘルスチェック)
- matrix で OS×版を展開(include/exclude・fail-fast・max-parallel)、${{ }} 式とコンテキスト、YAML アンカーは単一ファイル内
進捗の記録にはログインが必要です。
理解度チェック
(軽い確認用)Q1. ジョブ deploy をジョブ build と test の両方が成功した後にだけ実行したいです。どう書きますか?
Q2. あるステップで生成した値(バージョン番号など)を、同じジョブの後続ステップで環境変数として使いたいです。正しい方法はどれですか?
Q3. 統合テストで PostgreSQL が必要です。外部 DB を用意せず、ジョブの実行中だけ DB を起動する GitHub Actions の機能はどれですか?
Q4. OS×Node バージョンの全組み合わせをテストしていますが、1 つ失敗すると残りが打ち切られて原因を切り分けにくいです。全組み合わせを最後まで実行するにはどうしますか?
Q5. 繰り返し現れる同一のステップ群を 1 つのワークフローファイル内で再利用したいです。最も適した YAML の機能はどれですか?
Q6. 前段のジョブが失敗しても、必ず実行して失敗を通知するクリーンアップ/通知ジョブを作りたいです。if 式に使う関数はどれが適切ですか?

