💬

ゲーム開発にSCM-Manager

に公開

はじめに

Subversionを使う上でSCM-Managerという便利なセルフホストサーバーを知ったので紹介します。

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

そこでプロのゲームスタジオでは、PerforceやPlastic SCMといったバイナリファイルを管理することが得意なバージョン管理ツールが定番ですが、個人開発者や小規模チームにはコスト負担が大きすぎます。

そこで前回こちらの記事で、コードはGit、アセットはSubversionで分けて管理すると、コストを抑えつつアセットをバージョン管理できてオススメだとご紹介しました。

ただSubversionを直接扱うことは少しつらいため、いい方法はないか探しているときに見つけたものが、SCM-Managerです。

SCM-Managerとは?

SCM-Managerは、Subversion(SVN)をはじめ、GitやMercurialなど複数のバージョン管理システムを統合的に扱えるセルフホスト型のサーバーソフトウェアです。ブラウザからリポジトリの作成・閲覧・管理ができるのが特徴で、CLIだけでなくWeb UIを通じて直感的に操作できます。

要はSubversionも使えるGitHubみたいなものですね!UIもモダンで非常に良い感じです。

SCM-Managerの画面例

SCM-Managerの良いところ

OSSでコミットも頻繁

SCM-ManagerはOSSとして開発されており、こちらで開発状況を見ることができます。少なくとも2025年9月現在、数日前にも更新があり、長く使っていくうえで安心感があります。

インストールが簡単

SCM-ManagerはLinuxでもWindowsでも利用できます。Dockerイメージも用意されているため、GCEやオンプレ環境にも簡単にデプロイできます。

例えば、Debian/Ubuntuでは下記のコマンドを実行するだけで、インストールからサーバーの起動まで行えます。

echo 'X-Repolib-Name: SCM-Manager
Enabled: yes
Types: deb
URIs: https://packages.scm-manager.org/repository/apt-v2-releases/
Suites: stable
Components: main
Architectures: all
Signed-By: /etc/apt/keyrings/scmm-archive-keyring.gpg' | sudo tee /etc/apt/sources.list.d/scm-manager.sources
sudo mkdir -p /etc/apt/keyrings
sudo chmod 0755 /etc/apt/keyrings
sudo sh -c 'curl -s https://keys.openpgp.org/vks/v1/by-fingerprint/23D2625B235E25A4719875A2975922F193B07D6E | gpg --dearmor > /etc/apt/keyrings/scmm-archive-keyring.gpg'
sudo chmod +r /etc/apt/keyrings/scmm-archive-keyring.gpg
sudo apt-get update
sudo apt-get install scm-server

起動後、http://<サーバーIP>:8080/scm にアクセスすると初期設定画面が表示されます。
ここで管理者アカウントを作成すれば、すぐにSVNリポジトリを作成できるようになります。

GCEで実際にSCM-Managerサーバーを作ってみよう

GCPのGCEで実際にサーバーを立ててみましょう。

# create static IP
gcloud compute addresses create scm-manager-ip \
    --region=asia-northeast2

# open firewall (port 8080)
gcloud compute firewall-rules create allow-scm-8080 \
    --direction=INGRESS \
    --priority=1000 \
    --network=default \
    --action=ALLOW \
    --rules=tcp:8080 \
    --source-ranges=0.0.0.0/0 \
    --target-tags=scm

# create VM instance
gcloud compute instances create scm-manager \
    --zone=asia-northeast2-a \
    --machine-type=e2-micro \
    --boot-disk-size=50GB \
    --boot-disk-type=pd-standard \
    --image-family=debian-12 \
    --image-project=debian-cloud \
    --address=scm-manager-ip
    --tags=scm

VMに入って、先ほどのインストールコマンドを実行するだけで完了です。

バックアップの取り方

SCM-Managerは自動でバックアップを行う機能は用意されていません(もちろん各リポジトリのエクスポート、インポートはありますよ)。SCM-Manager自体は70MB程度と3Dモデルなどと比べれば大したデータ量ではないため、SCM-Managerごとまるっとバックアップする方法を紹介します。

今回はGCPのCloud Storageに毎日バックアップするように設定します。

  • サービスアカウントの作成とVMへの紐づけ

    gcloud iam service-accounts create scm-backup-sa \
        --display-name="SCM Backup Service Account"
    
    gcloud projects add-iam-policy-binding <YOUR_PROJECT_ID> \
        --member="serviceAccount:scm-backup-sa@<YOUR_PROJECT_ID>.iam.gserviceaccount.com" \
        --role="roles/storage.objectAdmin"
    
    gcloud compute instances set-service-account scm-manager \
        --zone=asia-northeast2-a \
        --service-account=scm-backup-sa@<YOUR_PROJECT_ID>.iam.gserviceaccount.com \
        --scopes=https://www.googleapis.com/auth/cloud-platform
    
  • バケット作成

    gsutil mb -c ARCHIVE -l asia-northeast1 -b on gs://scm-backup/
    gsutil lifecycle set /dev/stdin gs://scm-backup <<< '{"rule":[{"action":{"type":"Delete"},"condition":{"age":120}}]}'
    
  • /usr/local/bin/scm_backup.sh の作成

    sudo tee /usr/local/bin/scm_backup.sh > /dev/null <<'EOF'
    #!/bin/bash
    set -e
    
    BACKUP_DIR="/var/backups"
    BASE_DIR="/var/lib/scm"
    DATE=$(date +%Y%m%d)
    
    systemctl stop scm-server
    tar -czvf ${BACKUP_DIR}/scm-${DATE}.tar.gz ${BASE_DIR}
    systemctl start scm-server
    
    gcloud storage cp ${BACKUP_DIR}/scm-${DATE}.tar.gz gs://scm-backup/backups/
    rm -f ${BACKUP_DIR}/scm-${DATE}.tar.gz
    EOF
    
    sudo chmod +x /usr/local/bin/scm_backup.sh
    
  • 毎日深夜2時にバックアップする設定

    echo "0 2 * * * root /usr/local/bin/scm_backup.sh" | sudo tee /etc/cron.d/scm_backup
    

バックアップを使って復元する方法

  • 復元方法
    sudo systemctl stop scm-server
    sudo mv /var/lib/scm /var/lib/scm.bak.$(date +%Y%m%d%H%M)
    sudo tar -xzvf /var/backups/scm-XXXXXXX.tar.gz -C /
    sudo chown -R scm:scm /var/lib/scm
    sudo systemctl start scm-server
    

まとめ

SCM-Manager、ぜひ使ってみてください!

Discussion