🤝

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 の作成方法については以下の記事で詳しく解説されています。

https://zenn.dev/kuritify/articles/gitsubmodule-and-action

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 パイプラインも正常に動作させることができました。


弊社では事業創造にチャレンジする仲間を募集中です。
ぜひ採用サイトをご覧いただければ幸いです。
https://dotd-inc.com/career

dotD Tech Blog

Discussion