Perforceの環境構築をしてみる WSL2編

# はじめに
「普段はUnityばっかり触っているが、そろそろUE勉強したい
どうせだったら現場でよく使われるバージョン管理構築して、一石二鳥したろ」
という軽い気持ちで始めてます
その為、間違いなど往々にしてあると思うので、あれば指摘してください

# どうしてPerforceなの？Gitじゃダメなの？
「ダメじゃないけど、Perforceの方が適している」という感じです

Perforceには以下の特徴があります
- 大容量ファイルの扱いが得意
- バイナリファイルの扱いが得意
- ファイルの排他ロックが可能
- UE公式に[Perforceでの開発サポートページ](https://docs.unrealengine.com/5.0/ja/using-perforce-as-source-control-for-unreal-engine/)がある
少し話が逸れますが、AWS公式にも[Perforceを構築するサポートページ](https://aws.amazon.com/jp/blogs/news/perforce-helix-core-on-aws-part1/)があります

UEではUnityに比べて巨大なファイルを扱うこと、バイナリファイルを扱うことも増えます
UEでの開発において、小規模であればGitを使用することの方が多いとは思いますが、大規模開発ではPerforceを採用していることが多いです

また、前述した通り、Perforceに関する構築をサポートしてくれるようなサイトも最近は増えてきており、個人でも学習しやすい環境になっています
~~それこそ、個人でPerforce環境を構築することにロマンを感じる...！~~

:::note info
使う理由とは関係ないですが、基本的にはPerforceはSVNなどと同じ集中型になっています
（Perforceも頑張ればGitのような分散型もできる？（要勉強））
:::

# どうしてWSL2なの？
テスト環境で動かしてみてから実環境の構築をしたかったからです
それ以外に特に理由はないです
実環境での構築も改めて記事にする予定です

そもそもWSL2とは何ぞやって部分に関してはこちらを参照
https://www.pc-koubou.jp/magazine/40465

# 実装環境
**Windows** : Windows10 Pro
**Linux** : Ubuntu 22.04.3 LTS
**Helix Core ServerVersion** : 2023.4/2535420
**Helix Visual Client**(Windows用GUI) : 2023.4/2534624

::: note info
PerforceServer自体はパッケージが分割されており、以下が存在します
- helix-p4d
- helix-p4dctl
- helix-proxy
- helix-broker
- helix-cli
:::

※現在は「Helix Core」という名称ですが、呼び方は「Perforce」で統一します

# 今回のゴール
PerforceServerをWSL2に構築し、実際に起動するところまで

# WSL2環境を構築する
- WSL2を有効にする

https://www.pc-koubou.jp/magazine/21475#section02-03

1. コントロールパネル
1. プログラム
1. プログラムと機能
1. Windowsの機能の有効化または無効化
1. 「Windows Subsystem for Linux」にチェックを入れる
    1. Hyper-Vが有効になっていない場合は、これも有効にする
1. 再起動

- Ubuntuをインストールする
WindowsStoreからインストールする
インストール完了すると、Ubuntuの起動用アイコンが追加されるため、そこから起動する

# PerforceServerのセットアップ
https://www.toyo.co.jp/files/user/img/product/ss/help/perforce/r19.1/manuals/p4sag/Content/P4SAG/install.linux.packages.install.html

上記記事の「APT(Ubuntu)の場合」に沿って順にセットアップしていきます

#### perforce.pubkeyをAPTのキーリングに追加
```
wget -qO - https://package.perforce.com/perforce.pubkey | sudo apt-key add -
```

上記コマンドを実行することでperforce.pubkeyをダウンロードし、APTキーリングに追加されます
apt-keyは非推奨になり削除されるという話ですが、今回は公式の手順に沿って実装を行います

**※APTについてはこちらを参照**
https://weblabo.oscasierra.net/ubuntu-apt/

#### APTの追加
1. `/etc/apt/sources.list.d/`に`perforce.list`を作成
```
sudo touch /etc/apt/sources.list.d/perforce.list
```
1. `perforce.list`を編集する ※今回はnanoコマンドを使用
```
sudo nano /etc/apt/sources.list.d/perforce.list
```

1. `perforce.list`に以下の文言を追加
```
deb http://package.perforce.com/apt/ubuntu hogehoge release
```
`hogehoge`には、Ubuntuのバージョンに合わせた文言を入れてください
今回は`Ubuntu 22.04.3`なので`Jammy`になります

1. APTパッケージの更新
```
apt-get update
```
`sudo apt update`でもいいですが、前述の通り公式の手順に沿います

# PerforceServerの追加設定
P4D(PerforceServer)を起動し、初期設定を行います

https://www.toyo.co.jp/files/user/img/product/ss/help/perforce/r19.1/manuals/p4sag/Content/P4SAG/install.linux.packages.configure.html

上記記事を参考に設定していきます

## 設定用のスクリプトを実行する
```
sudo /opt/perforce/sbin/configure-helix-p4d.sh
```


### サービス名
サービスの開始や停止で使用する名前
リポジトリ名という認識で問題なし
今回は「Hoge」にする

```
Perforce Service name [master]: Hoge
```

### サーバルート(P4ROOT)
バージョン化ファイルおよびメタデータを保管するディレクトリ
指定したいディレクトリがなければデフォルトでOK([]に記載されているディレクトリ)
```
Perforce Server root (P4ROOT) [/opt/perforce/servers/Hoge]:
Create directory? (y/n) [y]: y
```

### サーバのUnicodeモード
日本語コメントを残したいのでYにする

:::note warn
一度オンにするとオフに戻せないので注意
:::

詳細は[Unicode環境の構成と管理](https://www.toyo.co.jp/files/user/img/product/ss/help/perforce/r19.1/manuals/p4sag/Content/P4SAG/superuser.unicode.html)
```
Perforce Server unicode-mode (y/n) [n]: y
```

### サーバの大文字と小文字の区別
区別させたくないのでNにする
UE以外で使う場合は基本Yでいい（はず）

:::note warn
追記 : UEでは文字の大小を区別しない（FName型）
オフにしないとバグの原因になるらしいので、注意
:::

詳細は[大文字と小文字の区別とマルチプラットフォーム開発](https://www.toyo.co.jp/files/user/img/product/ss/help/perforce/r19.1/manuals/p4sag/Content/P4SAG/DB5-31445.html)
```
Perforce Server case-sensitive (y/n) [y]: n
```

### サーバアドレス(P4PORT)
Helixサーバの待機対象となるホストとポート
通信をプレーンテキストまたはSSLのどちらで行うかを指定
詳細は[通信ポート情報](https://www.toyo.co.jp/files/user/img/product/ss/help/perforce/r19.1/manuals/p4sag/Content/P4SAG/DB5-92242.html)
環境や状況に合わせて設定する
今回はデフォルトのまま
```
Perforce Server address (P4PORT) [ssl:1666]:
```

### スーパーユーザーの設定
スーパーユーザーに関する詳細は[アクセスレベル](https://www.toyo.co.jp/files/user/img/product/ss/help/perforce/r19.1/manuals/p4sag/Content/P4SAG/protections.set.html#Access)
パスワードは大文字小文字混合か、数字混合の上、8文字以上必須
```
Perforce super-user login [super]: hoge
Perforce super-user password: HogeHoge
```

## 設定まとめ
```
Perforce Service name [master]: Hoge
Perforce Server root (P4ROOT) [/opt/perforce/servers/Hoge]:
Create directory? (y/n) [y]: y
Perforce Server unicode-mode (y/n) [n]: y
Perforce Server case-sensitive (y/n) [y]: n
Perforce Server address (P4PORT) [ssl:1666]:
Perforce super-user login [super]: hoge
Perforce super-user password: HogeHoge
```

`P4D configuration has completed successfully.`と表示されたら成功です
また、p4 infoで現在のPerforceServerの情報が見られます

# 番外編
## ローカルネットワーク上の別端末からアクセスできるようにする
1. PowerShellを管理者実行で起動
1. `ipconfig`を実行
WindowsのIPアドレス(IPv4 アドレス)とWSLのIPアドレスを確認する
1. ファイアウォールとプロキシの設定を変更する 
```
netsh advfirewall firewall add rule name="allow p4port" dir=in action=allow protocol=TCP localport=1666
netsh interface portproxy add v4tov4 listenaddress=windows_ip listenport=1666 connectaddress=wsl_ip connectport=1666
```
windows_ipとwsl_ipを先程ipconfigで確認したIPアドレスに書き換える

:::note info
ポートフォワード設定を削除する場合は以下を実行する
netsh interface portproxy delete v4tov4 listenport=1666
:::

# 最後に
今回はまだ最低限サーバーを構築したのみで、Perforceで何かをするところまでは行けてません
次回クライアント側で使用できるところまで構築していきます

# 次回
https://qiita.com/toki_games/items/a8127270d096dc86052f

# 追記
VPSを使用したAlmaLinux編を執筆しました

https://qiita.com/toki_games/items/1addb516d890b6ced337