🧬

Windowsのローカル上にPerforce Helix Coreを構築・インストールする

2023/01/16に公開

前置き

  • UE5の仮想アセット[1]を使いたいのでサポートされてるPerforceを導入してみます
  • Perforce(Helix Core)の価格ですが、「最大5ユーザー/20ワークスペースの環境向けに無料で提供」とのこと[2]。個人で使う分には問題なさそう
  • 実際に運用するのはこれからなので、あくまでインストール手順の参考程度にお願いします!

やりたいこと

  • Windowsのローカル上にPerforce Helix Coreを構築する
  • 複数人で利用する場合だとサーバー対クライアントを一対多で構築するわけですが、個人で使うのに別ホストにする意味もないのでWindows1台の中に同居させます
  • DBのUnicode規格サポート
  • Unreal Engineでの利用では、大文字と小文字を区別しないよう設定するのが推奨のようなのですが、「Windows上のHelix Coreサーバは大文字と小文字の区別を無視します」[3]とあるので特に対応はしません
  • SSLは一旦なしで[4]
パブリッククラウドでの構築について考えたこと
  • 情報量的にも課金の考え方的にもAWSが無難

  • DockerコンテナはPerforce公式が用意・メンテしてるHelix Core Serverのイメージがないっぽいので断念 (あまり自分で用意・メンテはしたくない...)

  • CloudFormationを使う場合の参考情報↓

https://aws.amazon.com/jp/blogs/news/perforce-helix-core-on-aws-part2/

  • AMIを使う場合の参考情報↓

https://dev.classmethod.jp/articles/parforce_helixcore_server_with_aws/

  • バックアップ・リストアの話 (Lifecycle Manager, S3 )↓

https://youtu.be/DW21oWrSY9M

  • クライアント-サーバー間の接続にはインバウンド許可なしで使えるRemote.Itがいいかも↓

https://qiita.com/Brutus/items/81b950119800cfd9599b

  • 結論:課金コストも管理コストも無視できないので興味本位でやるには微妙

構成イメージ図

※正確でない部分もあるかもですが、あくまでイメージとしてご容赦ください

登場人物

Perforce

  • バージョン管理プロダクト群。バイナリファイルの扱いが得意とのこと
  • 各機能ごとに以下のHelix~に分かれるが、慣習的に旧名のPerforceと呼ばれてるっぽい

Helix Core Server

  • 通称P4D、Windowsサービスとして起動する場合P4Sと呼ぶ
  • 内部に持っているデータベースでバージョン情報やDB自身のメタデータを管理している

Helix Admin Tool

  • 通称P4Admin
  • GUIでP4Dを管理するのに使う

Helix Command Line

  • P4コマンド
  • CUIでP4Dを管理するのに使う

Helix Visual Client

  • 通称P4V
  • 開発者が自端末からP4Dの機能(バージョン管理等)を利用するのに使う

Helix Plugin for Visual Studio(P4VS)

  • Visual Studio用のPerforceプラグイン
  • UE5と利用する関係でVisual Studioを日常的に立ち上げるため、ついでに入れておく
  • 多分P4DによるソースコントロールをVS上で使える?

手順

パッケージをダウンロード

Perforce公式サイトでWindows x64用の最新版をダウンロードする
P4Dのみ、ダウンロード前に連絡先を入力する必要あり

  • Helix Core Server(P4D) インストーラー
    • P4コマンドラインツール同梱

https://www.perforce.com/downloads/helix-core-p4d

  • Helix Visual Client(P4V) インストーラー
    • P4Merge, P4Admin, P4コマンドラインツール同梱

https://www.perforce.com/downloads/helix-visual-client-p4v

  • Helix Plugin for Visual Studio(P4VS) vsixファイル

https://www.perforce.com/downloads/helix-plugin-visual-studio-p4vs

Helix Core Server(P4D)インストール

