GitHub Actions マトリックスビルド

GitBeginner
オンラインで実践に進む

はじめに

ソフトウェアを開発する際、コードが異なる環境で正しく動作することを保証することが極めて重要です。例えば、Node.js ライブラリは、複数の Node.js バージョン(例:v18、v20、v22)でテストされる必要があります。

バージョンごとに個別のジョブを作成する代わりに、GitHub Actions はマトリックス戦略 (Matrix Strategy) を提供します。これにより、変数のセットを定義でき、GitHub Actions がこれらの変数のすべての組み合わせに対して自動的にジョブを作成します。

この実験(Lab)では、ワークフローを更新し、3 つの異なるバージョンの Node.js でテストを並行して実行するようにします。

この実験(Lab)は、以前の実験(Lab)で作成したリポジトリを基盤としています。github-actions-demo リポジトリを使用します。

戦略マトリックスを含むようにワークフローを変更する

strategy キーワードは、ビルドマトリックスを設定するために使用されます。ここでは、単一のキー node-version を持つマトリックスを定義します。

  1. github-actions-demo の GitHub リポジトリページで、緑色の Code ボタンをクリックします。
  2. HTTPS タブが選択されていることを確認し、URL をコピーします。URL は https://github.com/your-username/github-actions-demo.git のような形式になります。
  3. LabEx 環境でターミナルを開きます。デフォルトのパスは ~/project です。
  4. git clone コマンドを使用してリポジトリをダウンロードします。your-username は実際の GitHub ユーザー名に置き換えてください。
cd ~/project
git clone https://github.com/your-username/github-actions-demo.git

出力例:

