# ビルドプロセス中のカスタムスクリプトの実行

> Follow this workflow to run custom scripts before and after the build process.

Build Automation は、ユーザーが作成したビルド前とビルド後の両方のカスタムスクリプトをサポートします。カスタムスクリプトを使用するには、これらのスクリプトをソースリポジトリにチェックインし、ビルドの詳細設定でリポジトリのルートからのスクリプトへの相対パスを設定します。

> **Note:**
>
> **ノート**: 特に URL を指定してラインコマンドを実行する場合は、シェルスクリプトの改行コードを Unix に設定します。

## エクスポート前メソッドとエクスポート後メソッド##prerequisites

エクスポート前メソッドとエクスポート後メソッドを使用して、Unity プロジェクトがクラウドにビルドされる前後にアクションをトリガーします。これらのメソッドは、`Assets/Editor` フォルダー内のクラスに存在する必要があります。編集フォルダーがディレクトリにない場合は、ひとつ作成できます。

> **Important:**
>
> **重要**: `UnityEngine.CloudBuild.BuildManifestObject` クラスは、Build Automation で実行されている場合にのみ使用でき、ローカルでは使用できません。コードをローカルでコンパイルするには、エクスポート前メソッドとエクスポート後メソッドを #if UNITY\_CLOUD\_BUILD ブロックにラップします。ビルドターゲットの詳細設定で、エクスポート前メソッドとエクスポート後メソッドを設定できます。

## エクスポート前メソッド名##pre-export-and-post-export-methods

エクスポート前メソッドを使用するには、Unity プロジェクトに public の静的メソッドを作成します。このメソッドには、Unity エディターがプロジェクトをエクスポートする前と Unity エディターのスクリプトコンパイルフェーズ後に実行するコードが含まれています。

```cs
public static void PreExport()
```

Build Automation を有効にして、現在のビルドのビルドマニフェストをエクスポート前メソッドに渡すには、メソッドシグネチャにパラメーターとして `BuildManifestObject` オブジェクトを指定します。その後、プロジェクトまたは **プレイヤー** 設定を変更すると、プロジェクトをエクスポートできます。

```cs
public static void PreExport(UnityEngine.CloudBuild.BuildManifestObject manifest)
```

Unity Build Automation がメソッドを呼び出すと、`BuildManifestObject` オブジェクトが現在のビルドのビルドマニフェストとして `BuildManifestObject` を使用して任意のパラメーターとして渡されます。

## エクスポート後メソッド名##custom-scripting-define-directives

エクスポート後メソッドを使用するには、Unity プロジェクトに public 静的メソッドを作成します。このメソッドには、Unity エディターがプロジェクトをエクスポートした後に実行するコードが含まれています。

```cs
public static void PostExport(string exportPath)
```

Unity Build Automation がメソッドを呼び出すとき、文字列を渡します。