東陽テクニカさんのインストール手順を参考にさせて頂きました
https://kb.toyo.co.jp/wiki/pages/viewpage.action?pageId=67503142

  1. ダウンロードした"helix-core-server-x64.exe"を管理者として実行
  2. インストールオプションを選択。"Server (P4D)"と"Helix Command Line (P4)"を選択。次へ
  3. Port Numberで待ち受けポートを既定のまま"1666"に設定。予めDBを構成したいフォルダを作成して、P4ROOTにパスを指定。次へ
  4. クライアント用の設定。サーバで宛先ポートを既定のまま"1666"に設定。ユーザー名に作成したいユーザー名を入力。テキスト編集アプリケーションは好みのものがあれば選択。次へ
  5. インストールをクリック
  6. 完了画面が表示されたら、終了をクリックして閉じる

Helix Core Server (P4D)データベース日本語対応

Unicode規格をサポートさせて、コードやコメントに日本語を利用できるようにする[5]

  1. コマンドプロンプトを管理者として実行
  2. Helix Core Serverのサービスを停止
C:\WINDOWS\system32>sc stop Perforce

SERVICE_NAME: Perforce
        TYPE               : 10  WIN32_OWN_PROCESS
        STATE              : 3  STOP_PENDING
                                (STOPPABLE, NOT_PAUSABLE, ACCEPTS_SHUTDOWN)
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x7530

C:\WINDOWS\system32>
  1. インストーラーでP4ROOTに指定したフォルダをエクスプローラーで開く
  2. フォルダ内の以下の条件のリソースを削除する[6]
削除対象のフォルダとファイル
"db."から始まる全てのファイル
journal
log
server.locks(フォルダ)
  1. Unicodeモードでデータベース再構築
    • "E:\Perforce\Server\p4root"はインストーラーでP4ROOTで指定したパスに変えてください
C:\WINDOWS\system32>p4d -r E:\Perforce\Server\p4root -xi
Perforce db files in 'E:\Perforce\Server\p4root' will be created if missing...
Server switched to Unicode mode.

C:\WINDOWS\system32>
  1. Helix Core Serverのサービスを起動
C:\WINDOWS\system32>sc start Perforce

SERVICE_NAME: Perforce
        TYPE               : 10  WIN32_OWN_PROCESS
        STATE              : 2  START_PENDING
                                (STOPPABLE, NOT_PAUSABLE, ACCEPTS_SHUTDOWN)
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x2710
        PID                : 16648
        FLAGS              :

C:\WINDOWS\system32>
  1. Unicodeモードが有効になっていることを確認(unicode enabled)
C:\WINDOWS\system32>p4 -Ztag info
~省略~
... unicode enabled
~省略~
C:\WINDOWS\system32>

Helix Visual Client(P4V)インストール

東陽テクニカさんのインストール手順を参考にさせて頂きました
https://kb.toyo.co.jp/wiki/pages/viewpage.action?pageId=67503112

  1. ダウンロードした"p4vinst64.exe"を管理者として実行
  2. インストールオプションを選択。"Helix Visual Client (P4V)", "Merge and Diff Tool (P4Merge)", "Administration Tool (P4Admin)", "Command-Line Client (P4)"を選択。次へ
  3. サーバは既定のまま"1666"。ユーザ名はP4Dのインストールで指定したものが入力された気がする。テキスト編集アプリケーションは好みのものがあれば選択。次へ
  4. インストールをクリック
  5. 完了画面が表示されたら、終了をクリックして閉じる
  • 日本語化は今回はしません。

P4AdminとP4Vを起動してサーバーに接続してみる

インストールするとスタートメニューから起動できるようになります

  1. 起動すると接続設定画面が開く。P4Vインストール時に指定したサーバーアドレスとユーザーが入力されている。OKをクリック
  2. 文字エンコードを聞かれるので既定の"Shift-JIS"ではなく"UTF-8"に。チェックボックスにチェックを入れてすべての接続に設定を適用

  3. "no such user"と表示されて接続できず...データベース再構築でメタデータが削除され、インストール時のユーザー作成はなかったことになっていたのを失念していた

P4コマンドでユーザー作成・ログイン確認

GUIではこれ以上操作ができないので、CUIでユーザーの確認・作成をする
手順はこちらを参考にさせて頂きました
https://dench.flatlib.jp/ue4/perforce#windows_の場合

  1. コマンドプロンプト起動してユーザーの一覧を表示。想定通りユーザーは作成されておらず
C:\WINDOWS\system32>p4 users
No such user(s).

