最終更新日:2023年6月12日

こんにちは、開発2部の長久保です。 弊社ではCI環境にCircleCIを利用しています。CircleCI 2.0でのprivateなリポジトリのgit submoduleの使い方で少しハマったので記録に残したいと思います。
はじめに
サンプルのリポジトリを用意しました。
Submoduleを利用するリポジトリ
https://github.com/htl-dev/public_circleci2_submodule_example
利用されるリポジトリ
https://github.com/htl-dev/public_submodule_example
中身はpythonでpublic_circleci2_submodule_exampleのmain.pyがpublic_submodule_exampleのsubmodule.pyを呼び出す単純な構成になっています。
CircleCIのconfigファイル
.circleci/config.yaml
version: 2
jobs:
build:
working_directory: /work_space
docker:
- image: docker:17.05.0-ce-git
branches:
only:
- master
steps:
- checkout
- run:
name: submodule update and execute
command: |
git submodule init
git submodule update
git submodule foreach git pull origin master
apk add --update python && rm -rf /var/cache/apk/*
python main.py
git submodule init
git submodule foreach git pull origin master
にてsubmoduleの更新を行なっています。
問題点
submoduleのリポジトリがpublicなら問題がないのですが、privateになると下記のようなエラーがでます。
原因ですが、CircleCIはpublic_circleci2_submodule_exampleに対するアクセス権はあるものの、public_submodule_exampleに対してのアクセス権は持ってない為です。public_submodule_exampleをCircleCIにadd projectしてもpublic_circleci2_submodule_exampleから実行した場合は上記のエラーになります。CircleCIはデフォルトでは単一のリポジトリの読み込み権限しか持っていません。
対処法
CircleCIのUIにてプロジェクトの設定からPERMISSIONSにあるCheckout keysを選択します。
Add user keyにあるAuthorized with Githubボタンを押下すると、CircleCIにuser keyのリポジトリの権限が付与されます。 
こちらを適用することで、privateなリポジトリのgit submodule updateが行えます。
最後に
リポジトリにsubmoduleをコピーするしかないかと考えていましたが、問題が解決出来たので良かったです。
▼ホットリンク では一緒に働く仲間を募集しています!▼
プログラマー(募集人員4名)
サーバサイドエンジニア(募集人員1名)