UPMでプライベートリポジトリを指定したUnityプロジェクトをGameCIで動かす
はじめに
Unity Package Manager(以降、UPM)でプライベートリポジトリを使う方法はいくつかありますが、個人的に一番楽だと思うのはSSHプロトコルを使う方法です。
しかし、この方法を使う場合、GameCIを利用するときに1つ問題が発生します。
それはself-hosted runner上でGameCI(のTestRunnerやBuilder)を動かしたときにUPMで指定したプライベートリポジトリの取得に失敗することです。
今回はその原因と対策を見つけたのでその紹介です。
この記事ではself-hosted runnerやGameCIについての細かい説明はしません。
self-hosted runnerについてはこちらの記事、GameCIについてはこちらの記事がオススメです。
環境
Unity: 2020.3.27f1
self-hosted runner動作環境: Ubuntu 20.04.4 LTS
GameCI - Builder: v2.0.4
GameCI - Test runner: v2.0.2
UPMでプライベートリポジトリを指定したUnityプロジェクトをGitHub-hosted runner上のGameCIで使う
まずself-hosted runnerではなく、GitHub-hosted runner上で当該プロジェクトをGameCIで使う場合です。
こちらはGameCIのドキュメントに書いてある通りの方法がそのまま使えます。BuilderでもTestRunnerでも同じやり方が使えます。
簡単にまとめると、
- SSH鍵を生成(UPMでアクセスしたいプライベートリポジトリのURLをコメントにつける)
- UPMでアクセスしたいプライベートリポジトリにデプロイキーを1で生成した公開鍵を登録
- GameCIを動かすリポジトリのGithub secretsに1で生成した秘密鍵を登録(secretsの名前は
SSH_PRIVATE_KEY
がオススメ) - GitHub Actionのyamlファイルで
webfactory/ssh-agent
のステップを追加 + game-ciのステップでsshAgentを指定name: Accessing private repos runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - uses: webfactory/ssh-agent@v0.5.2 with: ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }} - uses: game-ci/unity-builder@v2 with: sshAgent: ${{ env.SSH_AUTH_SOCK }}
これでGameCIのBuilderやTestRunnerを利用することができます。
UPMでプライベートリポジトリを指定したUnityプロジェクトをself-hosted runner上のGameCIで使う
self-hosted runnerで当該プロジェクトをGameCIで使う場合です。こちらは工夫が必要です。
具体的にはself-hosted runnerを動かすマシンでひと手間加える必要があります。
- GameCIのドキュメントに書いてある手順(さっきと同じやつ)をやります。
- self-hosted runnerを動かしている環境において、self-hosted runnerをInstallしたユーザーのknown_hostsをシンボリックリンクを
/home/runner/.ssh/known_hosts
に作成します。ln -s [self-hosted runnerをInstallしたユーザーのhome]/.ssh/known_hosts` /home/runner/.ssh/known_hosts
これでself-hosted runner上であってもGameCIのBuilderやTestRunnerを利用することができます。
なぜシンボリックリンクを貼る必要があるか
GameCIのコードを見るとdockerコンテナを立てるときにssh-agentを利用するために環境変数の設定やボリュームのマウントをしています。
そのうちの1つのknown_hostsマウントにおいて、マウント元が /home/runner/.ssh/known_hosts
で固定されていました(おそらくGitHub-hosted runnerしか考慮できてない)。
しかし、self-hosted runnerにおいてはInstallされるユーザーは必ずしもrunnerという名前ではありません。
なのでself-hosted runnerをInstallしたユーザーのknown_hostsのシンボリックリンクを/home/runner/.ssh/known_hosts
に置くことで対処できます。
ちなみにself-hosted runnerをインストールするユーザーの名前をrunnerにすることでも対処可能です。
おわりに
今回の対応は結構場当たり的なものではあって、GameCIがこの問題に対処してくれたらこの方法は不必要になります。
修正PRを出したい気持ちもあるのですが、GitHubActionもTypeScriptもどちらの開発経験もなくてちょっとPRを出すを躊躇ってしまってます😇しかし、近いうちになんとかPR出したいなと…。
この記事が似た悩みを持った誰かの助けになれば幸いです。
Discussion