Git submodule を使用する際にやったこと
はじめに
複数のプロジェクトで同じUIコンポーネントを使用するために、
Git submodule を使用して複数リポジトリで共通のソースコードを読み込めるようにしました。
今回はGit submodule を使用する上で必要な操作・設定について書いていこうと思います。
この記事を読むことで、以下の知識を得られます。
- Git submodule の基本的な使い方
- GitHub Actions で submodule を扱う際の認証設定
- プライベートリポジトリの submodule を CI/CD で扱う方法
基礎となる知識
Git submodule とは
Git submodule は、Git リポジトリの中に別の Git リポジトリを埋め込むための仕組みです。
主な特徴:
- 親リポジトリは submodule の特定のコミットを参照する
- submodule は独立したリポジトリとして管理される
- 複数のプロジェクトで同じコードベースを共有できる
GitHub Apps による認証
GitHub Actions で複数のプライベートリポジトリにアクセスする場合、デフォルトの GITHUB_TOKEN では権限が不足することがあります。GitHub Apps を使用することで、複数のリポジトリに対する適切な権限管理が可能になります。
submodule の追加
まず、プロジェクトに submodule を追加します。-b main オプションで main ブランチに追従するように設定します。
git submodule add -b main <リポジトリのURL> <submoduleの中身を格納したいディレクトリ>
ローカル環境での submodule の更新
初回クローン時
プロジェクトをクローンするだけではsubmoduleの中身は取得されません。
クローン後に以下のコマンドで submodule を初期化することで中身が取得されます。
git submodule update --init --recursive
submoduleの更新
submodule の最新版を取得する場合は、以下のコマンドを実行します。
git submodule update --remote
CI/CD での対応
GitHub Apps の作成
(以下、前提として特定のOrganization配下にあるプライベートリポジトリで進めています。)
プライベートリポジトリの submodule にアクセスするため、GitHub Apps を作成します。
メインリポジトリとsubmodule リポジトリに対し、コンテンツの読み取り権限を設定した独自のGitHub Apps を作成します。
Git submodule を利用する際の GitHub Apps の作成方法については以下の記事で詳しく解説されています。
GitHub Actions ワークフローの設定
ワークフローファイルに以下の設定を追加します。
jobs:
build:
runs-on: ubuntu-latest
steps:
# GitHub App のトークンを生成
- name: Generate token
id: generate-token
uses: actions/create-github-app-token@v2
with:
app-id: ${{ secrets.GH_APP_ID }}
private-key: ${{ secrets.GH_APP_PRIVATE_KEY }}
owner: ${{ github.repository_owner }}
# リポジトリのチェックアウト
- name: Checkout codebase
uses: actions/checkout@v4
with:
token: ${{ steps.generate-token.outputs.token }}
submodules: true
# トークンをリポジトリ設定に保存しない
persist-credentials: false
ポイント:
-
submodules: trueにより、submodule も含めて再帰的にチェックアウトされます -
persist-credentials: falseにより、トークンがリポジトリの設定に保存されません
まとめ
ここまで Git submodule を使用する上で必要な操作・設定について解説しました。
この方法により、共通のUIコンポーネントを複数のプロジェクトで効率的に管理できるようになり、かつ CI/CD パイプラインも正常に動作させることができました。
弊社では事業創造にチャレンジする仲間を募集中です。
ぜひ採用サイトをご覧いただければ幸いです。
Discussion