🏰

UPMでプライベートリポジトリを指定したUnityプロジェクトをGameCIで動かす

2022/05/15に公開

はじめに

Unity Package Manager(以降、UPM)でプライベートリポジトリを使う方法はいくつかありますが、個人的に一番楽だと思うのはSSHプロトコルを使う方法です。

https://docs.unity3d.com/Manual/upm-git.html#Git-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でも同じやり方が使えます。

簡単にまとめると、

  1. SSH鍵を生成(UPMでアクセスしたいプライベートリポジトリのURLをコメントにつける)
  2. UPMでアクセスしたいプライベートリポジトリにデプロイキーを1で生成した公開鍵を登録
  3. GameCIを動かすリポジトリのGithub secretsに1で生成した秘密鍵を登録(secretsの名前はSSH_PRIVATE_KEYがオススメ)
  4. 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を動かすマシンでひと手間加える必要があります。

  1. GameCIのドキュメントに書いてある手順(さっきと同じやつ)をやります。
  2. 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