github submodule という選択
はじめに
共通化させたe2eの運用で
e2eの対象となるベースリポジトリをsubmoduleとして追加した話
Git submodule
一般的な使い所としては
- 大規模なリポジトリを分割したい
- 複数のリポジトリでモジュールを再利用したい
GitHub Submoduleの設定手順
-
サブモジュールの追加
特定のブランチ
feature/hoge
を追跡するようにサブモジュールを追加します。
※今回は、特定のブランチ(バージョンに値するブランチ)を指定して運用したいため設定しています。git submodule add -b feature/hoge <repository_url> <path/to/submodule>
すでにmainブランチで取り込んだ場合は、サブモジュールのディレクトリに移動し
ブランチをchekcoutすると反映されます。 -
変更のコミット
.gitmodules
ファイルとサブモジュールディレクトリをコミットします。git add .gitmodules <path/to/submodule> git commit -m "Add submodule tracking feature/hoge branch"
取り込んだリポジトリはサブモジュールとして登録されます。
サブモジュールの実行
-
依存関係のインストール
今回はサブモジュールに登録したプロジェクトがreactなのでyarn startしていきます。
まずは、サブモジュールディレクトリに移動して依存関係をインストールします。cd <path/to/submodule> yarn install
-
Reactアプリケーションの起動
yarn start
を使用してReactアプリケーションを起動します。yarn start
特定のブランチで登録されたサブモジュールも必要な依存関係をインストールしてアプリケーションを実行できます。
サブモジュールという選択
e2eを実行するにあたり、e2eの対象となるベースの実装は同じソース内で管理することが多いが
サブモジュールという選択肢があることで、実装は別リポジトリとして管理することができる。
e2e側で、サブモジュールとして登録したいリポジトリを選択できるということは
いつでも対象となるベース実装を切り替えが可能ということでもある。
Aリポジトリをサブモジュールで登録
↓
Aの実装よりもBの実装が良さそう
↓
Bリポジトリをサブモジュールとして登録しなおす
CIへの組み込み
サブモジュールで登録したリポジトリはCI上でも利用可能なので
e2e側のCIを実現する上でも
サブモジュールという選択肢はちょうど良い
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: ''
もし、再起的にサブモジュールをcheckoutしたい場合は、recursive
を選択し
ネストがない場合は、true
を選択することで
よしなにactions/checkout
が対応してくれます。
共通の環境内で実行したい場合
Composite Actionで登録したリポジトリのソースを利用しているリポジトリ側と共有したい場合(Composite Action側で利用元のhost
にアクセスしたい場合など)は
actions/checkout
のpath
を設定することで
同一の環境内で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