* iOS 以外のビルドターゲットの場合、文字列にはエクスポートされたプロジェクトへのパスが含まれます。
* **iOS** プロジェクトの場合、この文字列にはエクスポートされた Xcode プロジェクトへのパスが含まれます。パスを使用してエクスポートした Xcode プロジェクトを特定し、ビルドプロセスを完了するために Xcode を呼び出す前に追加の前処理を実行できます。
  > **Note:**
  >
  > **ノート**: コード内のメソッドに Unity [PostProcessBuildAttribute](https://docs.unity3d.com/ScriptReference/Callbacks.PostProcessBuildAttribute.html) というタグを付けると、それらのメソッドは、Unity Build Automation でエクスポート後メソッドとして構成されたメソッドよりも先に実行されます。

## カスタムスクリプト `#define` ディレクティブ##pre-build-and-post-build-scripts

Build Automation を使用して、カスタムスクリプト #define ディレクティブを作成できます。[Unity Dashboard](https://cloud.unity.com) で、ビルドターゲットの **Advanced settings** (詳細設定) に移動します。

**Scripting Define Symbols** (スクリプティング定義シンボル) フィールドでは、独自のカスタムスクリプト #define ディレクティブを、使用可能なビルトインの選択肢に追加できます。ビルドターゲットごとに、定義するシンボルの名前を入力します。これらのシンボルは、ビルトインのシンボルと同様に、 #if ディレクティブの条件として使用できます。詳細は、[条件付きコンパイル](https://docs.unity3d.com/Manual/PlatformDependentCompilation.html) を参照してください。

## ノードバージョンの変更##source-profile

NVM はビルドマシンにインストールされ、ビルドプロセス中に別のノードバージョンに切り替えることができます。以下のサンプルスクリプトは、Node 16.13.0 にインストールと切り替えを行います。

```sh
#!/usr/bin/env bash

## Source profile##install-nvm-modules-and-set-version
. ~/.profile

## Install NVM modules and set version##output-node-version-used
nvm install 16.13.0
nvm use 16.13.0

## Output Node version used##source-profile
node -v

exit 0
```

## 他の Ruby バージョンの使用

`RVM` と `gem` はビルドマシンにインストールされ、ビルドプロセス中に異なるバージョンの Ruby を使用できます。以下のサンプルスクリプトは、Ruby 3.3.0 をインストールし、`DO` を使用してコマンドを実行するため、UBA ツールによって使用されるシステムの Ruby のインストールに影響しません。

```sh
#!/usr/bin/env bash

## Source profile
rvm install ruby-3.3.0
rvm ruby-3.3.0 do gem install fastlane
rvm ruby-3.3.0 do fastlane --help

exit 0
```

> **Note:**
>
> **ノート**: macOS Ventura でビルドを実行する場合、特定の OpenSSL バージョンを使用するには以下のコマンドを使用する必要があります。

```sh
rvm install ruby-3.3.0 --with-openssl-dir=$(brew --prefix openssl@1.1)
```

> **Note:**
>
> **ノート**: Ruby システムの Ruby バージョンを `rvm use NEW_RUBY_VERSION` で変更し、自己責任で行うことは推奨されません。

## 環境変数の設定

```sh
echo "{environment_variable_name}={value}" >> "$DEVOPS_ENV"
```

Unity ビルドとビルド後スクリプトで環境変数を使用できるようにするには、環境変数を定義または更新し、この値を `DEVOPS_ENV` 環境ファイルに書き込みます。環境変数を作成または更新するスクリプトは新しい値にアクセスできませんが、後続のすべてのプロセスにはアクセスできます。環境変数名は、指定した名前の大文字バージョンとして保存されます (`testenv` は `TESTENV` になります)。1 行の環境変数のみがサポートされます。

### `DEVOPS_ENV` への環境変数の書き込み例##pre-export-method-name

ビルド前スクリプトで環境変数を設定します。

```sh
echo "TEST_ENV=Sample environment variable" >> $DEVOPS_ENV
```

その後、ビルド後スクリプトで環境変数をエコーします。

```sh
echo $TEST_ENV
```

## ビルド後スクリプトでのビルドアーティファクトへのアクセス

ビルドアーティファクトにアクセスしてストアフロントに自動アップロードしたり、ビルド後スクリプトを使用してビルドプロセスの一部を自動化することができます。ビルド後スクリプトで環境変数を使用してパスを Windows 実行ファイルに渡す場合は、cygwin パスを使用する必要があります。

### プレイヤーへのパスを取得するサンプルスクリプト##post-export-method-name

```sh
#!/bin/bash

#This is a sample that will simply output the path to the build artifact

echo "START"

PLAYER_PATH=$UNITY_PLAYER_PATH

#If we are using a Windows Builder and using the path to pass it to a native Windows application, we need to properly convert the cygwin player path to windows format

if [[ "$BUILDER_OS" == "WINDOWS" ]]; then
PLAYER_PATH=$(cygpath -wa "$UNITY_PLAYER_PATH")
fi

echo "$PLAYER_PATH"
```

## ログのマスク値

値をマスキングすると、文字列や変数がログに出力されなくなります。マスクされた各値は、値の内容に関係なく `*****` に置き換えられます。マスクコマンドに環境変数または Raw 値を渡すことができます。

文字列または環境変数をマスクするには、`::mask-value::` コマンドを使用します。

```text
echo "::mask-value::{value}"
```

### 例: 値のマスキング##change-node-versions

値 `"SuperS3cretPassword!"` をマスクするには、 値に `::mask-value::` コマンドを設定します。

```text
echo "::mask-value::SuperS3cretPassword!"
```

これがログに出力されると、出力は `"*****"` として表示されます。

> **Warning:**
>
> ログに出力する前に、値を "マスク値" に登録する必要があります。

### 例: 変数のマスキング##use-other-ruby-versions

変数 `DB_PASSWORD` または変数値 `"SuperS3cretPassword!"` をマスクするには、変数に `::mask-value::` コマンドを設定します。

```text
DB_PASSWORD=SuperS3cretPassword!
echo "::mask-value::$DB_PASSWORD"
```

これらのいずれかがログに出力されると、出力は `"*****"` として表示されます。

### 例: 環境変数のマスキング##set-environment-variables

`$DEVOPS_ENV` で設定された環境変数はマスクできます。環境変数の値を設定し、マスクしてから、他のスクリプトで使用するために値を `$DEVOPS_ENV` ファイルに出力します。

```text
DB_PASSWORD=SuperS3cretPassword!
echo "::mask-value::$DB_PASSWORD"
echo "DB_PASSWORD=$DB_PASSWORD" >> $DEVOPS_ENV
```