Cloning into 'github-actions-demo'...
remote: Enumerating objects: X, done.
remote: Counting objects: 100% (X/X), done.
remote: Total X (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (X/X), done.
  1. クローンしたリポジトリに移動します。
cd ~/project/github-actions-demo
  1. WebIDE エディタを使用して、新しいワークフローファイル .github/workflows/matrix-build.yml を作成します。ファイルエクスプローラーの左側にある project/github-actions-demo/.github/workflows/ の下にファイルを見つけることができます。

  2. 基本的なワークフロー構造の作成から始めます。ワークフロー名とトリガーを追加します。

name: Matrix Build

on: [push]
  1. 次に、基本的なビルドジョブ構造を持つ jobs セクションを追加します。
jobs:
  build:
    runs-on: ubuntu-latest
  1. マトリックス戦略を追加します。これは、複数の Node.js バージョンでジョブを実行可能にするための重要な部分です。
strategy:
  matrix:
    node-version: [18, 20, 22]

これにより、node-version というマトリックス変数が定義され、3 つの値が割り当てられます。GitHub Actions は、各値に対して個別のジョブを作成します。

  1. steps セクションを追加します。まず、チェックアウトステップを追加します。
steps:
  - uses: actions/checkout@v4
  1. Node.js セットアップステップを追加します。${{ matrix.node-version }} を使用して現在のマトリックス値を参照していることに注意してください。
- name: Use Node.js
  uses: actions/setup-node@v4
  with:
    node-version: ${{ matrix.node-version }}
  1. 依存関係をインストールするステップを追加します。
- name: Install dependencies
  run: npm install
  1. アーティファクトディレクトリを作成するビルドステップを追加します。
- name: Build project
  run: |
    mkdir dist
    echo "This is the build artifact" > dist/build.txt
  1. テストステップを追加します。
- name: Run tests
  run: npm test
  1. 最後に、ビルドアーティファクトをアップロードするステップを追加します。各アーティファクトを一意にするために、アーティファクト名にマトリックスバージョンが含まれていることに注意してください。
- name: Upload build artifact
  uses: actions/upload-artifact@v4
  with:
    name: build-assets-${{ matrix.node-version }}
    path: dist

完全なファイルは次のようになります。

name: Matrix Build

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest

    strategy:
      matrix:
        node-version: [18, 20, 22]

    steps:
      - uses: actions/checkout@v4
      - name: Use Node.js
        uses: actions/setup-node@v4
        with:
          node-version: ${{ matrix.node-version }}
      - name: Install dependencies
        run: npm install
      - name: Build project
        run: |
          mkdir dist
          echo "This is the build artifact" > dist/build.txt
      - name: Run tests
        run: npm test
      - name: Upload build artifact
        uses: actions/upload-artifact@v4
        with:
          name: build-assets-${{ matrix.node-version }}
          path: dist

解説

  • strategy: ビルド戦略を定義します。
  • matrix: マトリックス変数を定義します。
  • node-version: 私たちが選択した変数名です。これに値の配列 [18, 20, 22] を割り当てました。GitHub Actions は、build ジョブを各値に対して 3 回実行します。
  • ${{ matrix.node-version }}: この構文により、ステップ内で現在のマトリックス値にアクセスできます。

変更を加えたら、ファイルを保存してください (Ctrl+S または Cmd+S)。

setup-node と成果物名にマトリックスコンテキストを使用するように更新

マトリックスを定義することは戦いの半分に過ぎません。各ステップに対して、マトリックスから現在の値(current value)を「使用する」方法を指示する必要があります。これは ${{ matrix.node-version }} コンテキストを使用して行います。

また、各並列ジョブ(parallel job)によってアップロードされる成果物(artifact)が重複しないように、一意な名前を持つことを保証する必要があります。そうしないと、それらは互いに上書きされてしまいます。

  1. .github/workflows/matrix-build.yml 内で、Use Node.js ステップがマトリックス変数を使用していることを確認します。
- name: Use Node.js
  uses: actions/setup-node@v4
  with:
    node-version: ${{ matrix.node-version }}
  1. Upload build artifact ステップが成果物の名前にマトリックスのバージョンを含めていることを確認します。
- name: Upload build artifact
  uses: actions/upload-artifact@v4
  with:
    name: build-assets-${{ matrix.node-version }}
    path: dist
  1. 完全なワークフローファイルは次のようになります。
name: Matrix Build

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest

    strategy:
      matrix:
        node-version: [18, 20, 22]

    steps:
      - uses: actions/checkout@v4
      - name: Use Node.js
        uses: actions/setup-node@v4
        with:
          node-version: ${{ matrix.node-version }}
      - name: Install dependencies
        run: npm install
      - name: Build project
        run: |
          mkdir dist
          echo "This is the build artifact" > dist/build.txt
      - name: Run tests
        run: npm test
      - name: Upload build artifact
        uses: actions/upload-artifact@v4
        with:
          name: build-assets-${{ matrix.node-version }}
          path: dist

ファイルを保存します(Ctrl+S または Cmd+S)。

コミット、プッシュ、および並列ジョブの監視

GitHub に変更をコミットして、マトリックスがどのように機能するかを確認しましょう。

  1. リポジトリのディレクトリにいることを確認します。
cd ~/project/github-actions-demo
  1. 変更をステージングします。
git add .
  1. 変更をコミットします。
git commit -m "Add matrix strategy for Node.js versions"
  1. 変更を GitHub 上のリモートリポジトリにプッシュします。
git push

認証に関する注意:
git push を実行すると、WebIDE は自動的に認証を求めます。以下の詳細な手順に従ってください。

  1. "The extension 'GitHub' wants to sign in using GitHub." というメッセージが表示されたポップアップが表示されますので、Allow をクリックします。
  2. 新しい通知が表示されます。"Copy&Continue to GitHub" をクリックし、次のプロンプトで "Open" をクリックします。
  3. 開いたブラウザウィンドウで GitHub アカウントにログインし、コピーされた認証コードを入力します。認証を確認すると、ページは自動的に閉じます。
  4. 数秒待つと、ターミナルでプッシュ操作が正常に完了したことが確認できます。

プライバシーに関する注意:
WebIDE は認証のために GitHub アカウントへのフルアクセスを要求します。プライバシーの懸念についてはご心配いただく必要はありません。現在の実験(Lab)が完了すると、LabEx VM は直ちに破棄され、資格情報や認証情報は保持されません。

この認証プロセスでは、ユーザー名や Personal Access Token の手動設定は必要ありません。

GitHub での確認

  1. Web ブラウザでリポジトリを GitHub 上で開きます。
  2. Actions タブをクリックします。
  3. 最新のワークフロー実行をクリックします。
  4. 左側のサイドバー(またはメインのグラフビュー)で、build グループの下に 3 つの個別のジョブがリストされているのが確認できます。
    • build (18)
    • build (20)
    • build (22)
  5. これらは並列(またはほぼ並列)で実行されます。それぞれをクリックすると、Use Node.js が要求された特定のバージョンを設定していることが確認できます。
GitHub Actions matrix builds

まとめ

この実験では、GitHub Actions におけるマトリックス戦略 (Matrix Strategy) の使用方法を学びました。以下のことを行いました。

  1. strategy: matrix を使用して、複数の Node.js バージョンを持つマトリックスを定義しました。
  2. ワークフローのステップを更新し、マトリックスコンテキスト (${{ matrix.node-version }}) からバージョンを動的に使用するようにしました。
  3. 各マトリックスジョブに対してアーティファクト名が一意であることを確認しました。

この強力な機能により、コードの重複をほとんどなくして、幅広い構成に対してプロジェクトを検証することができます。