📘

GitHub ActionsでMoonを使用する際の「master」ブランチエラーの解決方法

に公開

問題の概要

GitHub ActionsでMoon(monorepoビルドシステム)を使用していて、以下のようなエラーに遭遇したことはありませんか?

Error: process::failed

× Process git failed: exit code 128

│ fatal: ambiguous argument 'master': unknown revision or path not in the
│ working tree.
│ Use '--' to separate paths from revisions, like this:
│ 'git <command> [<revision>...] -- [<file>...]'

このエラーは、リポジトリのデフォルトブランチがmainなのに、Moonが内部的にmasterブランチを参照しようとすることで発生します。

解決方法:--affectedフラグを使用する

最もシンプルな解決方法は、moon runコマンドに--affectedフラグを追加することです。

修正前

- name: Check schema
  run: |
    moon run schema-model:lint
    moon run schema-model:generate

修正後

- name: Check schema
  run: |
    moon run schema-model:lint --affected
    moon run schema-model:generate --affected

なぜ--affectedフラグで解決するのか?

1. Git操作の違い

--affectedフラグなし

  • Moonの内部処理(タスクグラフ構築、依存関係解決)で暗黙的にGit操作を実行
  • ハードコードされたmasterブランチへの参照が存在
  • 環境変数MOON_VCS_DEFAULT_BRANCHが適用されない

--affectedフラグあり

  • Moonが明示的にGit操作を制御
  • CI環境を自動検出し、適切な設定を使用
  • 環境変数を尊重し、正しいブランチ(main)を参照

2. 技術的な詳細

--affectedフラグを使用すると、Moonは以下のように動作します:

ローカル環境

git status --porcelain --untracked-files

CI環境(GitHub Actionsなど)

git diff --name-only [BASE_REV]...[HEAD_REV]

この明示的なGit操作により、Moonは環境変数や設定ファイルの値を正しく適用できます。

3. PR環境での動作

GitHub ActionsのPull Request環境では:

  • デフォルトのactions/checkout@v4はマージコミットを作成
  • --affectedなしでは、Moonが適切なベースブランチを推測できない
  • --affectedありでは、CI環境を検出して正しいブランチ比較を実行

完全な設定例

以下は、GitHub ActionsでMoonを使用する際の推奨設定です:

name: Moon CI

on:
  pull_request:
  push:
    branches: [main]

env:
  TZ: Asia/Tokyo
  MOON_VCS_DEFAULT_BRANCH: main  # デフォルトブランチを明示的に指定

jobs:
  ci:
    name: Moon CI
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0  # 全履歴を取得(重要)

      - name: Setup toolchain
        uses: moonrepo/setup-toolchain@v0
        with:
          auto-install: true

      # --affectedフラグを使用して影響を受けるプロジェクトのみ実行
      - name: Run affected projects
        run: |
          moon run :lint :test --affected

      - name: Build affected projects
        run: |
          moon run :build --affected

その他の解決方法

1. moon.ymlでデフォルトブランチを設定

# moon.yml
vcs:
  manager: "git"
  defaultBranch: "main"

2. Gitのグローバル設定を変更

steps:
  - name: Configure git
    run: |
      git config --global init.defaultBranch main
  
  - uses: actions/checkout@v4

ただし、これらの方法よりも--affectedフラグの使用が最も確実です。

まとめ

  • GitHub ActionsでMoonを使用する際は、--affectedフラグを追加する
  • これにより、Moonが適切にGit操作を管理し、正しいブランチを参照する
  • CI環境では常に--affectedフラグの使用を推奨

参考資料

Discussion