C:\WINDOWS\system32>
  1. 任意の名前でユーザーを作成。テキストエディタが開くので何もせず閉じます
    • "[ユーザー名]"は任意の名前に変えてください
C:\WINDOWS\system32>p4 user [ユーザー名]
User [ユーザー名] not changed.

C:\WINDOWS\system32>
  1. ユーザーの一覧を表示。ユーザーが作成されていることを確認する
C:\WINDOWS\system32>p4 users
[ユーザー名] <[ユーザー名]@[PCホスト名]> ([ユーザー名]) accessed 2023/01/13

C:\WINDOWS\system32>
  1. パーミッションレベルを設定。テキストエディタが開くので"super user"であることを確認してエディタを閉じる[7]
C:\WINDOWS\system32>p4 protect
Protections saved.

C:\WINDOWS\system32>
p4 protect出力サンプル
~省略~
Protections:
	write user * * //...
	super user [ユーザー名] * //...
  1. P4Adminを起動して接続。画面左のリストのConnectionsの下やUsers&Groupsビューにユーザーが表示されていればOK

  2. 同様にP4Vを起動して接続。アップデートを自動でチェックするか確認されるので任意で選択
  3. テレメトリの収集を確認されるので任意で選択
  4. 接続できると以下のような画面が表示される

Helix Plugin for Visual Studio(P4VS)インストール

最後にVisual Studioに拡張機能をインストール
vsixファイルなので他のVS(VSCode)の拡張機能と同じ感覚で入れられました

現段階では無理ですが、P4VでWorkspaceの作成が済んだ後はVisualStudioの"ファイル(F) > Open Connection to a Helix Core server..."でサーバへログインできます (2023/2/24更新)

  • 前提としてVisualStudioをインストール済みであること
  1. ダウンロードした"p4vs.vsix"を実行
  2. 利用したいバージョンのVSにチェックが入ってることを確認。Installをクリックして完了したらClose

Helix Plugin for Visual Studio(P4VS)プリファレンス設定

旧バージョンですが、設定等は東陽テクニカさんのドキュメントが参考になりました。設定を扱っているのは12, 13ページ当たり
https://www.toyo.co.jp/files/user/img/product/ss/pdf/p4vs_ja.pdf#page=13

  1. VSを起動して、ツール>オプションを開く
  2. Source Controlから、ソース管理プラグインをP4VSに切り替えると設定項目にアクセスできる

Helix Core - Connections(接続)
  • "Connect to the server using solution-specific(ソリューション固有の設定を使用してサーバに接続する)"を選択[8][9] (2023/2/24更新)

Helix Core - Data Retrieval(データ取得)
  • 変更せず
Helix Core - Diff/Merge/Reviews(比較 / マージ)
  • 変更せず
Helix Core - General(一般)
  • 変更せず
Helix Core - Ignoring Files(無視するファイル)
  • 変更せず
Helix Core - Logging(ログ記録)
  • "Show p4 reporting commands (dirs, filelog, fstat)(p4レポート・コマンドを表示)"を有効に

  • "Enable logging to(ファイルへのログ記録を有効にする)"を有効に

  • "Sizes (kb)(サイズ)"を1000に変更

  • OKをクリックして設定画面を閉じる

おまけ バックアップについて

PCがダメになるとすべてを失うのでバックアップの仕組みを考える

  • Helix Core Serverのバックアップ・リストアについての参考情報

https://www.toyo.co.jp/files/user/img/product/ss/help/perforce/r19.1/manuals/p4sag/Content/P4SAG/chapter.backup.html

  • Helix Core Serverでバックアップおよび管理が必要なファイルは以下の3つ (ガバガバ理解)
    • チェックポイントファイル
      • データベースのスナップショット。ジャーナルファイルが大きくなり過ぎないようにするには、チェックポイントファイルを定期的に作成する必要があり、バックアップの前にチェックポイントを作成することが推奨される
    • ジャーナルファイル
      • 直近のチェックポイント作成後からデータベースに加えられたすべての変更点を追跡する実行トランザクションログ。チェックポイントを作成することでローテーションされ、肥大化を防止できる
    • バージョン化ファイル
      • バージョン管理対象のファイル。チェックポイントファイルにもジャーナルファイルにもバージョン化ファイルは含まれないので、個別にバックアップする必要がある

