🙆

ゲーム開発にSubversion

に公開

はじめに

今回は、Subversionというバージョン管理ツールの使い方をまとめます。

一般的なバージョン管理ツールといえばGitやGitHubですが、ゲーム開発などではソースコードだけでなく、3Dモデルやテクスチャ画像など容量の大きいバイナリファイルも管理する必要があります。しかし、Gitはバイナリファイルの高速な管理が苦手です。

さらに、GitHubには100MB以上のファイルをアップロードできない制約があり、コミット自体ができません。git-lfsという方法もありますが、料金が高く、キャッシュの削除も難しいため、個人的には利用を避けたいと考えています。

そこで今回は、ソースコードはGitで管理し、バイナリファイルはSubversionで管理することで、両者を併用したリポジトリ運用を目指します。Subversionサーバーは適切なWebサービスが見つからなかったため、GCP上に構築する方法を紹介します。

GCPの設定

GCP上にGCEを利用してsvnサーバーを立て、3690番ポートを開けます。管理したいファイル容量に応じてboot-disk-sizeを変更しましょう。GCSにバックアップ用のバケットを用意します。

gcloud compute addresses create svn-ip \
    --region=asia-northeast2

gcloud compute instances create svn-server \
    --zone=asia-northeast2-a \
    --machine-type=e2-micro \
    --boot-disk-size=50GB \
    --boot-disk-type=pd-standard \
    --image-family=debian-11 \
    --image-project=debian-cloud \
    --address=svn-ip

gcloud compute firewall-rules create allow-svn-3690 \
    --direction=INGRESS \
    --priority=1000 \
    --network=default \
    --action=ALLOW \
    --rules=tcp:3690,udp:3690 \
    --source-ranges=0.0.0.0/0

gsutil mb -l asia-northeast1 -c ARCHIVE gs://svn-dump-bucket/

Subversionをインストール

ここからは、GCEのインスタンス内で実行するコマンドです。Subversionをインストールします。また、バックアップ用のスクリプトを作成しています。

sudo apt-get update -y
sudo apt-get install subversion apache2 libapache2-mod-svn -y
sudo mkdir /var/svn

sudo tee /usr/local/bin/svn_dump_to_gcs.sh > /dev/null <<'EOF'
PROJECT_NAME="$1"
SVN_REPO_PATH="/var/svn/$PROJECT_NAME"
GCS_BUCKET_NAME="svn-dump-bucket"
DUMP_FILE="/tmp/${PROJECT_NAME}-$(date +\%Y-\%m-\%d).dump"
svnadmin dump $SVN_REPO_PATH > $DUMP_FILE
gsutil cp $DUMP_FILE gs://$GCS_BUCKET_NAME/
rm $DUMP_FILE
EOF

Subversionサーバー起動

Subversionサーバーを起動します。


sudo tee /etc/systemd/system/svnserve.service > /dev/null <<EOL
[Unit]
Description=Subversion Server
After=network.target

[Service]
Type=forking
ExecStart=/usr/bin/svnserve -d -r /var/svn
ExecStop=/bin/kill -TERM \$MAINPID
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOL
sudo chmod +x /usr/local/bin/svn_dump_to_gcs.sh

sudo systemctl daemon-reload
sudo systemctl enable svnserve
sudo systemctl start svnserve

リモートリポジトリの作成

無事にSubversionサーバーが起動したら、リモートリポジトリを作成しましょう。PROJECT_NAME="your-project-name"には、ご自身のプロジェクト名を設定してください(私はGitHubのリポジトリ名に合わせています)。また、深夜2時にバックアップが取れるように設定しています。

リポジトリ作成時には、アクセス管理のためのユーザネームとパスワードも設定します。<ユーザネーム><パスワード>の部分には、任意のユーザー名と安全なパスワードを記入してください。複数ユーザーを登録する場合は、[users]セクションに1行ずつ追加できます。

PROJECT_NAME="your-project-name"

sudo mkdir -p /var/svn/$PROJECT_NAME
sudo svnadmin create /var/svn/$PROJECT_NAME

sudo tee /var/svn/$PROJECT_NAME/conf/passwd > /dev/null <<EOL
[users]
<ユーザネーム> = <パスワード>
EOL

sudo tee /var/svn/$PROJECT_NAME/conf/svnserve.conf > /dev/null <<EOL
[general]
anon-access = none
auth-access = write
password-db = passwd
EOL

crontab -l | {
    cat
    echo "0 2 * * * /usr/local/bin/svn_dump_to_gcs.sh $PROJECT_NAME"
} | crontab -

sudo systemctl restart svnserve

クライアント側の操作方法

ここからはクライアントの操作方法を説明します。クライアントがLinuxであれば以下のコマンドで、Subverionをインストールできます。

sudo apt-get update
sudo apt-get install subversion

下記コマンドで、リモートリポジトリをローカルにチェックアウト(Gitでいうclone)します。

# リポジトリをローカルディレクトリにチェックアウト
svn checkout svn://<サーバーIPまたはホスト名>/<プロジェクト名> <ローカルディレクトリ>

# 例:
svn checkout svn://192.0.2.1/your-project-name ./your-project-name

あとVScodeの拡張機能を使って、Gitで言うところのclone, add, commit等を行えます。
https://marketplace.visualstudio.com/items?itemName=johnstoncode.svn-scm

ソースコードはGit, バイナリファイルはSubversionで管理するには

Subversionで管理したいファイルはassets/フォルダにまとめ、assets/のみをバージョン管理対象に設定にすることで、バイナリファイルだけをSubversionで管理できます。

svn add assets
svn propset svn:ignore '*' .
svn propset svn:ignore '' assets
svn commit -m "Set SVN ignore properties"

おわりに

今回はGitとSubversionを併用して、バージョン管理する方法を紹介しました。

追記

SCM-Managerというセルフホスト型のバージョン管理ソフトがあり、これを使うことでSubversionをより簡単に運用できるのでオススメです。

Discussion