GithubActionsでプライベートリポジトリをsubmoduleとして取り込む方法はsubmodule addコマンドでhttps方式で追加したかssh方式で追加したかによって変わります。それぞれのメリットデメリットを説明しつつ、実現方法を記しておきます。
https方式
git submodule add https://github.com/u-nation/GITHUB_REPOSITORY.git
ssh方式
git submodule add git@github.com:u-nation/GITHUB_REPOSITORY.git
https方式
手軽なのはhttps方式です。
以下の権限を持つパーソナルアクセストークンを作成し、secretsに登録してワークフロー内でwithオプションに渡してあげるだけで済みます。
※パーソナルアクセストークンはhttps方式しか使えません。1
.github/workflows/sample.yml
- name: submodule
uses: actions/checkout@v1
with:
submodules: true
token: ${{ secrets.PERSONAL_TOKEN }}
- メリット 手軽さ
- デメリット パーソナルアクセストークンは発行したアカウントがアクセスできるリポジトリ全てに権限が及ぶのでトークンが漏れた場合のセキリュティリスクが大きい。Bot用のアカウントを作成やトークン作成の依頼・共有など運用がしんどい。
ssh方式
- ssh-keygenコマンドで秘密鍵公開鍵を作成
- submodule先のリポジトリのDeploy Keysに公開鍵を登録(必要に応じてwrite権限を付与)
- 取り込む方のリポジトリのsecretsに秘密鍵を登録
- ワークフローでsshの設定とsubmodule update --initをする
.github/workflows/sample.yml
- uses: actions/checkout@v2
- name: SSH Setting
env:
TOKEN: ${{ secrets.TOKEN }}
run: |
mkdir -p /home/runner/.ssh/
echo -e "$TOKEN" > /home/runner/.ssh/id_rsa
chmod 600 /home/runner/.ssh/id_rsa
# https://github.com/actions/checkout#checkout-submodules
- name: Checkout submodules
shell: bash
run: |
git submodule sync --recursive
git submodule update --init --force --recursive
- メリット 鍵の権限はそのリポジトリに限定されるので漏れた時のセキュリティリスクが軽減される。必要に応じて各々が鍵の設定を追加できるので運用が楽。
- デメリット 鍵作ったり設定するのがちょっとだけめんどい。
所感
企業でGithubを使う場合は大抵プライベートなリポジトリだと思うので、誰かのお役に立てると嬉しいです。
ssh方式を実現するのに6時間位ハマって辛かったですが、運用が楽になるのでssh方式がオススメです。
注釈
注釈
-
GithubActionsに移行する前は、AWSのCodeBuildを使用していました(GithubAcitonsの方がめちゃくちゃ早いです)。その時は秘密鍵をSystem Managerで用意してssh方式をしていましたが、途中でhttps方式のsubmoduleオプションが登場しました。 ↩