🐺

github submodule という選択

2024/10/11に公開

はじめに

共通化させたe2eの運用で
e2eの対象となるベースリポジトリをsubmoduleとして追加した話

Git submodule

一般的な使い所としては

  • 大規模なリポジトリを分割したい
  • 複数のリポジトリでモジュールを再利用したい

https://github.blog/open-source/git/working-with-submodules/

GitHub Submoduleの設定手順

  1. サブモジュールの追加

    特定のブランチ feature/hoge を追跡するようにサブモジュールを追加します。
    ※今回は、特定のブランチ(バージョンに値するブランチ)を指定して運用したいため設定しています。

    git submodule add -b feature/hoge <repository_url> <path/to/submodule>
    

    すでにmainブランチで取り込んだ場合は、サブモジュールのディレクトリに移動し
    ブランチをchekcoutすると反映されます。

  2. 変更のコミット

    .gitmodulesファイルとサブモジュールディレクトリをコミットします。

    git add .gitmodules <path/to/submodule>
    git commit -m "Add submodule tracking feature/hoge branch"
    

    取り込んだリポジトリはサブモジュールとして登録されます。

サブモジュールの実行

  1. 依存関係のインストール

    今回はサブモジュールに登録したプロジェクトがreactなのでyarn startしていきます。
    まずは、サブモジュールディレクトリに移動して依存関係をインストールします。

    cd <path/to/submodule>
    yarn install
    
  2. Reactアプリケーションの起動

    yarn startを使用してReactアプリケーションを起動します。

    yarn start
    

特定のブランチで登録されたサブモジュールも必要な依存関係をインストールしてアプリケーションを実行できます。

サブモジュールという選択

e2eを実行するにあたり、e2eの対象となるベースの実装は同じソース内で管理することが多いが
サブモジュールという選択肢があることで、実装は別リポジトリとして管理することができる。
e2e側で、サブモジュールとして登録したいリポジトリを選択できるということは
いつでも対象となるベース実装を切り替えが可能ということでもある。

Aリポジトリをサブモジュールで登録
↓
Aの実装よりもBの実装が良さそう
↓
Bリポジトリをサブモジュールとして登録しなおす

CIへの組み込み

サブモジュールで登録したリポジトリはCI上でも利用可能なので
e2e側のCIを実現する上でも
サブモジュールという選択肢はちょうど良い

https://github.com/actions/checkout

CI上の設定

今回のユースケースではprivateリポジトリを参照する必要があるあめ
GITHUBのPATを発行しています。

- uses: actions/checkout@v4
  with:
   submodules: 'true'
   token: ${{ secrets.PTA_TOKEN }}

再起的なcheckout

# Whether to checkout submodules: `true` to checkout submodules or `recursive` to
# recursively checkout submodules.
#
# When the `ssh-key` input is not provided, SSH URLs beginning with
# `git@github.com:` are converted to HTTPS.
#
# Default: false
submodules: ''

actions/checkoutより

もし、再起的にサブモジュールをcheckoutしたい場合は、recursiveを選択し
ネストがない場合は、trueを選択することで
よしなにactions/checkoutが対応してくれます。

共通の環境内で実行したい場合

Composite Actionで登録したリポジトリのソースを利用しているリポジトリ側と共有したい場合(Composite Action側で利用元のhostにアクセスしたい場合など)は
actions/checkoutpathを設定することで
同一の環境内でCIを実行することができる。

# Relative path under $GITHUB_WORKSPACE to place the repository
path: ''

Command

それなりに使うよねというコマンド

submoduleのstatus

git submodule status

submoduleの更新

git submodule update --remote

submoduleの削除

git submodule deinit -f <追加したsubmodule>
git rm -f <追加したサブモジュール>

Discussion