これらの特性を考慮してチェックポイントの作成やバックアップの取得をしていこうと思うと急にお仕事感が出てきます

ここまではやりたくない...
ということでサービス停止で静止点をとってP4ROOTを丸ごとZIP圧縮しようと思います

色々拙いですが、PowerShellスクリプトを書いてみました
Perforceが停止してなければ停止して、バックアップが済んだら起動しなおします
アーカイブの保存先にクラウドストレージのパスを指定すれば、バックアップファイルをクラウドに保管できます
例ではデスクトップ版Google DriveをマウントしたG:ドライブを指定

AutoColdBackupAndRestartService.ps1
#AutoColdBackupAndRestartService.ps1
#2023/1/13 created ichinanayon

#Parameter Settings
# -----------------------------------------------
#停止するサービス名
$ServiceName = "Perforce"
#アーカイブしたいパス
$SourcePath = "E:\Perforce\Server\p4root\"
#アーカイブの保存先パス
$DestinationPath = "G:\マイドライブ\Perforce\bk\"
#アーカイブファイル名
$ArchivefileName = "p4root"
# -----------------------------------------------

#管理者権限で実行
if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole("Administrators")) 
{
  Start-Process powershell.exe "-ExecutionPolicy RemoteSigned -File `"$PSCommandPath`"" -Verb RunAs
  exit
}

#PSCommandPathに移動
cd (Split-Path -Path $PSCommandPath)

#ログ出力
Function FuncOutputLog($arg){
    $Ps1fileDir = Split-Path -Path $PSCommandPath
    $Ps1fileName = (Get-Item $PSCommandPath).BaseName
    $Logfile = $Ps1fileDir + "\" + $Ps1fileName + ".log"

    Write-Output ((Get-Date -Format "yyyy/MM/dd HH:mm:ss: ") + $arg) >> $Logfile

}

#パラメータチェック
Function FuncCheckParameter(){
    FuncOutputLog("CheckParameter Starting...")

    if([string]::IsNullOrEmpty($ServiceName)){
        FuncOutputLog($ServiceName + ": ServiceName Invalid Param. Process Exit")
        exit
    }
    elseif(!(Get-Service -Name $ServiceName)){
        FuncOutputLog($ServiceName + ": ServiceName Invalid Param, Service Not Exist. Process Exit")
        exit
    }

    if([string]::IsNullOrEmpty($SourcePath)){
        FuncOutputLog($SourcePath + ": SourcePath Invalid Param. Process Exit")
        exit
    }
    elseif(!(Test-Path $SourcePath)){
        FuncOutputLog($SourcePath + ": SourcePath Invalid Param, Service Not Exist. Process Exit")
        exit
    }

    if([string]::IsNullOrEmpty($DestinationPath)){
        FuncOutputLog($DestinationPath + ": DestinationPath Invalid Param. Process Exit")
        exit
    }
    elseif(((Split-Path $DestinationPath -IsAbsolute) -and (!(Test-Path (Split-Path $DestinationPath -qualifier))))){
        FuncOutputLog($DestinationPath + ": DestinationPath Invalid Param or Drive Not Mounted. Process Exit")
        exit
    }
    elseif(!(Test-Path $DestinationPath)){
        FuncOutputLog($DestinationPath + ": DestinationPath Not Exist, Directory Creating...")
        $CreatedDirectory = New-Item $DestinationPath -ItemType Directory
        FuncOutputLog($DestinationPath + ": CreateDirectory Completed, Created " + $CreatedDirectory)
    }

    FuncOutputLog("CheckParameter Completed")

}

#サービス停止
Function FuncStopServiceAndWait(){
    FuncOutputLog($ServiceName + ": Service Status Check...")

    if((Get-Service $ServiceName).Status -ne "Stopped"){
        FuncOutputLog($ServiceName + ": Service Not Stopped, Service Stopping...")

        Stop-Service -Name $ServiceName

        try{
            (Get-Service $ServiceName).WaitForStatus("Stopped", '00:00:30')
            FuncOutputLog($ServiceName + ": StopService Completed")

        }
        catch{
            FuncOutputLog($ServiceName + ": StopService Timeout, Process Exit")
            exit

        }

    }

    FuncOutputLog($ServiceName + ": Service Status Check OK, Service Stopped")

}

#アーカイブ作成
Function FuncCompressArchiveAndWait(){
    FuncOutputLog($SourcePath + ": CompressArchive Starting...")

    if((Get-Service $ServiceName).Status -eq "Stopped"){
        $Destinationfile = ((Convert-Path ($DestinationPath + "\")) + $ArchivefileName + (Get-Date -Format "_yyyyMMddHHmmss") + ".zip")

        Compress-Archive -Path $SourcePath -DestinationPath $Destinationfile `
         | Out-Null
        FuncOutputLog($SourcePath + ": CompressArchive Completed. Archive: " + $Destinationfile)

    }else{
        FuncOutputLog($ServiceName + ": Service Not Stopped, Process Exit")
        exit

    }
}

#サービス開始
Function FuncStartService(){
    FuncOutputLog($ServiceName + ": Service Starting...")

    Start-Service -Name $ServiceName

    try{
        (Get-Service $ServiceName).WaitForStatus("Running", '00:00:30')
        FuncOutputLog($ServiceName + ": StartService Completed")

    }
    catch{
        FuncOutputLog($ServiceName + ": StartService Timeout, Process Exit")

    }

}

#main
FuncCheckParameter | FuncStopServiceAndWait | FuncCompressArchiveAndWait | FuncStartService

リストアするときは、サービス停止してから、P4ROOTの中身をバックアップに差し替えればOKなはず...
まだユーザーデータの戻ししか試してないですが、とりあえずバックアップ・リストアはできそうです

当初タスクスケジューラからPC起動時に自動起動する想定で書き始めたのですが、
変更もないのに高頻度でバックアップするのは容量を無駄に食うだけなので
利用前や利用後に手動実行することになりそう...

以上です!

脚注
  1. 仮想アセットの参考情報 1)https://www.unrealengine.com/ja/tech-blog/virtual-assets-in-unreal-engine-5-1-smaller-faster-data-syncs 2)https://docs.unrealengine.com/5.1/ja/virtual-assets-in-unreal-engine/ ↩︎

  2. 無料提供についての参考情報 1)https://www.perforce.com/ja/zhipin/helix-core/muryo-no-bajon-kanri 2)https://www.toyo.co.jp/ss/products/detail/perforce ↩︎

  3. https://www.toyo.co.jp/files/user/img/product/ss/help/perforce/r19.1/manuals/p4sag/Content/P4SAG/DB5-31445.html 実際の設定値は要確認ですが...コマンド多すぎて調べるのが面倒... ↩︎

  4. SSLの参考情報 1)https://www.toyo.co.jp/files/user/img/product/ss/help/perforce/r19.1/manuals/p4guide/Content/P4Guide/security.ssl.html 2)https://dench.flatlib.jp/ue4/perforce#windows_の場合 ↩︎

  5. DBとUnicode規格の関係についての参考情報 (OracleDBですが参考にはなると思います) https://docs.oracle.com/cd/E57425_01/121/NLSPG/ch6unicode.htm ↩︎

  6. 削除条件に当てはまらないリソースが"p4diag_log.txt"以外なかったので、P4ROOTフォルダ内は全て削除してもいいかもです (要は丸々作り直したいわけなので) ↩︎

  7. パーミッションレベルの参考情報 https://www.toyo.co.jp/files/user/img/product/ss/help/perforce/r15.1/manuals/cmdref/p4_protect.html ↩︎

  8. "Connect to the server using my most recent(最後に使用した設定を使ってサーバに接続する)"ですが、どのプロジェクトファイルでも同様の直近の設定を参照するように読み取れたので選択しないでおきます ↩︎

  9. "Connect to the server using my Helix Core environment(PERFORCE環境設定を使用してサーバに接続する)"を選択するとP4Vの環境設定が使用されると思われます。設定はP4Vを起動して"Connection > Environment Settings..."から"Use current connection for encironment settings"を外して表示されるもの。なお、Workspace名が入っていない場合はそこにクライアント端末のホスト名が入るようで、その場合は接続できません ↩︎

Discussion