diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index dd61a67a..aed34d8e 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -9,44 +9,44 @@ jobs: name: Code formatting runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 with: node-version: 18 - - uses: c-hive/gha-yarn-cache@v2 + cache: 'yarn' - run: yarn - run: yarn verify:formatting codeStyles: name: Code styles runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 with: node-version: 18 - - uses: c-hive/gha-yarn-cache@v2 + cache: 'yarn' - run: yarn - run: yarn verify:code-styles types: name: Types check runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 with: node-version: 18 - - uses: c-hive/gha-yarn-cache@v2 + cache: 'yarn' - run: yarn - run: yarn typecheck tests: name: Tests runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 with: node-version: 18 - - uses: c-hive/gha-yarn-cache@v2 + cache: 'yarn' - run: yarn - run: yarn test --coverage - run: bash <(curl -s https://codecov.io/bash) diff --git a/.github/workflows/firebase-hosting-merge.yml b/.github/workflows/firebase-hosting-merge.yml index b8b5f0bc..1d638de5 100644 --- a/.github/workflows/firebase-hosting-merge.yml +++ b/.github/workflows/firebase-hosting-merge.yml @@ -11,10 +11,10 @@ jobs: runs-on: ubuntu-latest steps: # Checkout - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 # Build - - uses: actions/setup-node@v3 + - uses: actions/setup-node@v4 with: node-version: 18 cache: yarn diff --git a/.github/workflows/firebase-hosting-pull-request.yml b/.github/workflows/firebase-hosting-pull-request.yml index 9b9a6d75..9aee3c78 100644 --- a/.github/workflows/firebase-hosting-pull-request.yml +++ b/.github/workflows/firebase-hosting-pull-request.yml @@ -9,10 +9,10 @@ jobs: runs-on: ubuntu-latest steps: # Checkout - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 # Build - - uses: actions/setup-node@v3 + - uses: actions/setup-node@v4 with: node-version: 18 cache: yarn diff --git a/.github/workflows/search-trigger.yml b/.github/workflows/search-trigger.yml index a2828301..615cd1ba 100644 --- a/.github/workflows/search-trigger.yml +++ b/.github/workflows/search-trigger.yml @@ -6,7 +6,7 @@ jobs: name: Update search index runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: darrenjennings/algolia-docsearch-action@da2ed379c147b356d60dbfec68bdcfacb2791a98 with: algolia_application_id: 'E57FOT37U9' diff --git a/docs/03-github-cloud-runner/03-examples/02-github-examples/02-aws.mdx b/docs/03-github-cloud-runner/03-examples/02-github-examples/02-aws.mdx index 2317f92f..8bafa486 100644 --- a/docs/03-github-cloud-runner/03-examples/02-github-examples/02-aws.mdx +++ b/docs/03-github-cloud-runner/03-examples/02-github-examples/02-aws.mdx @@ -17,7 +17,7 @@ If you're using GitHub you can use a GitHub Action: ```yaml - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@v1 + uses: aws-actions/configure-aws-credentials@v4 with: aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} diff --git a/docs/03-github/01-getting-started.mdx b/docs/03-github/01-getting-started.mdx index f0cf99e6..db490d58 100644 --- a/docs/03-github/01-getting-started.mdx +++ b/docs/03-github/01-getting-started.mdx @@ -77,7 +77,7 @@ jobs: steps: # Checkout - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: lfs: true @@ -91,7 +91,7 @@ jobs: # Test - name: Run tests - uses: game-ci/unity-test-runner@v3 + uses: game-ci/unity-test-runner@v4 env: UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }} with: @@ -99,7 +99,7 @@ jobs: # Build - name: Build project - uses: game-ci/unity-builder@v3 + uses: game-ci/unity-builder@v4 env: UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }} UNITY_EMAIL: ${{ secrets.UNITY_EMAIL }} @@ -132,7 +132,7 @@ jobs: steps: # Checkout (without LFS) - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 # Git LFS - name: Create LFS file list @@ -161,7 +161,7 @@ jobs: # Test - name: Run tests - uses: game-ci/unity-test-runner@v3 + uses: game-ci/unity-test-runner@v4 env: UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }} with: @@ -169,7 +169,7 @@ jobs: # Build - name: Build project - uses: game-ci/unity-builder@v3 + uses: game-ci/unity-builder@v4 env: UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }} UNITY_EMAIL: ${{ secrets.UNITY_EMAIL }} @@ -202,7 +202,7 @@ jobs: steps: # Checkout - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: lfs: true @@ -216,7 +216,7 @@ jobs: # Test - name: Run tests - uses: game-ci/unity-test-runner@v3 + uses: game-ci/unity-test-runner@v4 env: UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }} with: @@ -228,7 +228,7 @@ jobs: steps: # Checkout - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: lfs: true @@ -242,7 +242,7 @@ jobs: # Build - name: Build project - uses: game-ci/unity-builder@v3 + uses: game-ci/unity-builder@v4 env: UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }} UNITY_EMAIL: ${{ secrets.UNITY_EMAIL }} @@ -294,7 +294,7 @@ jobs: - Android # Build an Android player. - WebGL # WebGL. steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 lfs: true @@ -308,7 +308,7 @@ jobs: Library-${{ matrix.projectPath }}-${{ matrix.targetPlatform }}- Library-${{ matrix.projectPath }}- Library- - - uses: game-ci/unity-test-runner@v3 + - uses: game-ci/unity-test-runner@v4 id: testRunner env: UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }} @@ -323,7 +323,7 @@ jobs: path: ${{ steps.testRunner.outputs.artifactsPath }} - if: matrix.targetPlatform == 'Android' uses: jlumbroso/free-disk-space@v1.2.0 - - uses: game-ci/unity-builder@v3 + - uses: game-ci/unity-builder@v4 env: UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }} UNITY_EMAIL: ${{ secrets.UNITY_EMAIL }} @@ -340,7 +340,7 @@ jobs: buildForWindowsBasedPlatforms: name: Build for ${{ matrix.targetPlatform }} - runs-on: windows-2019 + runs-on: windows-2022 strategy: fail-fast: false matrix: @@ -356,7 +356,7 @@ jobs: - WSAPlayer # Build a UWP App. steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 lfs: true @@ -370,7 +370,7 @@ jobs: Library-${{ matrix.projectPath }}-${{ matrix.targetPlatform }}- Library-${{ matrix.projectPath }}- Library- - - uses: game-ci/unity-builder@v3 + - uses: game-ci/unity-builder@v4 env: UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }} UNITY_EMAIL: ${{ secrets.UNITY_EMAIL }} @@ -400,7 +400,7 @@ jobs: - StandaloneOSX # Build a macOS standalone. steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 lfs: true @@ -416,7 +416,7 @@ jobs: Library-${{ matrix.projectPath }}- Library- - - uses: game-ci/unity-builder@v3 + - uses: game-ci/unity-builder@v4 env: UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }} UNITY_EMAIL: ${{ secrets.UNITY_EMAIL }} diff --git a/docs/03-github/02-activation.mdx b/docs/03-github/02-activation.mdx index f75816d1..ba358904 100644 --- a/docs/03-github/02-activation.mdx +++ b/docs/03-github/02-activation.mdx @@ -17,96 +17,43 @@ Follow these steps if you are using a free version of Unity. #### Mental model -1. Request an activation file for usage on GitHub -2. Use that file to acquire a license -3. Set the license as a secret +1. Activate a license for use on Github via a local machine +2. Set the license as a secret -#### About the activation file +#### Activating a license file -You may use the -[Unity - Request Activation File](https://github.com/marketplace/actions/unity-request-activation-file) -action with the below instructions. +1. Install [Unity Hub](https://unity.com/download) on your local machine. +2. Log into Unity Hub with the Unity account that you are using for CI. Make sure you log into the + correct account or you may not activate the correct license. +3. When prompted, activate your personal license. If you are not prompted, go to `Unity Hub` > + `Preferences` > `Licenses` > `Add` and choose `Get a free personal license`. You do not need to + install an editor on your local machine. +4. Depending on the host you are using, find the `.ulf` file which is your Unity license in the + following paths: -The activation file uses machine identifiers so you cannot perform this step locally. + - Windows: `C:\ProgramData\Unity\Unity_lic.ulf` + - Mac: `/Library/Application Support/Unity/Unity_lic.ulf` + - Linux: `~/.local/share/unity3d/Unity/Unity_lic.ulf` -Let's go! + If you have issues locating the file, ensure you've logged into Unity Hub AND activated your + license. Otherwise the file will not be present. Keep in mind these folders might be hidden by + default, you may need to reveal hidden files to see them. -#### Acquiring an activation file + > **Note:** The host platform you use to activate the license does not matter. You only need to + > get the ulf from the platform that is most convenient to you. For example, using Windows to + > activate your license and building on Ubuntu on Github is perfectly fine. -Create a file called `.github/workflows/activation.yml` and add the below workflow definition to it: - -```yaml -name: Acquire activation file -on: - workflow_dispatch: {} -jobs: - activation: - name: Request manual activation file 🔑 - runs-on: ubuntu-latest - steps: - # Request manual activation file - - name: Request manual activation file - id: getManualLicenseFile - uses: game-ci/unity-request-activation-file@v2 - # Upload artifact (Unity_v20XX.X.XXXX.alf) - - name: Expose as artifact - uses: actions/upload-artifact@v2 - with: - name: ${{ steps.getManualLicenseFile.outputs.filePath }} - path: ${{ steps.getManualLicenseFile.outputs.filePath }} -``` - -Commit and push your workflow definition. - -#### Converting into a license - -:::caution - -**Unity no longer supports manual activation of Personal licenses** - -When activating your Personal Unity license, you may encounter an issue where only the "Unity Pro or -Plus" option is available, preventing the activation of a Personal license. Here is a workaround to -resolve this: - -1. Visit [license.unity3d.com](https://license.unity3d.com/manual) and upload the - `Unity_v20XX.X.XXXX.alf` file. -2. On the "Activate your license" page, if the "Personal" option is not available, right-click on - the page and choose "Inspect" to open the browser's developer tools. -3. Find the line of HTML that looks like this: - `
` on your local machine and repeat the `config.vdf`
+ encoding and replace secret `STEAM_CONFIG_VDF` with its contents.
+
+If your builder account uses MFA through the Steam Guard App, the `steam-deploy` app can use a TOTP
+instead of the above configuration. Generating a TOTP is outside the scope of this guide, as it is
+simpler to follow the above steps.
+
+### 5. Additional Configuration
+
+You can configure these to better match your use case.
+
+#### totp
+
+Deploys to Steam using a TOTP. If this is passed, `configVdf` is not required.
+
+#### buildDescription
+
+The identifier for this specific build, which helps you identify it in steam.
+
+It is recommended to use the semantic version of the build for this.
+
+#### rootPath
+
+The root path to your builds. This is the base of which depots will search your files.
+
+#### depot[X]Path
+
+Where X is any number between 1 and 9 (inclusive both).
+
+The relative path following your root path for the files to be included in this depot.
+
+If your appId is 125000 then the depots 125001 ... 125009 will be assumed.
+
+#### firstDepotIdOverride
+
+You can use this to override the ID of the first depot in case the IDs do not start as described in
+depot[X]Path (e.g. for DLCs).
+
+If your firstDepotId is 125000 then, regardless of the used appId, the depots 125000 ... 125008 will
+be assumed.
+
+#### releaseBranch
+
+The branch within steam that this build will be automatically put live on.
+
+Note that the `default` branch
+[has been observed to not work](https://github.com/game-ci/steam-deploy/issues/19) as a release
+branch, presumably because it is potentially dangerous.
diff --git a/versioned_docs/version-3/03-github/_category_.yaml b/versioned_docs/version-3/03-github/_category_.yaml
new file mode 100644
index 00000000..0ac25ea3
--- /dev/null
+++ b/versioned_docs/version-3/03-github/_category_.yaml
@@ -0,0 +1,5 @@
+---
+position: 3.0
+label: GitHub (Default)
+collapsible: true
+collapsed: true
diff --git a/versioned_docs/version-3/05-gitlab/01-getting-started.mdx b/versioned_docs/version-3/05-gitlab/01-getting-started.mdx
new file mode 100644
index 00000000..7277fda5
--- /dev/null
+++ b/versioned_docs/version-3/05-gitlab/01-getting-started.mdx
@@ -0,0 +1,76 @@
+import Video from '../../../src/components/video/video';
+
+# Getting started
+
+This guide will demonstrate how to setup build and test automation for your Unity project hosted on
+gitlab using gitlab-ci.
+
+## Overall steps
+
+1. Understand how [gitlab-ci](https://docs.gitlab.com/ce/ci/) works.
+2. Configure a license for Unity.
+3. Add build scripts and integrations in your Unity project
+4. Set up a gitlab-ci pipeline for your project.
+5. Result: Accept merge requests with more confidence.
+
+## First time using Gitlab CI?
+
+Read the official documentation about
+[Getting started with GitLab CI/CD](https://docs.gitlab.com/ce/ci/quick_start/).
+
+Any subsequent steps assume you have read the above.
+
+## Supported versions
+
+The [unity3d-gitlab-ci-example project](https://gitlab.com/game-ci/unity3d-gitlab-ci-example/) is
+based on [unity3d](https://github.com/game-ci/docker/) docker images from
+[game-ci](https://github.com/game-ci). Any version in the
+[docker hub `unityci/editor` tags list](https://hub.docker.com/r/unityci/editor/tags) can be used to
+test and build projects.
+
+It's generally considered good practice to use the same Unity version for your CI/CD setup as you do
+to develop your project.
+
+## Video tutorial
+
+
+
+## Setting up gitlab-ci for your Unity project
+
+### I don't have a Unity project yet
+
+1. Fork
+ [the unity3d-gitlab-ci-example project](https://gitlab.com/game-ci/unity3d-gitlab-ci-example/)
+1. Clone the fork you just created locally
+1. Continue to activation instructions
+
+### I already have my own Unity project
+
+1. Clone
+ [the unity3d-gitlab-ci-example project](https://gitlab.com/game-ci/unity3d-gitlab-ci-example/)
+1. Copy
+ [`.gitlab-ci.yml`](https://gitlab.com/game-ci/unity3d-gitlab-ci-example/-/blob/main/.gitlab-ci.yml)
+ to the root of your repository,
+ [`Assets/Scripts/Editor/BuildCommand.cs`](https://gitlab.com/game-ci/unity3d-gitlab-ci-example/-/blob/main/Assets/Scripts/Editor/BuildCommand.cs)
+ and [`ci` folder](https://gitlab.com/game-ci/unity3d-gitlab-ci-example/-/blob/main/ci) to your
+ project:
+
+Assuming you've cloned the example project in the parent folder of your project, and your Unity
+project is at the root of your repository, execute these commands from the root folder of your
+project:
+
+```bash
+mkdir -p Assets/Scripts/Editor/
+cp ../unity3d-gitlab-ci-example/.gitlab-ci.yml ./
+cp -r ../unity3d-gitlab-ci-example/ci ./
+cp ../unity3d-gitlab-ci-example/Assets/Scripts/Editor/BuildCommand.cs ./Assets/Scripts/Editor/
+```
+
+1. Open and edit the
+ [`.gitlab-ci.yml`](https://gitlab.com/game-ci/unity3d-gitlab-ci-example/-/blob/main/.gitlab-ci.yml)
+ you copied to your project and update
+ [the variables](https://gitlab.com/game-ci/unity3d-gitlab-ci-example/-/blob/main/.gitlab-ci.yml#L7-13)
+ with the versions you need. Your Unity project version can be found in
+ `ProjectSettings/ProjectVersion.txt`.
+1. If your Unity project is not at the root of your repository, also update UNITY_DIR variable.
+1. Continue to activation instructions
diff --git a/versioned_docs/version-3/05-gitlab/02-activation.mdx b/versioned_docs/version-3/05-gitlab/02-activation.mdx
new file mode 100644
index 00000000..4ed4521f
--- /dev/null
+++ b/versioned_docs/version-3/05-gitlab/02-activation.mdx
@@ -0,0 +1,193 @@
+# Activation
+
+There are a few methods available, if you're using gitlab-ci, the easiest method in the current
+documentation is using gitlab-ci.
+
+:::caution Known issue with Unity activation on gitlab-ci: empty license file
+
+If you are having troubles with Unity activation with gitlab-ci, there is currently an issue with
+recent Unity versions preventing us to retrieve a license file with actual content.
+
+For more details see the
+[following issue: get-activation-file succeeding but giving a 0kb file. Unity Version 2021.2.7f1](https://gitlab.com/game-ci/unity3d-gitlab-ci-example/-/issues/171)
+and
+[the workaround](https://gitlab.com/game-ci/unity3d-gitlab-ci-example/-/issues/171#note_974622879).
+
+Don't hesitate to contribute and implement a fix 💝
+
+:::
+
+:::info Having issues with activation?
+
+Have a look at the [troubleshooting / common issues][common-issues] page.
+
+:::
+
+## Unity Personal
+
+### a. Using gitlab-ci
+
+Once you've added all required files to your project (mainly
+[`.gitlab-ci.yml`](https://gitlab.com/game-ci/unity3d-gitlab-ci-example/-/blob/main/.gitlab-ci.yml)),
+there should be a manual step that can be triggered for activation.
+
+1. Visit your project's settings > CI/CD > Variables and add `UNITY_USERNAME` and `UNITY_PASSWORD`
+ with your credentials. Make sure to use your Unity3d _email address_ for `UNITY_USERNAME`.
+1. Push your first commit to your project and visit CI/CD Pipelines.
+1. Locate your latest job, there should be a `play` button, click on it and click
+ `get-activation-file`
+1. Wait for the job to run and follow instructions in the console
+
+:::caution
+
+**Unity no longer supports manual activation of Personal licenses**
+
+When activating your Personal Unity license, you may encounter an issue where only the "Unity Pro or
+Plus" option is available, preventing the activation of a Personal license. Here is a workaround to
+resolve this:
+
+1. Visit [license.unity3d.com](https://license.unity3d.com/manual) and upload the
+ `Unity_v20XX.X.XXXX.alf` file.
+2. On the "Activate your license" page, if the "Personal" option is not available, right-click on
+ the page and choose "Inspect" to open the browser's developer tools.
+3. Find the line of HTML that looks like this:
+ ``.
+4. Delete `display: none;` from the `style` attribute to make the "Personal" option visible.
+5. Now you should be able to select the "Personal" option and proceed with the activation.
+
+You can discuss this issue or find additional assistance in the
+[related Discord conversation](https://discord.com/channels/710946343828455455/1138586951604248666)
+or [GitHub ticket](https://github.com/game-ci/documentation/issues/408).
+
+_For future reference, activating a license from the command line as documented on
+[Unity's Manual Page](https://docs.unity3d.com/Manual/ManagingYourUnityLicense.html) might be an
+alternative solution._
+
+:::
+
+### b. Locally
+
+All you need is [docker](https://www.docker.com/) installed on your machine.
+
+1. Clone [this project](https://gitlab.com/game-ci/unity3d-gitlab-ci-example)
+2. Pull the docker image and run bash inside, passing Unity username and password to env
+
+ _hint: you should write this to a shell script and execute the shell script so you don't have
+ your credentials stored in your bash history_. Also make sure you use your Unity3d _email
+ address_ for `UNITY_USERNAME` env var.
+
+ ```bash
+ UNITY_VERSION=2020.1.11f1
+ IMAGE=unityci/editor # https://hub.docker.com/r/unityci/editor
+ IMAGE_VERSION=0.12 # https://github.com/game-ci/docker/releases
+ DOCKER_IMAGE=$IMAGE:$UNITY_VERSION-base-$IMAGE_VERSION
+
+ docker run -it --rm \
+ -e "UNITY_USERNAME=username@example.com" \
+ -e "UNITY_PASSWORD=example_password" \
+ -e "TEST_PLATFORM=linux" \
+ -e "WORKDIR=/root/project" \
+ -v "$(pwd):/root/project" \
+ $DOCKER_IMAGE \
+ bash
+ ```
+
+ If your password contains a `!`, you can escape it like this (`example_pass!word`):
+
+ ```bash
+ ...
+ -e "UNITY_PASSWORD=example_pass"'!'"word" \
+ ...
+ ```
+
+3. In Unity docker container's bash, run once like this, it will try to activate
+
+ ```bash
+ xvfb-run --auto-servernum --server-args='-screen 0 640x480x24' \
+ unity-editor \
+ -logFile /dev/stdout \
+ -batchmode \
+ -nographics \
+ -username "$UNITY_USERNAME" -password "$UNITY_PASSWORD"
+ ```
+
+4. Wait for output that looks like this:
+
+ ```
+ LICENSE SYSTEM [2017723 8:6:38] Posting en [...]
+ ```
+
+ If you get the following error:
+
+ > Can't activate Unity: No sufficient permissions while processing request HTTP error code 401
+
+ Make sure your credentials are valid. You may try to disable 2FA in your account and try again.
+ Once done, you should enable 2FA again for security reasons. See
+ [#11](https://gitlab.com/game-ci/unity3d-gitlab-ci-example/issues/11) for more details.
+
+5. Copy xml content and save as `unity3d.alf`
+6. Open https://license.unity3d.com/manual and answer questions
+7. Upload `unity3d.alf` for manual activation
+8. Download `Unity_v2018.x.ulf` (`Unity_v2019.x.ulf` for 2019 versions)
+9. Copy the content of `Unity_v2018.x.ulf` license file to your CI's environment variable
+ `UNITY_LICENSE`. _Note: if you are doing this on Windows, chances are the
+ [line endings will be wrong as explained here](https://gitlab.com/game-ci/unity3d-gitlab-ci-example/issues/5#note_95831816).
+ Luckily for you,
+ [`.gitlab-ci.yml`](https://github.com/game-ci/unity3d-ci-example/blob/main/.gitlab-ci.yml) of the
+ example project solves this by removing `\r` character from the ENV variable so you'll be
+ alright_
+ [`.gitlab-ci.yml`](https://gitlab.com/game-ci/unity3d-gitlab-ci-example/-/blob/main/.gitlab-ci.yml)
+ will then place the `UNITY_LICENSE` to the right place before running tests or creating the
+ builds.
+
+## Unity Plus/Pro
+
+1. Clone [this project](https://gitlab.com/game-ci/unity3d-gitlab-ci-example)
+2. Pull the docker image and run bash inside, passing Unity username and password to env
+
+ _hint: you should write this to a shell script and execute the shell script so you don't have
+ your credentials stored in your bash history_. Also make sure you use your Unity3d _email
+ address_ for `UNITY_USERNAME` env var.
+
+ ```bash
+ UNITY_VERSION=2020.1.11f1
+ IMAGE=unityci/editor # https://hub.docker.com/r/unityci/editor
+ IMAGE_VERSION=0.12 # https://github.com/game-ci/docker/releases
+ DOCKER_IMAGE=$IMAGE:$UNITY_VERSION-base-$IMAGE_VERSION
+
+ docker run -it --rm \
+ -e "UNITY_USERNAME=username@example.com" \
+ -e "UNITY_PASSWORD=example_password" \
+ -e "UNITY_SERIAL=AN-EXAM-PLE-SERIA-LKEY-1234" \
+ -e "TEST_PLATFORM=linux" \
+ -e "WORKDIR=/root/project" \
+ -v "$(pwd):/root/project" \
+ $DOCKER_IMAGE \
+ bash
+ ```
+
+3. In Unity docker container's bash, run once like this, it will try to activate
+
+ ```bash
+ xvfb-run --auto-servernum --server-args='-screen 0 640x480x24' \
+ unity-editor \
+ -logFile /dev/stdout \
+ -batchmode \
+ -nographics \
+ -username "$UNITY_USERNAME" -password "$UNITY_PASSWORD" -serial "$UNITY_SERIAL"
+ ```
+
+4. Wait for the command to finish without errors
+5. Obtain the contents of the license file by running
+ `cat /root/.local/share/unity3d/Unity/Unity_lic.ulf`
+6. Copy the content to your CI's environment variable `UNITY_LICENSE`. _Note: if you are doing this
+ on windows, chances are the
+ [line endings will be wrong as explained here](https://gitlab.com/game-ci/unity3d-gitlab-ci-example/issues/5#note_95831816).
+ Luckily for you,
+ [`.gitlab-ci.yml`](https://gitlab.com/game-ci/unity3d-gitlab-ci-example/-/blob/main/.gitlab-ci.yml)
+ solves this by removing `\r` character from the env variable so you'll be alright_
+ [`.gitlab-ci.yml`](https://gitlab.com/game-ci/unity3d-gitlab-ci-example/-/blob/main/.gitlab-ci.yml)
+ will then place the `UNITY_LICENSE` to the right place before running tests or creating the
+ builds.
+
+[common-issues]: /docs/troubleshooting/common-issues
diff --git a/versioned_docs/version-3/05-gitlab/03-example-project.mdx b/versioned_docs/version-3/05-gitlab/03-example-project.mdx
new file mode 100644
index 00000000..3b7c3db5
--- /dev/null
+++ b/versioned_docs/version-3/05-gitlab/03-example-project.mdx
@@ -0,0 +1,50 @@
+# Example Project
+
+## About
+
+[The `unity3d-gitlab-ci-example` project](https://gitlab.com/game-ci/unity3d-gitlab-ci-example/)
+uses an updated version of the
+[Unity's Creator Kit: RPG free asset](https://assetstore.unity.com/packages/templates/tutorials/creator-kit-rpg-149309)
+which is not affiliated with this project at all. Feel free to explore it, dialogs are a bit
+different ;)
+
+The example project is a Proof of Concept to **run unity3d tests and builds inside a CI** using
+**[game-ci/docker unity editor docker images](https://github.com/game-ci/docker)**. It currently
+creates builds for Windows, Linux, macOS, webgl, Linux IL2cpp, Android and iOS Xcode project. The
+webgl build is published by the CI to [gitlab-pages](https://about.gitlab.com/features/pages/).
+**You can try the built project on
+[the published gitlab-pages](https://game-ci.gitlab.io/unity3d-gitlab-ci-example/)**.
+
+## Git remotes
+
+[The `unity3d-gitlab-ci-example` project](https://gitlab.com/game-ci/unity3d-gitlab-ci-example/) is
+hosted on multiple remotes to provide examples for
+[Gitlab-CI](https://about.gitlab.com/product/continuous-integration/),
+[Travis CI](https://travis-ci.org/) and [CircleCI](https://circleci.com/)
+
+- [github](https://github.com/game-ci/unity3d-ci-example)
+- [gitlab](https://gitlab.com/game-ci/unity3d-gitlab-ci-example)
+
+## How to run scripts locally
+
+You can execute the local scripts and specify the path of your Unity executable using
+`UNITY_EXECUTABLE`. You may try this in your project before you setup the whole CI, so you confirm
+it works with your current unity version 👍.
+
+## Test
+
+[`./local_test.sh`](https://gitlab.com/game-ci/unity3d-gitlab-ci-example/-/blob/main/local_test.sh)
+
+```bash
+UNITY_EXECUTABLE="/Applications/Unity/Hub/Editor/2019.3.7f1/Unity.app/Contents/MacOS/Unity" \
+ ./local_test.sh
+```
+
+## Build
+
+[`./local_build.sh`](https://gitlab.com/game-ci/unity3d-gitlab-ci-example/-/blob/main/local_build.sh)
+
+```bash
+UNITY_EXECUTABLE="/Applications/Unity/Hub/Editor/2019.3.7f1/Unity.app/Contents/MacOS/Unity" \
+ ./local_build.sh
+```
diff --git a/versioned_docs/version-3/05-gitlab/04-custom-build-options.mdx b/versioned_docs/version-3/05-gitlab/04-custom-build-options.mdx
new file mode 100644
index 00000000..82e66314
--- /dev/null
+++ b/versioned_docs/version-3/05-gitlab/04-custom-build-options.mdx
@@ -0,0 +1,46 @@
+# Custom build options
+
+First, you need to understand how build options are passed to the build.
+
+## Build command
+
+See
+[Assets/Scripts/Editor/BuildCommand.cs](https://gitlab.com/game-ci/unity3d-gitlab-ci-example/-/blob/main/Assets/Scripts/Editor/BuildCommand.cs).
+
+This is the script used during `Unity` command line execution. It is passed to the
+[`-executeMethod ` command line parameter](https://docs.unity3d.com/Manual/CommandLineArguments.html)
+like this:
+
+```bash
+unity-editor \
+ # ...
+ -executeMethod BuildCommand.PerformBuild \
+ # ...
+```
+
+You need to have this file in your project in order to build your project in the CI.
+
+### Workflow file
+
+See
+[.gitlab-ci.yml](https://gitlab.com/game-ci/unity3d-gitlab-ci-example/-/blob/main/.gitlab-ci.yml).
+
+You can add `BuildOptions` per target by adding environment variable `BuildOptions`.
+
+```yaml
+build-ios-xcode:
+ <<: *build
+ image: $IMAGE:$UNITY_VERSION-ios-$IMAGE_VERSION
+ variables:
+ BUILD_TARGET: iOS
+ BuildOptions: AcceptExternalModificationsToPlayer
+```
+
+If you would like to use several `BuildOptions`, you have to separate all values by `,`:
+
+```yaml
+BuildOptions: AcceptExternalModificationsToPlayer,CompressTextures,ConnectToHost
+```
+
+See [Unity3d `BuildOptions` reference](https://docs.unity3d.com/ScriptReference/BuildOptions.html)
+for allowed values.
diff --git a/versioned_docs/version-3/05-gitlab/05-tests.mdx b/versioned_docs/version-3/05-gitlab/05-tests.mdx
new file mode 100644
index 00000000..849e9769
--- /dev/null
+++ b/versioned_docs/version-3/05-gitlab/05-tests.mdx
@@ -0,0 +1,19 @@
+# Tests
+
+## Unity Tests
+
+Unity supports two kinds of tests (`editmode` and `playmode`). The example project supports both.
+More information and documentation concerning Unity tests can be found here:
+[Unity Test Framework](https://docs.unity3d.com/Packages/com.unity.test-framework@1.1/manual/index.html)
+
+## Example Project Test files
+
+Tests can be found here:
+
+- [`editmode` tests in `Assets/Scripts/Editor/EditModeTests`](https://gitlab.com/game-ci/unity3d-gitlab-ci-example/-/blob/main/Assets/Scripts/Editor/EditModeTests)
+- [`playmode` tests in `Assets/Tests/`](https://gitlab.com/game-ci/unity3d-gitlab-ci-example/-/blob/main/Assets/Tests/)
+
+## Code coverage support
+
+This was implemented here in the example project:
+[unity3d-gitlab-ci-example!42](https://gitlab.com/game-ci/unity3d-gitlab-ci-example/-/merge_requests/42)
diff --git a/versioned_docs/version-3/05-gitlab/06-deployment/_category_.yaml b/versioned_docs/version-3/05-gitlab/06-deployment/_category_.yaml
new file mode 100644
index 00000000..f74a60fd
--- /dev/null
+++ b/versioned_docs/version-3/05-gitlab/06-deployment/_category_.yaml
@@ -0,0 +1,5 @@
+---
+position: 6.0
+label: Deployment
+collapsible: true
+collapsed: true
diff --git a/versioned_docs/version-3/05-gitlab/06-deployment/android.mdx b/versioned_docs/version-3/05-gitlab/06-deployment/android.mdx
new file mode 100644
index 00000000..7c697057
--- /dev/null
+++ b/versioned_docs/version-3/05-gitlab/06-deployment/android.mdx
@@ -0,0 +1,91 @@
+# Android
+
+Before `2018.4.8f1` for 2018 versions and before `2019.2.4f1` for 2019 versions, you will need a
+specific Unity license (because that is not the same docker image). Add the content of your specific
+Unity license in your CI's environment variable : `UNITY_LICENSE_CONTENT_ANDROID`. _This is not
+required anymore now that images share a base image
+[See related change](https://gitlab.com/game-ci/unity3d/merge_requests/63)_
+
+By default the apk is not signed and the build will use the Unity's default debug key. For _security
+reasons_, **you should not add your keystore to git**.
+
+## Encode your keystore
+
+Encode your keystore file as base64 using openssl:
+
+```bash
+openssl base64 -A -in yourKeystore.keystore
+```
+
+Copy the result to your CI's environment variable `ANDROID_KEYSTORE_BASE64`
+
+Add following environment variables:
+
+- `KEYSTORE_PASS`: Keystore pass
+- `KEY_ALIAS_NAME`: Keystore alias name to use (if not set, the program will use the alias name set
+ in Project's PlayerSettings)
+- `KEY_ALIAS_PASS`: Keystore alias pass to use
+
+Note about _keystore security_, if you would like to use another solution for storage, see
+[Where to Store Android KeyStore File in CI/CD Cycle?](https://android.jlelse.eu/where-to-store-android-keystore-file-in-ci-cd-cycle-2365f4e02e57).
+
+### Android app bundle
+
+`BUILD_APP_BUNDLE` env var is defined in `gitlab-ci.yml`. Set it to `true` to build an `.aab` file.
+Note: to build an android app bundle, you need an image with **Android NDK**.
+
+See [related issue gableroux/unity3d#61](https://gitlab.com/game-ci/unity3d/issues/61)
+
+### Bundle version code
+
+The bundle version code must be increment for each deployed build.
+
+To simplify the process, the `BUNDLE_VERSION_CODE` env var is used and set as bundle version code.
+
+Currently, for gitlab, `BUNDLE_VERSION_CODE = $CI_PIPELINE_IID`.
+[Documentation](https://docs.gitlab.com/ee/ci/variables/predefined_variables.html)
+If you use another CI solution, set a CI env var incrementing for each pipeline.
+
+### Fastlane supply (deployement)
+
+Follow [setup instructions](https://docs.fastlane.tools/actions/supply/) to get a google play
+console token, then, add the content to env var `GPC_TOKEN`.
+
+Uncomment the `#deploy-android` job in gitlab-ci.yml and replace `com.youcompany.yourgame` by your
+package name.
+
+You can change the track `internal` to `alpha`, `beta` or `production` (Note: if you are using the
+`internal` track you will also have to mark your release as a draft in the `fastlane supply` command
+using `--release_status draft`).
+
+**Gemfile**
+
+You will also need to add a Gemfile to your project to install the `fastlane` gem. Something like
+the following:
+
+```
+source "https://rubygems.org"
+
+gem "fastlane"
+```
+
+and then copy the file to the current directory prior to installing the gem. eg
+`cp $CI_PROJECT_DIR/Gemfile .`.
+
+That is the simplest way with command line but you can also make `fastlane/Fastfile` and
+`fastlane/Appfile`, with the following command after building a temporary gradle project (export
+gradle project option in Unity build settings):
+
+```bash
+fastlane init
+```
+
+Then run the following command:
+
+```bash
+fastlane supply init
+```
+
+and update all metadata, images, changelogs, etc... These will be uploaded to the store everytime.
+Refer to [fastlane supply documentation](https://docs.fastlane.tools/actions/supply/) for more
+details.
diff --git a/versioned_docs/version-3/05-gitlab/06-deployment/ios.mdx b/versioned_docs/version-3/05-gitlab/06-deployment/ios.mdx
new file mode 100644
index 00000000..41154bc0
--- /dev/null
+++ b/versioned_docs/version-3/05-gitlab/06-deployment/ios.mdx
@@ -0,0 +1,144 @@
+# iOS
+
+## Setup (only one time per mac)
+
+Install the latest Xcode command line tools :
+
+```bash
+xcode-select --install
+```
+
+Install fastlane using:
+
+```bash
+# Using RubyGems
+sudo gem install fastlane -NV
+
+# Alternatively using Homebrew
+brew install fastlane
+```
+
+## Unity Settings
+
+1. Switch target to iOS
+1. In `PlayerSettings -> Other Settings`
+ 1. Fill the field `Signing Team ID`
+ 1. Ensure `Automatically Sign` is unchecked
+ 1. iOS Provisioning Profile
+ 1. `ProfileID`: `match AppStore your_bundle_identifier` _Replace `your_bundle_identifier` by
+ yours_
+ 1. `ProfileType`: `Distribution`
+
+## XCode project
+
+Make a first iOS build using your mac from Unity, that will create an xcode project.
+Ensure you target the same path as the CI.
+Ex: if you let `BUILD_NAME: ExampleProjectName` in `.gitlab-ci.yml`, your xcode project must be at
+the root of the following path: `.\Builds\iOS\ExampleProjectName\`
+
+## App on portal
+
+Make sure that you have setup your app on the Apple Developer Portal and the App Store Connect or
+use [fastlane produce](https://docs.fastlane.tools/actions/produce/) to create it.
+
+## Fastlane initialization
+
+Open the terminal at the same path then run `fastlane init`, follow instructions to generate Appfile
+and default Fastfile.
+
+## Provisioning profile
+
+Run `fastlane match init`, follow instructions, select `appstore` provisioning profile type.
+([Documentation](https://docs.fastlane.tools/actions/match/))
+
+## Make lane
+
+Copy the following instructions on your `fastlane/Fastfile`:
+
+```ruby
+default_platform(:ios)
+
+platform :ios do
+ desc "Push a new beta build to TestFlight"
+ lane :beta do
+ sync_code_signing(type:"appstore", readonly: is_ci)
+ increment_build_number({
+ build_number: latest_testflight_build_number + 1
+ })
+ build_app(scheme:"Unity-iPhone")
+ upload_to_testflight(groups:["Team"])
+ end
+end
+```
+
+Note about `upload_to_testflight`: Change "Team" to your internal tester or remove
+`(groups:["Team"])` if you want set manually who can test the build
+
+### Related documentation
+
+- [sync_code_signing (alias for match)](https://docs.fastlane.tools/actions/sync_code_signing/)
+- [increment_build_number](https://docs.fastlane.tools/actions/increment_build_number/)
+- [build_app (alias for gym)](https://docs.fastlane.tools/actions/build_app/)
+- [upload_to_testflight (alias for pilot)](https://docs.fastlane.tools/actions/testflight/)
+
+## Run tests locally
+
+Run the following command to test the build and the deployement localy:
+
+```bash
+fastlane ios beta
+```
+
+If the build and upload are ok, you have to force add some file to your git using command below
+
+```bash
+git add -f pathToTheFileToAdd
+```
+
+you have to add the following files:
+
+- `Gemfile`
+- `Gemfile.lock` (if here)
+- `fastlane/Appfile`
+- `fastlane/Fastfile`
+- `fastlane/Matchfile`
+
+## Gitlab-runner - register your mac
+
+To automate your build with gitlab, you need to setup your mac as a gitlab runner.
+Installation:
+
+```bash
+sudo curl --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-darwin-amd64
+```
+
+Give permission to execute :
+
+```bash
+sudo chmod +x /usr/local/bin/gitlab-runner
+```
+
+- [Source (if you would like to check)](https://docs.gitlab.com/runner/install/osx.html)
+
+Go to your project gitlab page, then go to `settings` -> `CI/CD` -> `Runners` -> `Specitic Runners`
+-> `Set up a specific Runner manually` -> take note of the token
+
+[Follow these instructions](https://docs.gitlab.com/runner/register/index.html) to register your mac
+as a gitlab-runner for your specific project.
+Follow **macOS** instructions **without** sudo command for registration.
+
+- Tags: set `mac,ios`
+- Executor: set `shell`
+
+Then, to install/launch the runner:
+
+```bash
+cd ~
+gitlab-runner install
+gitlab-runner start
+```
+
+Runner is installed and will be run after a system reboot.
+
+Now, you can uncomment the job `build-and-deploy-ios` in `.gitlab-ci.yml` to make the app build and
+deployement work.
diff --git a/versioned_docs/version-3/05-gitlab/_category_.yaml b/versioned_docs/version-3/05-gitlab/_category_.yaml
new file mode 100644
index 00000000..b242cd28
--- /dev/null
+++ b/versioned_docs/version-3/05-gitlab/_category_.yaml
@@ -0,0 +1,5 @@
+---
+position: 4.0
+label: GitLab
+collapsible: true
+collapsed: true
diff --git a/versioned_docs/version-3/08-docker/01-docker-images.mdx b/versioned_docs/version-3/08-docker/01-docker-images.mdx
new file mode 100644
index 00000000..fb0718d2
--- /dev/null
+++ b/versioned_docs/version-3/08-docker/01-docker-images.mdx
@@ -0,0 +1,84 @@
+# GameCI Docker images for Unity
+
+All projects for Unity in GameCI use [`game-ci/docker`](https://github.com/game-ci/docker/) docker
+images which are specialised for CI and command-line use. These images are published on
+[docker hub as `unityci/editor`](https://hub.docker.com/r/unityci/editor/tags?page=1&ordering=last_updated).
+
+They are established empirically by the community and come forth from the
+[`gableroux/unity3d`](https://gitlab.com/game-ci/unity3d/) project. It was previously published on
+[docker hub as `gableroux/unity3d`](https://hub.docker.com/r/gableroux/unity3d/). **There won't be
+any new versions releases for `gableroux/unity3d` as it is now deprecated in favor of
+[`game-ci/docker`](https://github.com/game-ci/docker/).**
+
+Images for newly released Unity editor versions are added almost immediately to
+[`game-ci/docker`](https://github.com/game-ci/docker/) . This process is automated, please allow a
+few hours.
+
+## Features
+
+- All editor versions
+- Git + LFS
+- ECS compatible
+- Cross-version license activations
+
+## Limitations
+
+#### Older versions of Unity
+
+There will be limited support for older versions of Unity.
+
+This is because for older versions, many factors regarding the preparation of stable docker images
+can not be determined programmatically.
+
+Due to that:
+
+- Android builds for 2019.2 or lower will require you to roll your own images. This process will
+ require you to manually specify NDK/SDK locations.
+
+#### Limited IL2CPP support
+
+Currently images are only available with Ubuntu or Windows as the base operating system.
+
+Some platforms require their respective operating systems in order to generate IL2CPP builds.
+
+That's why:
+
+- IL2CPP for MacOS is not supported
+
+We are looking to include MacOS as a base image "in the future", which is mostly dependent on
+contributions from the community.
+
+If you are looking to generate IL2CPP builds for MacOS, you can do so via
+[Github Actions](/docs/github/getting-started#il2cpp-example) without a docker container.
+
+#### Concurrent builds on Windows and MacOS
+
+Windows and MacOS will each consume an additional license seat if they are needed for a target
+platform. This is not an issue for free licenses, but for paid licenses, you will need to be mindful
+of starting too many parallel jobs as activation will fail. Below are some examples of number of
+consumed seats for a build:
+
+You are building for 1 target on a Linux based platform, 1 target for a Windows based platform, and
+1 target for a MacOS based platform:
+
+- Number of seats consumed for the Linux build instances: 1
+- Number of seats consumed for the Windows build instances: 1
+- Number of seats consumed for the MacOS build instances: 1
+
+Total concurrently consumed seats: **3**
+
+You are building for 3 targets on a Linux based platform, 3 targets for a Windows based platform,
+and 1 target for a MacOS based platform:
+
+- Number of seats consumed for the Linux build instances: 1
+- Number of seats consumed for the Windows build instances: 1
+- Number of seats consumed for the MacOS build instances: 1
+
+Total concurrently consumed seats: **3**
+
+Notice it doesn't matter how many targets you build on each platform, the cost is always one
+concurrent license seat. This does not preclude you from doing builds sequentially, for example if
+you only have 1 seat available for your CI pipeline, you could build all Linux targets first, then
+build all Windows targets, and finally build the 1 MacOS target after that. More license seats would
+allow you to parallelize more platforms. In this example, having 3 seats means being able to build
+all targets simultaneously.
diff --git a/versioned_docs/version-3/08-docker/02-windows-docker-images.mdx b/versioned_docs/version-3/08-docker/02-windows-docker-images.mdx
new file mode 100644
index 00000000..c101f674
--- /dev/null
+++ b/versioned_docs/version-3/08-docker/02-windows-docker-images.mdx
@@ -0,0 +1,271 @@
+# Windows docker images
+
+Windows images are used for some features available only in windows. The main reason is usually
+building an IL2CPP version of the application.
+
+To build applications effectively in terms of build time, the very base image is a .NET framework
+4.8. It's cached on GitHub actions runners and we truly need .NET. The base Windows image can be
+found in
+[https://github.com/game-ci/docker](https://github.com/game-ci/docker/blob/main/images/windows/base/Dockerfile).
+
+## Features
+
+- Git
+- Choco package manager
+
+## Limitations
+
+### Microsoft does not allow redistribution of Visual Studio build tools
+
+Microsoft does not permit publishing images with VS Build tools which are needed for IL2CPP builds
+[`discussion`](https://github.com/microsoft/Windows-Containers/issues/102#issuecomment-827170844).
+
+You will encounter exceptions in the Unity log similar to
+`error: Could not set up a toolchain for Architecture x64. Make sure you have the right build tools installed for il2cpp builds.`
+
+
+ Expand this section for a full log example.
+
+```
+error: Could not set up a toolchain for Architecture x64. Make sure you have the right build tools
+installed for il2cpp builds. Details: IL2CPP C++ code builder is unable to build C++ code. In order
+to build C++ code for Windows Desktop, you must have one of these installed: * Visual Studio 2022 or
+newer with C++ compilers and Windows 10 SDK (recommended) * Visual Studio 2019 with C++ compilers and
+Windows 10 SDK * Visual Studio 2017 with C++ compilers and Windows 10 SDK * Visual Studio 2015 with
+C++ compilers and Windows 10 SDK Visual Studio 2017 (or newer) is detected using `vswhere.exe` as well
+as VSCOMNTOOLS environment variables. Visual Studio 2015 is detected by looking at "SOFTWARE\Microsoft\VisualStudio\14.0_Config\InstallDir"
+in the registry as well as VSCOMNTOOLS environment variables. Windows 10 SDK is detected by looking
+at "SOFTWARE\Wow6432Node\Microsoft\Microsoft SDKs\Windows\v10.0\InstallationFolder" in the registry.
+Unable to detect any compatible Visual Studio installation! * Found Visual Studio 2022 installation
+without C++ tool components Windows 10 SDK is not installed. You can install from here: https://developer.microsoft.com/en-us/windows/downloads/windows-10-sdk/
+```
+
+
+
+There are two options to avoid this obstacle:
+
+1. (_Recommended_) Inject/mount Microsoft Visual Studio with VC++ and Windows 10 SDK from the host
+ system into the container during runtime.
+2. Build a custom image and push it to a docker registry.
+
+#### Option 1. Injecting VC++ from the host system into the container
+
+> These instructions have been validated with Visual Studio 2022 and Unity 2021 LTS.
+
+_Install Visual Studio Build Tools_
+
+The recommended way to install the correct dependencies on the host is with
+[Chocolatey](https://chocolatey.org/). This works with Windows 10/11, Windows Server, and Windows
+Server Core.
+
+```powershell
+choco install visualstudio2022-workload-vctools --no-progress -y
+```
+
+There is a way to install the same dependencies from the graphical
+[Visual Studio Installer](https://visualstudio.microsoft.com/downloads/), but the workload component
+options in the installer frequently change.
+
+_The following directories need to be bind-mounted into the container_
+
+- C:\Program Files (x86)\Windows Kits
+- C:\Program Files (x86)\Microsoft Visual Studio
+- C:\Program Files\Microsoft Visual Studio
+- C:\ProgramData\Microsoft\VisualStudio
+
+> Please confirm all of the above directories exist in your installation. Some may be missing and
+> things might still work OK without them. Omit the missing directories in the following steps.
+
+_Docker run example_
+
+```powershell
+docker run `
+ -v "C:\Program Files (x86)\Windows Kits:C:\Program Files (x86)\Windows Kits" `
+ -v "C:\Program Files (x86)\Microsoft Visual Studio:C:\Program Files (x86)\Microsoft Visual Studio" `
+ -v "C:\Program Files\Microsoft Visual Studio:C:\Program Files\Microsoft Visual Studio"
+ -v "C:\ProgramData\Microsoft\VisualStudio:C:\ProgramData\Microsoft\VisualStudio" `
+ unityci/editor:windows-$env:UNITY_VERSION-windows-il2cpp-$env:UNITY_IMAGE_VERSION
+```
+
+_Gitlab runner config.toml example_
+
+```toml
+#...
+volumes = [
+ "C:\\Program Files (x86)\\Windows Kits:C:\\Program Files (x86)\\Windows Kits",
+ "C:\\Program Files\\Microsoft Visual Studio:C:\\Program Files\\Microsoft Visual Studio",
+ "C:\\Program Files (x86)\\Microsoft Visual Studio:C:\\Program Files (x86)\\Microsoft Visual Studio",
+ "C:\\ProgramData\\Microsoft\\VisualStudio:C:\\ProgramData\\Microsoft\\VisualStudio"
+]
+#...
+```
+
+#### Option 2. Building a custom image
+
+```dockerfile
+ARG UNITY_VERSION=''
+ARG UNITY_IMAGE_VERSION='1'
+
+FROM unityci/editor:windows-${UNITY_VERSION}-windows-il2cpp-${UNITY_IMAGE_VERSION}
+
+RUN choco install visualstudio2022-workload-vctools --no-progress -y
+```
+
+### Licenses are not valid between containers runs
+
+This behaviour is different to Ubuntu containers where it's possible to use a single license for
+even a few different runners.
+
+In Windows, it's necessary to acquire a license every time and return it after a building process.
+License files for every run are identical apart from the last four symbols of the machine hash code.
+This restriction has not been solved yet
+
+#### Scripting example
+
+The simplest way is to write a couple of scripts (copied from
+[`Unity3d docs`](https://docs.unity3d.com/Manual/ManagingYourUnityLicense.html)) and wrap it to the
+try-finally block
+
+**Note**: Path to Unity3d is
+`C:\Program Files\Unity\Hub\Editor\{UNITY_EDITOR_VERSION}\Editor\Unity.exe`
+
+```powershell
+try {
+ build.ps1
+} finally {
+ return-license.ps1
+}
+```
+
+#### GitLab example
+
+```
+unity-windows-il2cpp-build:
+ variables:
+ UPM_CACHE_ROOT: $CI_PROJECT_DIR/.upm
+ UNITY_IMAGE_VERSION: "1"
+ UNITY_MODULE: "il2cpp"
+ UNITY_IMAGE_PREFIX: "unityci/editor"
+ # Do not use quotes around this argument
+ UNITY_EXECUTABLE: C:\Program Files\Unity\Hub\Editor\$UNITY_VERSION\Editor\Unity.exe
+ BUILD_COMMAND: "BuildCommand.PerformBuild"
+ BUILD_TARGET: "Win64"
+ BUILD_NAME: "example"
+ BUILD_PATH: "dist/"
+ image: $UNITY_IMAGE_PREFIX:windows-$UNITY_VERSION-$UNITY_MODULE-$UNITY_IMAGE_VERSION
+ tags:
+ - Docker-Windows
+ cache:
+ - key: "$UNITY_VERSION-$BUILD_TARGET-Library"
+ paths:
+ - $CI_PROJECT_DIR/Library/
+ - key: "unity3d"
+ paths:
+ - $UPM_CACHE_ROOT
+ artifacts:
+ expire_in: "1 day"
+ paths:
+ - dist
+ needs:
+ - get-unity-version
+ script:
+ - |
+ try {
+ & $env:UNITY_EXECUTABLE `
+ -projectPath $env:CI_PROJECT_DIR `
+ -quit `
+ -batchmode `
+ -nographics `
+ -buildTarget $env:BUILD_TARGET `
+ -executeMethod $env:BUILD_COMMAND `
+ -logFile - `
+ -username $env:UNITY_USERNAME `
+ -password $env:UNITY_PASSWORD `
+ -serial $env:UNITY_SERIAL `
+ | Out-Host
+ }
+ finally {
+ & $env:UNITY_EXECUTABLE `
+ -quit `
+ -batchmode `
+ -nographics `
+ -logFile - `
+ -username $env:UNITY_USERNAME `
+ -password $env:UNITY_PASSWORD `
+ -returnlicense `
+ | Out-Host
+ }
+```
+
+## Troubleshooting: GitLab
+
+### Gitlab doesn't have (or has few) shared docker-windows runners
+
+There is no other option right now, but
+[use a private runner](https://docs.gitlab.com/runner/install/). Please, set the `docker-windows`
+type of the runner
+
+Default docker-for-windows settings are very resource-mean. It uses a single core and 1Gb of RAM.
+That's why the custom configuration is highly recommended
+
+**config.toml**
+
+```toml
+#...
+[runners.docker]
+ cpus = "12"
+ memory = "13g"
+ hostname = "dockerImage"
+#...
+```
+
+**Note:** `hostname` doesn't influence the performance, but one day can help with license
+association to a machine
+
+### Default shell for GitLab Runner is PowerShell Core
+
+GitLab Runner changed the default docker-windows executor shell in v14 to PowerShell Core which is a
+newer version of PowerShell than is distributed with base windows container images.
+
+There are two workarounds:
+
+1. (_Recommended_) Manually specify the shell in the config to be the pre-v14 default.
+2. Build a custom image including PowerShell Core and push it to a docker registry.
+
+_Option 1: Change it in the `config.toml`_
+
+```toml
+[[runners]]
+ shell = "powershell"
+```
+
+_Option 2: Install PowerShell Core_
+
+```dockerfile
+ARG UNITY_VERSION=''
+ARG UNITY_IMAGE_VERSION='1'
+
+FROM unityci/editor:windows-${UNITY_VERSION}-windows-il2cpp-${UNITY_IMAGE_VERSION}
+
+RUN choco install pwsh --no-progress -y
+```
+
+Then push it to a docker registry. Installing `pwsh` during a pipeline doesn't help.
+
+### Git-ssh dependency package checkout fails
+
+The base image `windowsservercore` is too old and has some outdated packages. One of them, `OpenSSH`
+has [a bug](https://github.com/PowerShell/Win32-OpenSSH/issues/1263) that breaks the remote
+repository signature check.
+
+The best option here is to replace it with something more recent
+
+```powershell
+# Manually remove an old ssh-agent service
+sc.exe delete ssh-agent
+choco install openssh -params '"/SSHAgentFeature"' --no-progress -y
+$env:GIT_SSH="C:\Program Files\OpenSSH-Win64\ssh.exe"
+```
+
+**Note:** `ssh-add` must be used from a different location,
+`C:\Program Files\OpenSSH-Win64\ssh-add.exe`
diff --git a/versioned_docs/version-3/08-docker/03-customize-docker-images.mdx b/versioned_docs/version-3/08-docker/03-customize-docker-images.mdx
new file mode 100644
index 00000000..6a7819ab
--- /dev/null
+++ b/versioned_docs/version-3/08-docker/03-customize-docker-images.mdx
@@ -0,0 +1,143 @@
+# Customize GameCI Unity Docker images
+
+Sometimes, you will want to add tools to the existing unity docker images for specific needs. For
+example, in some projects, you might need Blender installed for unity to allow building a project
+with blender assets. Sometimes, you'll need some specific command lines or runtime that are used by
+unity in a _postprocess_ step. This documentation will guide you into building your own images on
+top of the existing ones to add your desired tools.
+
+## Example: Add Ruby to existing images
+
+In the following example, we will be adding `Ruby` on top of the existing docker images (all unity
+components) for the `2021.1.16f1` unity version and GameCI's `0.15.0` version and publish them.
+
+### Build script
+
+`build.sh`
+
+```bash
+#!/usr/bin/env bash
+
+set -ex
+
+UNITY_VERSION=2021.1.16f1
+GAME_CI_VERSION=0.15.0 # https://github.com/game-ci/docker/releases
+MY_USERNAME=gableroux
+
+# don't hesitate to remove unused components from this list
+declare -a components=("android" "ios" "linux-il2cpp" "mac-mono" "webgl" "windows-mono")
+
+for component in "${components[@]}"
+do
+ GAME_CI_UNITY_EDITOR_IMAGE=unityci/editor:ubuntu-${UNITY_VERSION}-${component}-${GAME_CI_VERSION}
+ IMAGE_TO_PUBLISH=${MY_USERNAME}/editor:ubuntu-${UNITY_VERSION}-${component}-${GAME_CI_VERSION}
+ docker build --build-arg GAME_CI_UNITY_EDITOR_IMAGE=${GAME_CI_UNITY_EDITOR_IMAGE} . -t ${IMAGE_TO_PUBLISH}
+# uncomment the following to publish the built images to docker hub
+# docker push ${IMAGE_TO_PUBLISH}
+done
+```
+
+### Dockerfile
+
+`Dockerfile`
+
+```dockerfile
+# initially inspired from https://github.com/drecom/docker-ubuntu-ruby/blob/master/Dockerfile
+ARG RUBY_PATH=/usr/local/
+ARG RUBY_VERSION=2.6.0
+ARG GAME_CI_UNITY_EDITOR_IMAGE
+
+# build ruby
+FROM ubuntu:18.04 AS rubybuild
+
+RUN apt-get update \
+&& apt-get upgrade -y --force-yes \
+&& apt-get install -y --force-yes \
+ libssl-dev \
+ libreadline-dev \
+ zlib1g-dev \
+ wget \
+ curl \
+ git \
+ build-essential \
+&& apt-get clean \
+&& rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/*
+
+ARG RUBY_PATH
+ARG RUBY_VERSION
+RUN git clone git://github.com/rbenv/ruby-build.git $RUBY_PATH/plugins/ruby-build \
+&& $RUBY_PATH/plugins/ruby-build/install.sh
+RUN ruby-build $RUBY_VERSION $RUBY_PATH
+
+# inject ruby and additional dependencies in game-ci's unity editor image
+FROM $GAME_CI_UNITY_EDITOR_IMAGE
+
+ARG RUBY_PATH
+ENV PATH $RUBY_PATH/bin:$PATH
+RUN apt-get update && \
+ apt-get install -y \
+ git \
+ curl \
+ gcc \
+ make \
+ libssl-dev \
+ zlib1g-dev \
+ libsqlite3-dev
+COPY --from=rubybuild $RUBY_PATH $RUBY_PATH
+```
+
+### Usage example
+
+Locally, invoke the `build.sh` script (example on a unix system):
+
+```bash
+chmod +x build.sh
+./build.sh
+```
+
+As a result, you will now have your own docker image with desired tools available during build time.
+To confirm `ruby` is correctly installed, we can invoke the command within the image we just built:
+
+```bash
+docker run --rm -it gableroux/editor:ubuntu-2021.1.16f1-android-0.15.0 ruby --version
+ruby 2.6.0p0 (2018-12-25 revision 66547) [x86_64-linux]
+```
+
+If you are using
+[github-actions unity-builder](https://github.com/marketplace/actions/unity-builder) you can then
+customize the docker image used during build using
+[the customimage parameter](https://game.ci/docs/github/builder#customimage)
+
+For more information on how to publish to docker hub, you may refer to
+[docker's documentation](https://docs.docker.com/docker-hub/repos/)
+
+## Example : Include Blender
+
+To include blender in the image used to build your unity project, you can define a custom Dockerfile
+based on unityci/editor and install blender on top of it.
+
+### Dockerfile
+
+```dockerfile
+ARG GAMECI_IMAGE=unityci/editor:2021.3.1f1-windows-mono-1.0.1
+FROM $GAMECI_IMAGE
+
+ARG BLENDER_SHORT_VERSION=3.4
+ARG BLENDER_FULL_VERSION=3.4.1
+
+RUN echo "BLENDER_SHORT_VERSION: $BLENDER_SHORT_VERSION"
+RUN echo "BLENDER_FULL_VERSION: $BLENDER_FULL_VERSION"
+RUN apt-get update && \
+ apt-get install -y wget && \
+ wget https://download.blender.org/release/Blender$BLENDER_SHORT_VERSION/blender-$BLENDER_FULL_VERSION-linux-x64.tar.xz && \
+ tar -xf blender-$BLENDER_FULL_VERSION-linux-x64.tar.xz && \
+ rm blender-$BLENDER_FULL_VERSION-linux-x64.tar.xz
+
+ENV PATH="$PATH:/blender-$BLENDER_FULL_VERSION-linux-x64"
+
+```
+
+### Usage
+
+You can build this image and upload it to your own Dockedhub registry to reference it in your Unity
+pipeline afterward.
diff --git a/versioned_docs/version-3/08-docker/04-versions.mdx b/versioned_docs/version-3/08-docker/04-versions.mdx
new file mode 100644
index 00000000..0c8b1405
--- /dev/null
+++ b/versioned_docs/version-3/08-docker/04-versions.mdx
@@ -0,0 +1 @@
+# Versions
diff --git a/versioned_docs/version-3/08-docker/_category_.yaml b/versioned_docs/version-3/08-docker/_category_.yaml
new file mode 100644
index 00000000..69639fb5
--- /dev/null
+++ b/versioned_docs/version-3/08-docker/_category_.yaml
@@ -0,0 +1,5 @@
+---
+position: 8.0
+label: Docker
+collapsible: true
+collapsed: true
diff --git a/versioned_docs/version-3/09-troubleshooting/_category_.yaml b/versioned_docs/version-3/09-troubleshooting/_category_.yaml
new file mode 100644
index 00000000..a62b1200
--- /dev/null
+++ b/versioned_docs/version-3/09-troubleshooting/_category_.yaml
@@ -0,0 +1,5 @@
+---
+position: 9.0
+label: Troubleshooting
+collapsible: true
+collapsed: true
diff --git a/versioned_docs/version-3/09-troubleshooting/common-issues.mdx b/versioned_docs/version-3/09-troubleshooting/common-issues.mdx
new file mode 100644
index 00000000..b50b0613
--- /dev/null
+++ b/versioned_docs/version-3/09-troubleshooting/common-issues.mdx
@@ -0,0 +1,319 @@
+# Common issues
+
+Below you'll find a collection of answers to commonly reported problems.
+
+## Unity Activation
+
+If you are having troubles with activation, you are not alone, this is a common problem, and it is
+not the easiest thing to solve. Here are some tips:
+
+- Try removing special characters from your password, sometimes they cause problems with command
+ lines. _This is not a security advice_
+- Your username should be an email
+- Confirm you are able to connect on Unity's website using your credentials
+
+:::caution
+
+**Unity no longer supports manual activation of Personal licenses**
+
+When activating your Personal Unity license, you may encounter an issue where only the "Unity Pro or
+Plus" option is available, preventing the activation of a Personal license. Here is a workaround to
+resolve this:
+
+1. Visit [license.unity3d.com](https://license.unity3d.com/manual) and upload the
+ `Unity_v20XX.X.XXXX.alf` file.
+2. On the "Activate your license" page, if the "Personal" option is not available, right-click on
+ the page and choose "Inspect" to open the browser's developer tools.
+3. Find the line of HTML that looks like this:
+ ``.
+4. Delete `display: none;` from the `style` attribute to make the "Personal" option visible.
+5. Now you should be able to select the "Personal" option and proceed with the activation.
+
+You can discuss this issue or find additional assistance in the
+[related Discord conversation](https://discord.com/channels/710946343828455455/1138586951604248666)
+or [GitHub ticket](https://github.com/game-ci/documentation/issues/408).
+
+_For future reference, activating a license from the command line as documented on
+[Unity's Manual Page](https://docs.unity3d.com/Manual/ManagingYourUnityLicense.html) might be an
+alternative solution._
+
+:::
+
+:::caution Known issue with Unity activation on gitlab-ci: empty license file
+
+If you are having troubles with Unity activation with gitlab-ci, there is currently an issue with
+recent Unity versions preventing us to retrieve a license file with actual content.
+
+For more details see the
+[following issue: get-activation-file succeeding but giving a 0kb file. Unity Version 2021.2.7f1](https://gitlab.com/game-ci/unity3d-gitlab-ci-example/-/issues/171)
+and
+[the workaround](https://gitlab.com/game-ci/unity3d-gitlab-ci-example/-/issues/171#note_974622879).
+
+Don't hesitate to contribute and implement a fix 💝
+
+:::
+
+### I cannot activate because
+
+#### 'Non-whitespace before first tag. Line: 0 Column: 1 Char: 㼼' during manual activation
+
+When activating a license on [license.unity3d.com](https://license.unity3d.com/), you may encounter
+the following error message:
+
+> Non-whitespace before first tag. Line: 0 Column: 1 Char: 㼼
+
+Here's Unity's workaround:
+
+> Unfortunately, this is a known issue our end. The relevant team are in the process of working on a
+> fix as we speak, in the meantime there is a workaround. Try renaming the `alf` file with a command
+> to convert characters on it with a `iconv` command.
+
+##### Solution
+
+```bash
+version=v2020.1.12f1 # update this according to your version and file name
+iconv -f UTF-8 -t utf-16BE Unity_${version}.alf > Unity_${version}.utf16be.alf
+```
+
+#### I use my Google account to login to Unity, how do I get my username and password?
+
+If you are using google account you can have some issue with activating unity. You just need to go
+on the unity website, settings, security and change your password. Then use your Google email and
+your new password, and it will work just fine ;)
+
+[Source](https://gitlab.com/game-ci/unity3d-gitlab-ci-example/-/issues/149)
+
+#### The digital signature is invalid.
+
+##### Error
+
+```plaintext
+Error: Code 400 while processing request (status: Cannot save ULF license file: Validation failed. The digital signature is invalid.)
+```
+
+##### Solution
+
+Depending on the CI/CD system, storing _multi-line_ file content into an environment variable can
+break the encoding. You can store the license as a base64 encoded string. Then during the pipeline
+execution, you decode it and write it to the right location afterward. For example, here is a fixed
+confirmed to be working on OneDev CI:
+
+```bash
+/bin/echo $UNITY_LICENSE > /opt/project/Unity_v2022.x.base64 \
+ && base64 -d /opt/project/Unity_v2022.x.base64 > /opt/project/Unity_v2022.x.ulf
+```
+
+Reference:
+[game-ci/documentation #300 Unity personal activation fails on OneDev CI](https://github.com/game-ci/documentation/issues/300)
+
+## My workflow isn't working because
+
+### I get `manifest for unityci/editor:2021.3.0f1-android-0 not found: manifest unknown: manifest unknown`
+
+This means the docker image trying to download from docker hub is not found.
+
+#### Solution
+
+To know which docker images are available, you can visit the list of [all supported Unity versions
+here][unity-docker-versions].
+
+In this particular case, it is also important to look for the last part of the docker image which is
+the version for GameCI. `-0` means it is the latest `v0.x.x` version of the docker images. `v0.x.x`
+and `v1.x.x` are out of date as we moved to Version 2 as shown on
+[github.com/game-ci/docker/releases](https://github.com/game-ci/docker/releases). We are not
+publishing images for `v0.x.x` or `v1.x.x` anymore.
+
+The correct image should be `unityci/editor:2021.3.0f1-android-2`.
+
+You can also test this locally:
+
+```bash
+# wrong
+docker pull unityci/editor:2021.3.0f1-android-0
+# Error response from daemon: manifest for unityci/editor:2021.3.0f1-android-0 not found: manifest unknown: manifest unknown
+
+# right
+docker pull unityci/editor:2021.3.0f1-android-2
+# 2021.3.0f1-android-2: Pulling from unityci/editor
+# [...]
+```
+
+#### Github Actions
+
+You need to make sure you are using Github Actions v3, check for the version of your actions in your
+`.github/workflows/*.yml` files.
+
+```diff
+- uses: game-ci/unity-builder@v2
++ uses: game-ci/unity-builder@v3
+```
+
+#### Gitlab CI
+
+Set the `IMAGE_VERSION` to 2 in
+[`.gitlab-ci.yml`](https://gitlab.com/game-ci/unity3d-gitlab-ci-example/-/blob/main/.gitlab-ci.yml#L12)
+
+### Scripts have compiler errors.
+
+#### Error
+
+```plaintext
+Scripts have compiler errors.
+(Filename: ./Runtime/Utilities/Argv.cpp Line: 361)
+
+Aborting batchmode due to failure:
+Scripts have compiler errors.
+```
+
+#### Solution
+
+Likely you have a missing script or assembly.
+
+Make sure your branch is clean and all files are indeed present:
+
+- No accidentally ignored files (i.e. ignored `.tmp` might match text mesh pro);
+- No tracked files that you expected to be ignored;
+- All packages listed;
+- No pre-build steps that change your project differently from how that happens locally;
+
+A good way to verify this, is to (locally) clone the Unity project in a new folder and run the build
+from there.
+
+### Branch is dirty
+
+#### Error
+
+```plaintext
+Branch is dirty. Refusing to base semantic version on uncommitted changes
+```
+
+This usually happens with GitHub actions when using unity-builder. A dirty branch means that you
+have uncommitted changes in your project. When you see this error in the logs of your pipeline, that
+means some files of your project are being modified after the build. This is not desirable as it
+could lead to unexpected results.
+
+#### Solution
+
+There are multiple options to solve this.
+
+1. Ignore the dirty branch and continue the build. We have a parameter for that:
+ [`allowDirtyBuild`](/docs/github/builder#allowdirtybuild) but ⚠️ it is not recommended.
+2. Find the files that are being modified and fix the source of the problem. **This is the
+ recommended solution**.
+
+ The log should list the files that are considered modified on the now dirty branch. First, double
+ check that these are not temporary files created by the runners themselves (see the
+ [Preparing the Project](/docs/getting-started/#preparing-the-project) section regarding
+ `.gitignore`). If the files are instead project related, locate the modified files and figure out
+ why they are being modified. Sometimes, it's because a `.meta` file gets modified by unity when
+ you open the project. If this is the case you can try this:
+
+ 1. Clone your project in a new folder
+ 2. Open your project with unity
+ 3. Build your project
+ 4. Run `git status` and see if files were modified. If so, commit them.
+
+ You can also try to download the modified files from the pipeline by exposing them as artifact
+ and looking at the diff yourself.
+
+ Something else you can try is moving and committing the file(s) to see if it makes a difference.
+
+### Gradle error
+
+#### Error
+
+```plaintext
+Error: 3.690 [ERROR] [org.gradle.launcher.daemon.server.DaemonStateCoordinator] Command execution: started DaemonCommandExecution[command = Build{id=69dbd5b3-10f2-488e-8640-977da68733f9, currentDir=/github/workspace/Temp/gradleOut/launcher}, connection = DefaultDaemonConnection: socket connection from /127.0.0.1:33657 to /127.0.0.1:43866] after 0.0 minutes of idle
+```
+
+#### Solution
+
+There are 2 possible solutions:
+
+- Remove emojis from all environment variables (and thus workflow files), or
+- Upgrade your project and workflow to use Unity editor version 2020.2 or later.
+
+### No space left on device
+
+#### Error
+
+Example when downloading an android docker image:
+
+```plaintext
+docker: failed to register layer: ApplyLayer exit status 1 stdout: stderr: write /opt/unity/Editor/Data/PlaybackEngines/AndroidPlayer/NDK/toolchains/llvm/prebuilt/linux-x86_64/lib64/clang/9.0.8/lib/linux/x86_64/libFuzzer.a: no space left on device.
+```
+
+or when it's downloading a docker image for the windows target platform:
+
+```plaintext
+[...]
+6fad6f1176e0: Verifying Checksum
+6fad6f1176e0: Download complete
+docker: failed to register layer: write /opt/unity/Editor/Data/Resources/PackageManager/BuiltInPackages/com.unity.visualeffectgraph/Documentation~/Images/EventContexts.png: no space left on device.
+```
+
+#### Explanation
+
+When executing multiple jobs sequentially in the same workflow, there can be potential disk space
+issues. For instance, if your workflow first executes tests on one docker image, such as
+`unityci/editor:ubuntu-2022.3.4f1-linux-il2cpp-2`, and subsequently runs a build on another target
+platform, e.g., `unityci/editor:ubuntu-2022.3.4f1-windows-mono-2`, it might run out of space during
+the build phase.
+
+This happens because each job might be downloading and using its separate docker image, which can
+collectively consume a significant amount of disk space.
+
+#### Solution
+
+1. **Parallel Execution**: A straightforward workaround is to execute the tests and builds in
+ parallel rather than sequentially. This ensures that each runner (or CI job) utilizes its own
+ docker image, thereby avoiding cumulative disk usage. By structuring your CI workflow to execute
+ these jobs concurrently, each job can independently manage its disk space. You can refer to
+ [our Github 'Parallel execution of Tests and Builds' example](/docs/github/getting-started#parallel-execution-of-tests-and-builds).
+
+2. **Free Up Disk Space**: Use the
+ [Free Disk Space (Ubuntu)](https://github.com/marketplace/actions/free-disk-space-ubuntu) action
+ at the start of your workflow to clear some space on the GitHub-hosted runner. This action can be
+ especially useful if only a small amount of additional space is needed.
+
+3. **Use Self-Hosted or Cloud Runners**: If your project inherently requires more disk space than
+ what GitHub-hosted runners provide, consider switching to
+ [Self-hosted Runners](https://docs.github.com/en/actions/hosting-your-own-runners/managing-self-hosted-runners/about-self-hosted-runners)
+ or
+ [Cloud Runners](https://game.ci/docs/github-cloud-runner/game-ci-vs-cloud-runner#large-github-projects).
+ This would give you more control over the resources and disk space.
+
+---
+
+This revised section provides a clearer understanding of the issue and offers more directed
+solutions.
+
+## General tips
+
+These are tips that are usually applicable to problems you may encounter while working with a game
+engine and CI/CD:
+
+- Try to isolate your problem as much as possible
+- Try with a blank project, this will help you to isolate your problem. Is it a something with your
+ project specifically or is it with Unity or GameCI?
+- Try to search for error keywords in your message such as `error`, `failed`, `exception`, etc.
+- Read the error message closely to understand what's going on.
+
+## Still having problems?
+
+You can **search for existing issues**:
+
+- [GitHub Actions: game-ci/unity-actions](https://github.com/game-ci/unity-actions/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc)
+- [Documentation: game-ci/documentation](https://github.com/game-ci/documentation/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc)
+- [gitlab-ci: game-ci/unity3d-gitlab-ci-example](https://gitlab.com/game-ci/unity3d-gitlab-ci-example/-/issues)
+
+You can **open an issue** on one of the related projects:
+
+- [GitHub Actions: game-ci/unity-actions](https://github.com/game-ci/unity-actions/issues/new/choose)
+- [Documentation: game-ci/documentation](https://github.com/game-ci/documentation/issues/new/choose)
+- [gitlab-ci: game-ci/unity3d-gitlab-ci-example](https://gitlab.com/game-ci/unity3d-gitlab-ci-example/-/issues/new)
+
+You can also visit us on [discord][discord]. _Discord also has a search feature_. 😉
+
+[discord]: https://game.ci/discord
+[unity-docker-versions]: /docs/docker/versions
diff --git a/versioned_docs/version-3/10-faq/index.mdx b/versioned_docs/version-3/10-faq/index.mdx
new file mode 100644
index 00000000..4f0b4e52
--- /dev/null
+++ b/versioned_docs/version-3/10-faq/index.mdx
@@ -0,0 +1,311 @@
+---
+title: Frequently Asked Questions (FAQ)
+---
+
+## What is GameCI?
+
+GameCI is a community of game developers aiming to automate the process of creating and maintaining
+games. It is also a set of tools related to CI/CD process that can be used by game developers.
+
+## What is GameCI's goal?
+
+- Making Continuous Integration and Continuous Delivery more accessible to game developers
+- Providing tools and resources to automate game development and deployment process
+- Having fun doing it
+
+## What does CI stand for in GameCI?
+
+Did you know that `.ci` in [game.ci](https://game.ci/) is
+[the Internet country code top-level domain (ccTLD) for Côte d'Ivoire](https://en.wikipedia.org/wiki/.ci)?
+In our case, it is also the abbreviation of Continuous Integration.
+
+## What is CI/CD?
+
+Continuous Integration and Continuous Delivery is a process that allows developers to build and
+deploy software without having to manually intervene each time there is a change. Learn more on
+[Wikipedia: CI/CD](https://en.wikipedia.org/wiki/CI/CD)
+
+## What game engines are supported?
+
+Right now, GameCI only supports **[Unity](https://unity3d.com/)**. We see a bright future with
+GameCI's integration with other game engines or simply put, building a community of people who are
+interested in automation around game development.
+
+### Recommendations for other game engines
+
+For **[Unreal Engine](https://unrealengine.com/)** users, it's worth checking out
+[unrealcontainers](https://unrealcontainers.com), a great resource created by our friend
+[Adam Rehn](https://adamrehn.com/).
+
+For **[Godot](https://godotengine.org/)** developers, there are several options to consider. We
+recommend both [abarichello/godot-ci](https://github.com/abarichello/godot-ci) by
+[Artur Barichello](https://barichello.me/) and
+[firebelley/godot-export](https://github.com/firebelley/godot-export).
+
+**[MonoGame](https://www.monogame.net/)** enthusiasts should look at
+[Lean MonoGame - Automate Release](https://learn-monogame.github.io/how-to/automate-release/), an
+excellent guide from [Jean-David Moisan (Apostolique)](https://jeandavidmoisan.com/).
+
+## Why use GameCI for Unity?
+
+We want developers to concentrate on their game development, not on the stuff of CI/CD. Having a
+CI/CD pipeline setup can benefit developers, but also artists, designers, Q/A and testers by
+providing game builds faster and automatically. We have a large community of developers who are
+using GameCI on a daily basis. We have community driven documentation to help you get started.
+Everything we provide is free and open source.
+
+## How does GameCI for Unity work?
+
+We provide ready to use docker images published to docker hub with Unity pre-installed and ready to
+run. This is especially useful for CI/CD pipelines where you don't want to waste time installing
+Unity each time. The main goal is to use these images as part of a pipeline you own. You can find a
+list of [all supported Unity versions here][unity-docker-versions]. We have a documentation website
+providing complete examples of working pipelines for building, testing and publishing games using
+major CI/CD platforms such as [Github Actions](https://help.github.com/en/actions),
+[Gitlab CI](https://docs.gitlab.com/ee/ci/quick_start/) and [CircleCI](https://circleci.com/).
+
+We rely on the community to help us maintain and improve the images.
+
+## Which CI/CD platforms are supported by GameCI for Unity?
+
+Right now, we have official support for the following CI/CD platforms:
+
+- **[Github Actions](https://help.github.com/en/actions)**
+- **[Gitlab CI](https://docs.gitlab.com/ee/ci/quick_start/)**
+- **[CircleCI](https://circleci.com/)**
+
+## Can I use GameCI for Unity with ``?
+
+This question is often ask for these CI/CD services:
+
+- [Jenkins](https://jenkins.io/)
+- [Travis CI](https://www.travis-ci.com/)
+- [Bitbucket Pipelines](https://bitbucket.org/product/features/pipelines)
+- [Azure DevOps](https://azure.microsoft.com/en-us/services/devops/)
+- [AWS CodeBuild](https://aws.amazon.com/codebuild/)
+- [Drone.io](https://www.drone.io/)
+
+If the service you want to use supports Docker (the above list does), then chances are it will work,
+but we might not have official support for it. Your best bet is to translate the
+[GameCI gitlab-ci unity example project](https://unity-ci.com/docs/gitlab/example-project) to your
+desired CI/CD service provider. Caution: if this is your first time using GameCI, you might want to
+try officially supported services first. The easiest one is Github Actions.
+
+We are also working on a **GameCI for Unity CLI** which will make it easier to integrate with any
+CI/CD service. See our [Roadmap v3.0.0](https://github.com/orgs/game-ci/projects/4).
+
+### Azure devOps
+
+You might also want to have a look at [Unity Tools for Azure DevOps](https://unitydevops.com/)
+
+## Which Unity versions are supported?
+
+You can find [all supported Unity versions here][unity-docker-versions].
+
+## What Unity build targets are supported?
+
+You can find a list of succeeding pipelines for
+[supported build targets in game-ci/unity-actions's ReadMe](https://github.com/game-ci/unity-actions#unity-actions).
+
+We have linux and windows based docker images to support as many build targets as possible. This
+includes the following build targets:
+
+- WebGL
+- Windows Mono
+- Linux Mono
+- macOS Mono
+- Windows IL2CPP
+- Linux IL2CPP
+- macOS IL2CPP
+- Android
+- iOS
+- Universal Windows Platform
+- AppleTV
+
+You can find a list of build targets on Unity's website:
+[Unity Build Targets](https://docs.unity3d.com/ScriptReference/BuildTarget.html)
+
+## Do you support Unity IL2CPP builds?
+
+Yes, we do, but there are limitations. See
+[Docker images limited IL2CPP support](/docs/docker/docker-images#limited-il2cpp-support)
+
+## Do you have macOS based docker images for Unity?
+
+No, we don't as it is currently not possible to build macos based images. If this is something you
+are interested in, have a look at [macOS Containers initiative](https://macoscontainers.org/).
+
+## Do I need a mac to build for iOS?
+
+Yes, but not for all steps. You will only need a mac for building the generated Xcode project. Unity
+on linux can generate an xcode project.
+
+## Do you have docker images for alpha and beta versions of Unity?
+
+No, you can learn why by looking at the following issue:
+[game-ci/docker - Support alpha and beta versions of Unity #50](https://github.com/game-ci/docker/issues/50)
+
+## Unity just released a new version, do you have a docker image for it?
+
+Most likely yes. We have automated pipelines watching every 15 minutes for new releases of Unity.
+Jobs are then created on github to build and push the docker images to docker hub. You can find the
+status of the images on [the supported Unity versions page][unity-docker-versions].
+
+## How long does it take for a new version of Unity to become available as a Docker image?
+
+We have automated pipelines that check for new releases of Unity **every 15 minutes**. Once a new
+release is detected, a job is created on GitHub to build and publish a new Docker image to Docker
+Hub. When the version is available on the Unity's download page, it usually takes a few hours for
+the new version to become available on Docker Hub. _However, the exact time it takes for a new
+version to become available as a Docker image can vary depending on several factors, such as the
+time it takes to build the images, the availability of the new version on the Unity download page._
+
+We have a discord channel which you can watch to be notified of new versions detected by our bot
+here: [#new-versions](https://discord.com/channels/710946343828455455/731947345478156391). You will
+need to join our [discord server](https://game.ci/discord) first.
+
+## How does the Docker image publication process work?
+
+The Docker image publication process involves several steps. First, we detect new releases of Unity
+based on [Unity's Archive page](https://unity.com/releases/editor/archive) and we trigger a build
+job on GitHub. This happens in the
+[GameCI Versioning Backend](https://github.com/game-ci/versioning-backend) project. Next, the build
+job uses Unity Hub to install Unity and the required packages and builds new Docker images for each
+supported target platforms. This happens in the
+[Docker images for Unity](https://github.com/game-ci/docker) project. The new images are tagged and
+pushed to Docker Hub, where they are publicly available for download.
+
+## Where is the source of truth for the process of publishing Docker images?
+
+The source of truth for the process of publishing Docker images is
+[Unity's Archive page](https://unity.com/releases/editor/archive). We use automated scripts to
+detect new releases on this page and trigger the build process for new Docker images. However, Unity
+may occasionally release updates that are not immediately available on their download page, which
+can cause a delay in the availability of new Docker images.
+
+If you are currently using a recent unity version from Unity Hub that is not yet available on the
+[Unity's Archive page](https://unity.com/releases/editor/archive), you can usually roll back to
+previous version which is most likely already available, or you can wait a few hours until Unity
+publishes the new version on its download page and wait for our pipelines to finish building and
+publishing the images.
+
+## How does Unity activation work?
+
+### The `machine-id`
+
+Unity has several activation methods, but they all share the same concept. Unity uses the
+`machine-id` to identify the user. This is usually unique per machine. On linux, the `machine-id` is
+located here:
+
+- `/etc/machine-id`
+- `/var/lib/dbus/machine-id`
+
+Using a different `machine-id` will cause Unity to require a new activation.
+
+To make it easier to use GameCI, we hardcoded the `machine-id` in all the docker images we publish,
+[see Ubuntu's base Dockerfile](https://github.com/game-ci/docker/blob/main/images/ubuntu/base/Dockerfile#L67-L68).
+
+This makes it easier to upgrade from one version of Unity to another as you will not need to
+re-activate.
+
+### I'm having troubles with Unity activation, what should I do?
+
+Have a look at the Have a look at the [troubleshooting / common issues][common-issues] page.
+
+## Can I use a free Unity license to build my project?
+
+Yes
+
+## Can I use a Unity Pro serial to build my project?
+
+Yes
+
+## Can I run multiple builds in parallel using Unity?
+
+Yes, but have a look at
+[Limitations: Concurrent builds on Windows and MacOS](/docs/docker/docker-images#concurrent-builds-on-windows-and-macos)
+
+## How much does it cost to use GameCI for Unity?
+
+GameCI is free and open source software. Depending on the CI/CD service you use, you can pay for
+build minutes but you can also use your own machines to build and test your project.
+
+Most CI/CD service providers offer a free tier with free build minutes for private projects. If you
+are building an open source project, it's often all free. ❤️
+
+### Github Actions
+
+- [About billing for GitHub Actions](https://docs.github.com/en/billing/managing-billing-for-github-actions/about-billing-for-github-actions)
+- [About self-hosted runners](https://docs.github.com/en/actions/hosting-your-own-runners/about-self-hosted-runners)
+
+### Gitlab CI
+
+- [Gitlab CI pricing](https://about.gitlab.com/pricing/)
+- [Gitlab CI self-hosted runners](https://docs.gitlab.com/runner/)
+
+### CircleCI
+
+- [CircleCI pricing](https://circleci.com/pricing/)
+- [CircleCI self-hosted runners](https://circleci.com/execution-environments/runner/)
+
+## Is GameCI free?
+
+Yes, GameCI is free and will always be free. The software we develop is open source and under the
+[MIT license](https://opensource.org/licenses/MIT).
+
+## I have an issue when using GameCI, how can I get in touch with you?
+
+First you should look at the [documentation](/docs) and the [troubleshooting / common
+issues][common-issues] page. You can also search in issues of related project on
+[github.com/game-ci/](https://github.com/game-ci/) or
+[gitlab.com/game-ci/](https://gitlab.com/game-ci/). If you still have problems, you can open an
+issue on the related project. Still unsure? You can visit us on our [discord server][discord].
+
+## Why is it so long to get support?
+
+We are a small community of developers who are trying to make the world a better place. We are not
+doing this for the money and no one is being paid for the support. This is all a community effort to
+end up with games that are less buggy ;). Don't hold your breath and be nice with people helping
+you. ❤️
+
+## Do you offer premium support?
+
+We don't offer premium support. We do offer free support for the community as a best-effort.
+
+## I have too much money, and I like your projects, how can I help?
+
+We have an [opencollective page](https://opencollective.com/game-ci) where you can donate. The
+donations are used to pay for the costs of the infrastructure, domains and the servers (which we
+kept to a very reasonable price, thanks to all the free services for open source projects). We might
+also use the money to pay for improving our visuals or anything that could help us become a better
+community. It is also possible that we send gifts to major contributors, who knows? ❤️
+
+## Do you have a roadmap?
+
+Yes, see our [Roadmap v3.0.0](https://github.com/orgs/game-ci/projects/4).
+
+## Who made GameCI?
+
+GameCI is a collaborative effort. We are a community of developers who are passionate about good
+practice and automation. You can find a list of our contributors on
+[github.com/game-ci/](https://github.com/game-ci/) in each project.
+
+The core maintainers of GameCI are:
+
+- [Gabriel "GabLeRoux" Le Breton](https://gableroux.com), founder of GameCI, Co-owner at
+ [Totema Studio](https://totemastudio.com), full time dev at [TLM](https://tlmgo.com/) and lecturer
+ at [UQAC](https://uqac.ca/).
+- [Dick "Webber" Webbink](https://takken.io/), founder of GameCI and Senior Software Engineer at
+ [Just Eat Takeaway.com](https://www.justeattakeaway.com/).
+- [Markus "Fisher" Dugdale](https://www.linkedin.com/in/markus-dugdale-136112136/) Lead game
+ developer [@bossastudios](https://www.bossastudios.com/), former product manager @unity3d, arma
+ modder. Game ai, networking, terrain.
+- [David Finol](https://davidmfinol.website/), creator of
+ [Card Game Simulator](https://www.cardgamesimulator.com/) and Software Engineer at
+ [JPMorgan Chase & Co](https://www.jpmorganchase.com/).
+
+See [About us](https://game.ci/about) for more details.
+
+[unity-docker-versions]: /docs/docker/versions
+[discord]: https://game.ci/discord
+[common-issues]: /docs/troubleshooting/common-issues
diff --git a/versioned_docs/version-3/11-circleci/01-getting-started.mdx b/versioned_docs/version-3/11-circleci/01-getting-started.mdx
new file mode 100644
index 00000000..60dca692
--- /dev/null
+++ b/versioned_docs/version-3/11-circleci/01-getting-started.mdx
@@ -0,0 +1,149 @@
+---
+toc_max_heading_level: 4
+---
+
+# Getting started
+
+This guide will help you test and build your Unity project using our
+[Unity Orb](https://circleci.com/developer/orbs/orb/game-ci/unity).
+
+## Overall steps
+
+1. Understand how CircleCI works.
+2. Set up a workflow for your project.
+3. Download the artifacts from your first build.
+
+## CircleCI
+
+If you are not familiar with CircleCI, read the official documentation on how to set up a
+[workflow](https://circleci.com/docs/getting-started). The following steps will assume you have done
+so.
+
+#### Unity Orb
+
+[Orbs](https://circleci.com/orbs/) are reusable snippets of code that help automate repeated
+processes, speed up project setup and make it easy to integrate with third-party tools.
+
+To streamline the process of testing and building Unity projects in CircleCI, we provide the
+[Unity Orb](https://circleci.com/developer/orbs/orb/game-ci/unity) — a certified orb capable of
+caching dependencies, storing artifacts, collecting test data and running on multiple
+[executors](/docs/circleci/executors).
+
+In the sections below, you will learn how to import and use the orb to test and build your project
+for different target platforms.
+
+_**Note:** the Orb is a work in progress. It doesn't have feature parity with our GitHub
+[Builder Action](/docs/github/builder) yet._
+
+## Activation
+
+To build and test projects, you need an
+[activated license](https://docs.unity3d.com/Manual/LicensesAndActivation.html). The Unity Orb will
+handle the activation process if you have all necessary environment variables set in the job's
+context. If you proceed to [set up your workflow](#setting-up-a-workflow) without doing so, your job
+will fail. For more details, head to the [Activation](/docs/circleci/activation) section.
+
+## Setting up a workflow
+
+Create a `.circleci/config.yml` file in the root of your repository and follow these steps:
+
+1. Import the [Unity Orb](https://circleci.com/developer/orbs/orb/game-ci/unity) and fix it to a
+ `minor` version (e.g. `1.1`) to avoid receiving updates with breaking changes:
+
+```yaml
+version: 2.1
+
+orbs:
+ unity: game-ci/unity@x.y
+```
+
+2. Include a [build job](/docs/circleci/build) in your workflow and modify the
+ [parameters](/docs/circleci/build#parameters) to accommodate your project needs:
+
+```yaml
+version: 2.1
+
+orbs:
+ unity: game-ci/unity@x.y
+
+workflows:
+ build-unity-project:
+ jobs:
+ - unity/build:
+ name: 'build-linux64-il2cpp'
+ step-name: 'Build StandaloneLinux64'
+ unity-license-var-name: 'UNITY_ENCODED_LICENSE'
+ unity-username-var-name: 'UNITY_USERNAME'
+ unity-password-var-name: 'UNITY_PASSWORD'
+ executor:
+ name: 'unity/ubuntu'
+ target_platform: 'linux-il2cpp'
+ editor_version: '2021.3.1f1'
+ resource_class: 'large'
+ project-path: 'Unity2D-Demo-Game-CI-CD/src'
+ build-target: StandaloneLinux64
+ compress: true
+ context: unity
+```
+
+3. Optionally, include a [test job](/docs/circleci/test) in your workflow:
+
+```yaml
+version: 2.1
+
+orbs:
+ unity: game-ci/unity@x.y
+
+workflows:
+ test-and-build-unity-project:
+ jobs:
+ - unity/test:
+ name: 'test-linux'
+ step-name: 'Check if tests run and results are uploaded'
+ unity-license-var-name: 'UNITY_ENCODED_LICENSE'
+ unity-username-var-name: 'UNITY_USERNAME'
+ unity-password-var-name: 'UNITY_PASSWORD'
+ executor:
+ name: 'unity/ubuntu'
+ target_platform: 'linux-il2cpp'
+ editor_version: '2021.3.1f1'
+ resource_class: 'medium'
+ project-path: 'Unity2D-Demo-Game-CI-CD/src'
+ test-platform: 'playmode'
+ context: unity
+ - unity/build: ...
+```
+
+You can add it as a [requirement](https://circleci.com/docs/configuration-reference#requires) in the
+build job to prevent it from running in case of failure:
+
+```yaml
+version: 2.1
+
+orbs:
+ unity: game-ci/unity@x.y
+
+workflows:
+ test-and-build-unity-project:
+ jobs:
+ - unity/test:
+ name: 'test-linux'
+ ...
+ - unity/build:
+ ...
+ requires:
+ - test-linux
+```
+
+4. Commit and push the new workflow.
+
+## Downloading the artifacts
+
+1. Navigate to your project in the CircleCI [web app](https://app.circleci.com/).
+
+2. Identify the pipeline triggered by your changes and open the `build-linux64-il2cpp` job.
+
+3. Navigate to the `ARTIFACTS` tab and download the `UnityBuild-StandaloneLinux64.tar.gz` file.
+
+4. Extract the `UnityBuild-StandaloneLinux64.tar.gz` file and you will have your first build using
+ the Unity Orb 🚀.
diff --git a/versioned_docs/version-3/11-circleci/02-activation.mdx b/versioned_docs/version-3/11-circleci/02-activation.mdx
new file mode 100644
index 00000000..3b2da252
--- /dev/null
+++ b/versioned_docs/version-3/11-circleci/02-activation.mdx
@@ -0,0 +1,135 @@
+---
+toc_max_heading_level: 4
+---
+
+# Activation
+
+The orb uses a Unity Editor instance to test and build your projects. These operations require the
+instance to be activated before each job you run.
+
+Unity separates its licenses between `Personal` and `Professional`. The former applies to the _free_
+and the latter to the _Pro_ and _Plus_ versions. Based on your use case proceed to the
+[Personal](#personal-license) or [Professional](#professional-license) license section.
+
+## Personal license
+
+Follow these steps if you are using Unity's _free_ version.
+
+> _**Note:** Do NOT follow the steps for the personal license if you have a professional license._
+
+#### Mental model
+
+1. Use the Unity Orb to create an activation file.
+2. Use the activation file to acquire a license file from the Unity website.
+3. Encode the license file and save it in a CircleCI Context.
+
+#### Acquiring an activation file
+
+Add the workflow below to a [project set up in CircleCI](https://circleci.com/docs/getting-started).
+As long as you can access it in the CircleCI web app and download its artifacts, it can be any
+project.
+
+```yaml
+version: 2.1
+
+orbs:
+ unity: game-ci/unity@x.y
+
+workflows:
+ create-unity-activation-file:
+ jobs:
+ - unity/create-activation-file
+```
+
+If you require an activation file for a specific version of the Unity Editor, you need to provide
+its version number as an argument. The available versions can be found on our
+[versions](/docs/docker/versions) page.
+
+```yaml
+version: 2.1
+
+orbs:
+ unity: game-ci/unity@x.y
+
+workflows:
+ create-unity-activation-file:
+ jobs:
+ - unity/create-activation-file:
+ editor_version: 2022.1.11f1
+```
+
+Commit and push the new workflow and navigate to your project in the CircleCI web app. Identify the
+pipeline triggered by your changes and open the `unity/create-activation-file` job. In the
+`ARTIFACTS` tab, you will encounter `Unity.alf`; this is your activation file. Download it and
+proceed to the following sub-section.
+
+#### Acquiring the license file
+
+1. Navigate to the [manual activation](https://license.unity3d.com/manual) page and upload the
+ `Unity.alf` activation file.
+2. Answer the prompted questions.
+3. Download the license file (Unity_v20XX.x.ulf).
+
+> _Note: It is fine if the version number in the file name does not match your exact Unity version._
+
+#### Encoding the license
+
+Encode the contents of your `Unity_v20XX.x.ulf` file to base64. If you have the `base64` command
+line utility you can use:
+
+```
+cat Unity_v20XX.x.ulf | base64 -w 0
+```
+
+#### Configuring your Context
+
+1. Navigate to [CircleCI](https://app.circleci.com/) ⇢ `Organization Settings` ⇢ `Contexts` ⇢
+ `Create Context` and choose a name for your context (e.g. `myProjectContext`). Alternatively,
+ open an existing Context that you would like to use.
+2. Create the following environment variables:
+ - `UNITY_ENCODED_LICENSE` - _(Paste the content from the
+ [Encoding the License](#encoding-the-license) section here)_
+ - `UNITY_USERNAME` - _(Add the email address that you use to log in to Unity)_
+ - `UNITY_PASSWORD` - _(Add the password that you use to log in to Unity)_
+3. Remove or disable the job you included to acquire your activation file. It's no longer necessary.
+
+> _**Note:** When changing the Unity version, you may need to repeat the same process._
+
+## Professional license
+
+Follow these steps if you are using Unity's _Pro_ or _Plus_ version.
+
+> _**Note:** Do NOT follow the steps for the professional license if you have a personal license._
+
+1. Get your Serial Key from the [subscriptions page](https://id.unity.com/en/subscriptions).
+2. Navigate to [CircleCI](https://app.circleci.com/) ⇢ `Organization Settings` ⇢ `Contexts` ⇢
+ `Create Context` and choose a name for your context (e.g. `myProjectContext`). Alternatively,
+ open an existing Context that you would like to use.
+3. Create the following environment variables:
+ - `UNITY_SERIAL` - _(Paste the serial acquired in **step 1** here. It should look like this:
+ `XX-XXXX-XXXX-XXXX-XXXX-XXXX`)_
+ - `UNITY_USERNAME` - _(Add the email address that you use to log in to Unity)_
+ - `UNITY_PASSWORD` - _(Add the password that you use to log in to Unity)_
+
+## Next steps
+
+Now you are prepared to start [testing](/docs/circleci/test) and [building](/docs/circleci/build)
+your Unity project. However, remember to reference your context in every job you run; otherwise,
+they will fail:
+
+```yaml
+version: 2.1
+
+orbs:
+ unity: game-ci/unity@x.y
+
+workflows:
+ build-unity-project:
+ jobs:
+ - unity/test:
+ ...
+ context: unity
+ - unity/build:
+ ...
+ context: unity
+```
diff --git a/versioned_docs/version-3/11-circleci/03-build.mdx b/versioned_docs/version-3/11-circleci/03-build.mdx
new file mode 100644
index 00000000..a5ed15e6
--- /dev/null
+++ b/versioned_docs/version-3/11-circleci/03-build.mdx
@@ -0,0 +1,816 @@
+---
+toc_max_heading_level: 4
+---
+
+# Build
+
+The Unity Orb provides the
+[build job](https://circleci.com/developer/orbs/orb/game-ci/unity#jobs-build) to facilitate the
+process of building your Unity project for multiple platforms.
+
+### Parameters
+
+Below you will find information on each parameter that can be passed to the build job.
+
+#### build-method
+
+The command used to build your project. A valid `build-method` contains the path to a `static`
+method in a class inside the `Assets/Editor` directory. The Unity Orb will fall back to the
+[default script](https://github.com/game-ci/unity-orb/blob/main/src/dependencies/unity-builder/BuildCommand.cs)
+if this parameter is left empty.
+
+To illustrate, if you were to modify the default script and use it to build your project, you would
+need to place its content in `Assets/Editor/MyBuildMethod.cs` and pass `BuildCommand.PerformBuild`
+as your `build-method` value.
+
+If your custom build method requires additional parameters, see
+[custom-parameters](#custom-parameters).
+
+```yaml
+version: 2.1
+
+orbs:
+ unity: game-ci/unity@x.y
+
+workflows:
+ build-unity-project:
+ jobs:
+ - unity/build:
+ build-method: 'BuildCommand.PerformBuild'
+```
+
+- _Default_: `N/A`
+- _Required_: `false`
+- _Type_: `string`
+
+#### build-name
+
+Your build's name. If left blank, the build will be named after the target platform.
+
+```yaml
+version: 2.1
+
+orbs:
+ unity: game-ci/unity@x.y
+
+workflows:
+ build-unity-project:
+ jobs:
+ - unity/build:
+ build-name: 'MyUnityProject'
+```
+
+- _Default_: `N/A`
+- _Required_: `false`
+- _Type_: `string`
+
+#### build-target
+
+The platform on which you want to run your game or application. Available targets can be found in
+the Unity Editor
+[documentation](https://docs.unity3d.com/2022.2/Documentation/ScriptReference/BuildTarget.html).
+
+```yaml
+version: 2.1
+
+orbs:
+ unity: game-ci/unity@x.y
+
+workflows:
+ build-unity-project:
+ jobs:
+ - unity/build:
+ build-target: 'StandaloneLinux64'
+```
+
+- _Default_: `N/A`
+- _Required_: `true`
+- _Type_: `string`
+
+#### compress
+
+Whether to compress the build output to a `.tar.gz` file. Set it to `true` if you want to download
+the build artifacts from the CircleCI web app. Otherwise, you will have to download each file
+individually. If set to `false` for
+[decompressed WebGL](https://docs.unity3d.com/Manual/webgl-deploying.html) builds, the built project
+can be run directly from the GameCI dashboard.
+
+```yaml
+version: 2.1
+
+orbs:
+ unity: game-ci/unity@x.y
+
+workflows:
+ build-unity-project:
+ jobs:
+ - unity/build:
+ compress: true
+```
+
+- _Default_: `true`
+- _Required_: `false`
+- _Type_: `boolean`
+
+#### custom-parameters
+
+Additional parameters for the Unity CLI. This is useful if you want to change Unity's
+[build options](https://docs.unity3d.com/ScriptReference/BuildOptions.html) or pass custom
+parameters to your [build method](#build-method).
+
+The parameters must be separated by space and must be in the format `-key value` or `-key` for
+booleans. Environment variables are supported and will be expanded in runtime.
+
+```yaml
+version: 2.1
+
+orbs:
+ unity: game-ci/unity@x.y
+
+workflows:
+ build-unity-project:
+ jobs:
+ - unity/build:
+ custom-parameters:
+ '-customParam1 potato -customParam2 tomato -customParam3 $CIRCLE_WORKFLOW_ID
+ -DetailedBuildReport'
+```
+
+- _Default_: `N/A`
+- _Required_: `false`
+- _Type_: `string`
+
+#### executor
+
+The executor that you want to run your build job on. Bear in mind that projects using `IL2CPP` for a
+[scripting backend](https://docs.unity3d.com/Manual/scripting-backends.html) should run on the same
+OS as the [build target](#build-target). For example, if you want to build for macOS using `IL2CPP`,
+then you must use the [macos](/docs/circleci/executors#macos) or
+[macos-runner](/docs/circleci/executors#macos-runner) executor.
+
+Each executor has its set of parameters. See the [Executors](/docs/circleci/executors) section for
+more details.
+
+```yaml
+version: 2.1
+
+orbs:
+ unity: game-ci/unity@x.y
+
+workflows:
+ build-unity-project:
+ jobs:
+ - unity/build:
+ executor:
+ name: 'unity/ubuntu'
+ target_platform: 'linux-il2cpp'
+ editor_version: '2021.3.2f1'
+ resource_class: 'large'
+```
+
+- _Default_: `N/A`
+- _Required_: `true`
+- _Type_: `executor`
+
+#### no_output_timeout
+
+Elapsed time without output before the job is canceled and stopped. The value can be in hours,
+minutes or seconds - a digit followed by h, m or s respectively. Consider increasing it if you see
+this error:
+
+> Too long with no output (exceeded 20m0s): context deadline exceeded
+
+```yaml
+version: 2.1
+
+orbs:
+ unity: game-ci/unity@x.y
+
+workflows:
+ build-unity-project:
+ jobs:
+ - unity/build:
+ no_output_timeout: 30m
+```
+
+- _Default_: `20m`
+- _Required_: `false`
+- _Type_: `string`
+
+#### project-path
+
+If your project sits at the root of your repository, leave it to the default value. Otherwise, enter
+the path to your Unity project. It should be the directory that has the "Assets" folder inside it.
+
+```yaml
+version: 2.1
+
+orbs:
+ unity: game-ci/unity@x.y
+
+workflows:
+ build-unity-project:
+ jobs:
+ - unity/build:
+ project-path: 'Unity2D-Demo-Game-CI-CD/src'
+```
+
+- _Default_: `.`
+- _Required_: `false`
+- _Type_: `string`
+
+#### return-license
+
+Whether to manually return the Unity license after the build job is finished. This is usually
+unnecessary and only useful when running into an unrecoverable error while having a license active.
+Additionally, Unity only allows returning professional licenses.
+
+```yaml
+version: 2.1
+
+orbs:
+ unity: game-ci/unity@x.y
+
+workflows:
+ build-unity-project:
+ jobs:
+ - unity/build:
+ return-license: true
+```
+
+- _Default_: `false`
+- _Required_: `false`
+- _Type_: `boolean`
+
+#### step-name
+
+Specify a custom step name to be shown in the CircleCI web app.
+
+```yaml
+version: 2.1
+
+orbs:
+ unity: game-ci/unity@x.y
+
+workflows:
+ build-unity-project:
+ jobs:
+ - unity/build:
+ step-name: 'Build my Unity project'
+```
+
+- _Default_: `Build the project`
+- _Required_: `false`
+- _Type_: `string`
+
+#### store-artifacts
+
+Whether to store the build output. If set to `false` you won't be able to download your build in the
+CircleCI web app.
+
+```yaml
+version: 2.1
+
+orbs:
+ unity: game-ci/unity@x.y
+
+workflows:
+ build-unity-project:
+ jobs:
+ - unity/build:
+ store-artifacts: false
+```
+
+- _Default_: `true`
+- _Required_: `false`
+- _Type_: `boolean`
+
+#### fetch-submodules
+
+Whether to fetch git submodules relating to the project repository.
+
+```yaml
+version: 2.1
+
+orbs:
+ unity: game-ci/unity@x.y
+
+workflows:
+ build-unity-project:
+ jobs:
+ - unity/build:
+ fetch-submodules: true
+```
+
+- _Default_: `false`
+- _Required_: `false`
+- _Type_: `boolean`
+
+#### unity-license-var-name
+
+The name of the environment variable holding the license set in your
+[Context](/docs/circleci/activation#preparing-the-context). Only required when using a Personal
+License. See [activation](/docs/circleci/activation) for more details.
+
+```yaml
+version: 2.1
+
+orbs:
+ unity: game-ci/unity@x.y
+
+workflows:
+ build-unity-project:
+ jobs:
+ - unity/build:
+ unity-license-var-name: 'UNITY_ENCODED_LICENSE'
+```
+
+- _Default_: `UNITY_ENCODED_LICENSE`
+- _Required_: `false`
+- _Type_: `env_var_name`
+
+#### unity-password-var-name
+
+The name of the environment variable holding the password set in your
+[Context](/docs/circleci/activation#preparing-the-context). See
+[activation](/docs/circleci/activation) for more details.
+
+```yaml
+version: 2.1
+
+orbs:
+ unity: game-ci/unity@x.y
+
+workflows:
+ build-unity-project:
+ jobs:
+ - unity/build:
+ unity-password-var-name: 'UNITY_PASSWORD'
+```
+
+- _Default_: `UNITY_PASSWORD`
+- _Required_: `false`
+- _Type_: `env_var_name`
+
+#### unity-serial-var-name
+
+The name of the environment variable holding the serial set in your
+[Context](/docs/circleci/activation#preparing-the-context). Only required when using a Pro or Plus
+License. See [activation](/docs/circleci/activation) for more details.
+
+```yaml
+version: 2.1
+
+orbs:
+ unity: game-ci/unity@x.y
+
+workflows:
+ build-unity-project:
+ jobs:
+ - unity/build:
+ unity-serial-var-name: 'UNITY_SERIAL'
+```
+
+- _Default_: `UNITY_SERIAL`
+- _Required_: `false`
+- _Type_: `env_var_name`
+
+#### unity-username-var-name
+
+The name of the environment variable holding the username set in your
+[Context](/docs/circleci/activation#preparing-the-context). See
+[Activation](/docs/circleci/activation) for more details.
+
+```yaml
+version: 2.1
+
+orbs:
+ unity: game-ci/unity@x.y
+
+workflows:
+ build-unity-project:
+ jobs:
+ - unity/build:
+ unity-username-var-name: 'UNITY_USERNAME'
+```
+
+- _Default_: `UNITY_USERNAME`
+- _Required_: `false`
+- _Type_: `env_var_name`
+
+### Examples
+
+In this section, you will find examples of workflows using this job. However, notice that the
+separation used in the examples is only for the sake of visualisation. You can build for all target
+platforms in the same workflow. All examples are based on CircleCI's
+[Demo Project](https://github.com/CircleCI-Public/Unity2D-Demo-Game-CI-CD).
+
+#### Personal License
+
+This example shows how to build your project for several platforms using a Personal License.
+
+##### IL2CPP
+
+```yaml
+version: 2.1
+
+orbs:
+ unity: game-ci/unity@x.y
+
+workflows:
+ build-unity-project:
+ jobs:
+ # Linux IL2CPP
+ - unity/build:
+ name: 'build-linux64-il2cpp'
+ step-name: 'Build StandaloneLinux64'
+ unity-license-var-name: 'UNITY_ENCODED_LICENSE'
+ unity-username-var-name: 'UNITY_USERNAME'
+ unity-password-var-name: 'UNITY_PASSWORD'
+ executor:
+ name: 'unity/ubuntu'
+ target_platform: 'linux-il2cpp'
+ editor_version: '2021.3.1f1'
+ resource_class: 'large'
+ project-path: 'Unity2D-Demo-Game-CI-CD/src'
+ build-target: StandaloneLinux64
+ compress: true
+ context: unity
+
+ # Windows IL2CPP
+ - unity/build:
+ name: 'build-Windows64-il2cpp'
+ step-name: 'Build StandaloneWindows64 il2cpp'
+ unity-license-var-name: 'UNITY_ENCODED_LICENSE'
+ unity-username-var-name: 'UNITY_USERNAME'
+ unity-password-var-name: 'UNITY_PASSWORD'
+ executor:
+ name: 'unity/windows-2019'
+ size: 'large'
+ editor_version: '2021.3.2f1'
+ target_platform: 'windows-il2cpp'
+ project-path: 'Unity2D-Demo-Game-CI-CD/src'
+ build-target: StandaloneWindows64
+ compress: true
+ context: unity
+
+ # macOS IL2CPP
+ - unity/build:
+ name: 'build-osx-il2cpp'
+ step-name: 'Build macOS IL2CPP'
+ unity-license-var-name: 'UNITY_ENCODED_LICENSE'
+ unity-username-var-name: 'UNITY_USERNAME'
+ unity-password-var-name: 'UNITY_PASSWORD'
+ executor:
+ name: 'unity/macos'
+ resource_class: 'large'
+ editor_version: '2021.3.2f1'
+ project-path: 'Unity2D-Demo-Game-CI-CD/src'
+ build-target: StandaloneWindows64
+ compress: true
+ context: unity
+```
+
+##### Mono
+
+```yaml
+version: 2.1
+
+orbs:
+ unity: game-ci/unity@x.y
+
+workflows:
+ build-unity-project:
+ jobs:
+ # Linux Mono
+ - unity/build:
+ name: 'build-linux64-mono'
+ step-name: 'Build StandaloneLinux64'
+ unity-license-var-name: 'UNITY_ENCODED_LICENSE'
+ unity-username-var-name: 'UNITY_USERNAME'
+ unity-password-var-name: 'UNITY_PASSWORD'
+ executor:
+ name: 'unity/ubuntu'
+ target_platform: 'base'
+ editor_version: '2021.3.1f1'
+ resource_class: 'large'
+ project-path: 'Unity2D-Demo-Game-CI-CD/src'
+ build-target: StandaloneLinux64
+ compress: true
+ context: unity
+
+ # Windows Mono
+ - unity/build:
+ name: 'build-Windows64-mono'
+ step-name: 'Build StandaloneWindows64'
+ unity-license-var-name: 'UNITY_ENCODED_LICENSE'
+ unity-username-var-name: 'UNITY_USERNAME'
+ unity-password-var-name: 'UNITY_PASSWORD'
+ executor:
+ name: 'unity/ubuntu'
+ target_platform: 'windows-mono'
+ editor_version: '2021.3.2f1'
+ resource_class: 'large'
+ project-path: 'Unity2D-Demo-Game-CI-CD/src'
+ build-target: 'StandaloneWindows64'
+ context: unity
+
+ # macOS Mono
+ - unity/build:
+ name: 'build-osx-mono'
+ step-name: 'Build StandaloneOSX'
+ unity-license-var-name: 'UNITY_ENCODED_LICENSE'
+ unity-username-var-name: 'UNITY_USERNAME'
+ unity-password-var-name: 'UNITY_PASSWORD'
+ executor:
+ name: 'unity/ubuntu'
+ target_platform: 'mac-mono'
+ editor_version: '2021.3.2f1'
+ resource_class: 'large'
+ project-path: 'Unity2D-Demo-Game-CI-CD/src'
+ build-target: 'StandaloneOSX'
+ context: unity
+```
+
+##### Other Platforms
+
+```yaml
+version: 2.1
+
+orbs:
+ unity: game-ci/unity@x.y
+
+workflows:
+ build-unity-project:
+ jobs:
+ # WebGL
+ - unity/build:
+ name: 'build-webgl'
+ step-name: 'Build WebGL'
+ unity-license-var-name: 'UNITY_ENCODED_LICENSE'
+ unity-username-var-name: 'UNITY_USERNAME'
+ unity-password-var-name: 'UNITY_PASSWORD'
+ executor:
+ name: 'unity/ubuntu'
+ target_platform: 'webgl'
+ editor_version: '2021.3.1f1'
+ resource_class: 'large'
+ project-path: 'Unity2D-Demo-Game-CI-CD/src'
+ build-target: 'WebGL'
+ compress: false
+ context: unity
+
+ # Android
+ - unity/build:
+ name: 'build-android'
+ step-name: 'Build Android'
+ unity-license-var-name: 'UNITY_ENCODED_LICENSE'
+ unity-username-var-name: 'UNITY_USERNAME'
+ unity-password-var-name: 'UNITY_PASSWORD'
+ executor:
+ name: 'unity/ubuntu'
+ target_platform: 'android'
+ editor_version: '2021.3.2f1'
+ resource_class: 'large'
+ project-path: 'Unity2D-Demo-Game-CI-CD/src'
+ build-target: 'Android'
+ context: unity
+
+ # iOS
+ - unity/build:
+ name: 'build-ios'
+ step-name: 'Build iOS'
+ unity-license-var-name: 'UNITY_ENCODED_LICENSE'
+ unity-username-var-name: 'UNITY_USERNAME'
+ unity-password-var-name: 'UNITY_PASSWORD'
+ executor:
+ name: 'unity/ubuntu'
+ target_platform: 'ios'
+ editor_version: '2021.3.2f1'
+ resource_class: 'large'
+ project-path: 'Unity2D-Demo-Game-CI-CD/src'
+ build-target: 'iOS'
+ context: unity
+
+ # tvOS
+ - unity/build:
+ name: 'build-tvOS'
+ step-name: "Build Apple's tvOS"
+ unity-license-var-name: 'UNITY_ENCODED_LICENSE'
+ unity-username-var-name: 'UNITY_USERNAME'
+ unity-password-var-name: 'UNITY_PASSWORD'
+ executor:
+ name: 'unity/windows-2019'
+ size: 'large'
+ editor_version: '2021.3.2f1'
+ target_platform: 'appletv'
+ project-path: 'Unity2D-Demo-Game-CI-CD/src'
+ build-target: tvOS
+ compress: true
+ context: unity
+```
+
+#### Professional License
+
+This example shows how to build your project for several platforms using a Pro License.
+
+##### IL2CPP
+
+```yaml
+version: 2.1
+
+orbs:
+ unity: game-ci/unity@x.y
+
+workflows:
+ build-unity-project:
+ jobs:
+ # Linux IL2CPP
+ - unity/build:
+ name: 'build-linux64-il2cpp'
+ step-name: 'Build StandaloneLinux64'
+ unity-serial-var-name: 'UNITY_SERIAL'
+ unity-username-var-name: 'UNITY_USERNAME'
+ unity-password-var-name: 'UNITY_PASSWORD'
+ executor:
+ name: 'unity/ubuntu'
+ target_platform: 'linux-il2cpp'
+ editor_version: '2021.3.1f1'
+ resource_class: 'large'
+ project-path: 'Unity2D-Demo-Game-CI-CD/src'
+ build-target: StandaloneLinux64
+ compress: true
+ context: unity
+
+ # Windows IL2CPP
+ - unity/build:
+ name: 'build-Windows64-il2cpp'
+ step-name: 'Build StandaloneWindows64 il2cpp'
+ unity-serial-var-name: 'UNITY_SERIAL'
+ unity-username-var-name: 'UNITY_USERNAME'
+ unity-password-var-name: 'UNITY_PASSWORD'
+ executor:
+ name: 'unity/windows-2019'
+ size: 'large'
+ editor_version: '2021.3.2f1'
+ target_platform: 'windows-il2cpp'
+ project-path: 'Unity2D-Demo-Game-CI-CD/src'
+ build-target: StandaloneWindows64
+ compress: true
+ context: unity
+
+ # macOS IL2CPP
+ - unity/build:
+ name: 'build-osx-il2cpp'
+ step-name: 'Build macOS IL2CPP'
+ unity-serial-var-name: 'UNITY_SERIAL'
+ unity-username-var-name: 'UNITY_USERNAME'
+ unity-password-var-name: 'UNITY_PASSWORD'
+ executor:
+ name: 'unity/macos'
+ resource_class: 'large'
+ editor_version: '2021.3.2f1'
+ project-path: 'Unity2D-Demo-Game-CI-CD/src'
+ build-target: StandaloneOSX
+ compress: true
+ context: unity
+```
+
+##### Mono
+
+```yaml
+version: 2.1
+
+orbs:
+ unity: game-ci/unity@x.y
+
+workflows:
+ build-unity-project:
+ jobs:
+ # Linux Mono
+ - unity/build:
+ name: 'build-linux64-mono'
+ step-name: 'Build StandaloneLinux64'
+ unity-serial-var-name: 'UNITY_SERIAL'
+ unity-username-var-name: 'UNITY_USERNAME'
+ unity-password-var-name: 'UNITY_PASSWORD'
+ executor:
+ name: 'unity/ubuntu'
+ target_platform: 'base'
+ editor_version: '2021.3.1f1'
+ resource_class: 'large'
+ project-path: 'Unity2D-Demo-Game-CI-CD/src'
+ build-target: StandaloneLinux64
+ compress: true
+ context: unity
+
+ # Windows Mono
+ - unity/build:
+ name: 'build-Windows64-mono'
+ step-name: 'Build StandaloneWindows64'
+ unity-serial-var-name: 'UNITY_SERIAL'
+ unity-username-var-name: 'UNITY_USERNAME'
+ unity-password-var-name: 'UNITY_PASSWORD'
+ executor:
+ name: 'unity/ubuntu'
+ target_platform: 'windows-mono'
+ editor_version: '2021.3.2f1'
+ resource_class: 'large'
+ project-path: 'Unity2D-Demo-Game-CI-CD/src'
+ build-target: 'StandaloneWindows64'
+ context: unity
+
+ # macOS Mono
+ - unity/build:
+ name: 'build-osx-mono'
+ step-name: 'Build StandaloneOSX'
+ unity-serial-var-name: 'UNITY_SERIAL'
+ unity-username-var-name: 'UNITY_USERNAME'
+ unity-password-var-name: 'UNITY_PASSWORD'
+ executor:
+ name: 'unity/ubuntu'
+ target_platform: 'mac-mono'
+ editor_version: '2021.3.2f1'
+ resource_class: 'large'
+ project-path: 'Unity2D-Demo-Game-CI-CD/src'
+ build-target: 'StandaloneOSX'
+ context: unity
+```
+
+##### Other Platforms
+
+```yaml
+version: 2.1
+
+orbs:
+ unity: game-ci/unity@x.y
+
+workflows:
+ build-unity-project:
+ jobs:
+ # WebGL
+ - unity/build:
+ name: 'build-webgl'
+ step-name: 'Build WebGL'
+ unity-serial-var-name: 'UNITY_SERIAL'
+ unity-username-var-name: 'UNITY_USERNAME'
+ unity-password-var-name: 'UNITY_PASSWORD'
+ executor:
+ name: 'unity/ubuntu'
+ target_platform: 'webgl'
+ editor_version: '2021.3.1f1'
+ resource_class: 'large'
+ project-path: 'Unity2D-Demo-Game-CI-CD/src'
+ build-target: 'WebGL'
+ compress: false
+ context: unity
+
+ # Android
+ - unity/build:
+ name: 'build-android'
+ step-name: 'Build Android'
+ unity-serial-var-name: 'UNITY_SERIAL'
+ unity-username-var-name: 'UNITY_USERNAME'
+ unity-password-var-name: 'UNITY_PASSWORD'
+ executor:
+ name: 'unity/ubuntu'
+ target_platform: 'android'
+ editor_version: '2021.3.2f1'
+ resource_class: 'large'
+ project-path: 'Unity2D-Demo-Game-CI-CD/src'
+ build-target: 'Android'
+ context: unity
+
+ # iOS
+ - unity/build:
+ name: 'build-ios'
+ step-name: 'Build iOS'
+ unity-serial-var-name: 'UNITY_SERIAL'
+ unity-username-var-name: 'UNITY_USERNAME'
+ unity-password-var-name: 'UNITY_PASSWORD'
+ executor:
+ name: 'unity/ubuntu'
+ target_platform: 'ios'
+ editor_version: '2021.3.2f1'
+ resource_class: 'large'
+ project-path: 'Unity2D-Demo-Game-CI-CD/src'
+ build-target: 'iOS'
+ context: unity
+
+ # tvOS
+ - unity/build:
+ name: 'build-tvOS'
+ step-name: "Build Apple's tvOS"
+ unity-serial-var-name: 'UNITY_SERIAL'
+ unity-username-var-name: 'UNITY_USERNAME'
+ unity-password-var-name: 'UNITY_PASSWORD'
+ executor:
+ name: 'unity/windows-2019'
+ size: 'large'
+ editor_version: '2021.3.2f1'
+ target_platform: 'appletv'
+ project-path: 'Unity2D-Demo-Game-CI-CD/src'
+ build-target: tvOS
+ compress: true
+ context: unity
+```
diff --git a/versioned_docs/version-3/11-circleci/04-test.mdx b/versioned_docs/version-3/11-circleci/04-test.mdx
new file mode 100644
index 00000000..ab4b9626
--- /dev/null
+++ b/versioned_docs/version-3/11-circleci/04-test.mdx
@@ -0,0 +1,381 @@
+---
+toc_max_heading_level: 4
+---
+
+# Test
+
+The Unity Orb provides the
+[test job](https://circleci.com/developer/orbs/orb/game-ci/unity#jobs-test) to facilitate the
+process of testing your Unity project.
+
+At the end of the run, the test results are parsed to JUnit and
+[stored](https://circleci.com/docs/collect-test-data) in CircleCI so that
+[test insights](https://circleci.com/docs/insights-tests) can be used. You can access test insights
+from the CircleCI web app.
+
+### Parameters
+
+Below you will find information on each parameter that can be passed to the test job.
+
+#### executor
+
+The executor on which you want to run your test job on. Each executor has its set of parameters. See
+the [Executors](/docs/circleci/executors) section for more details.
+
+```yaml
+version: 2.1
+
+orbs:
+ unity: game-ci/unity@x.y
+
+workflows:
+ test-unity-project:
+ jobs:
+ - unity/test:
+ executor:
+ name: 'unity/ubuntu'
+ target_platform: 'linux-il2cpp'
+ editor_version: '2021.3.2f1'
+ resource_class: 'medium'
+```
+
+- _Default_: `N/A`
+- _Required_: `True`
+- _Type_: `Executor`
+
+#### no_output_timeout
+
+Elapsed time without output before the job is canceled and stopped. The value can be in hours,
+minutes or seconds - a digit followed by h, m or s respectively. Consider increasing it if you see
+this error:
+
+> Too long with no output (exceeded 20m0s): context deadline exceeded
+
+```yaml
+version: 2.1
+
+orbs:
+ unity: game-ci/unity@x.y
+
+workflows:
+ test-unity-project:
+ jobs:
+ - unity/test:
+ no_output_timeout: 30m
+```
+
+- _Default_: `20m`
+- _Required_: `false`
+- _Type_: `string`
+
+#### project-path
+
+If your project sits at the root of your repository, leave it to the default value. Otherwise, enter
+the path of your Unity project. This should be the directory that has an "Assets" folder inside it.
+
+```yaml
+version: 2.1
+
+orbs:
+ unity: game-ci/unity@x.y
+
+workflows:
+ test-unity-project:
+ jobs:
+ - unity/test:
+ project-path: 'Unity2D-Demo-Game-CI-CD/src'
+```
+
+- _Default_: `.`
+- _Required_: `False`
+- _Type_: `String`
+
+#### return-license
+
+Whether to manually return the Unity license after the test job is finished. This is usually
+unnecessary and only useful when running into an unrecoverable error while having a license active.
+Additionally, Unity only allows returning professional licenses.
+
+```yaml
+version: 2.1
+
+orbs:
+ unity: game-ci/unity@x.y
+
+workflows:
+ test-unity-project:
+ jobs:
+ - unity/test:
+ return-license: true
+```
+
+- _Default_: `false`
+- _Required_: `false`
+- _Type_: `boolean`
+
+#### step-name
+
+Specify a custom step name to be shown in the CircleCI web app.
+
+```yaml
+version: 2.1
+
+orbs:
+ unity: game-ci/unity@x.y
+
+workflows:
+ test-unity-project:
+ jobs:
+ - unity/test:
+ step-name: 'Test my Unity project'
+```
+
+- _Default_: `Run tests`
+- _Required_: `False`
+- _Type_: `String`
+
+#### test-platform
+
+Choose the platform to run your tests on. The available options can be found on the Unity test
+framework
+[documentation](https://docs.unity3d.com/Packages/com.unity.test-framework@2.0/manual/reference-command-line.html).
+
+```yaml
+version: 2.1
+
+orbs:
+ unity: game-ci/unity@x.y
+
+workflows:
+ test-unity-project:
+ jobs:
+ - unity/test:
+ test-platform: 'playmode'
+```
+
+- _Default_: `editmode`
+- _Required_: `False`
+- _Type_: `String`
+
+#### unity-license-var-name
+
+The name of the environment variable holding the license set in your
+[Context](/docs/circleci/activation#preparing-the-context). If you are testing your project using
+the Unity Pro or Plus license, this is **not** required. See [Activation](/docs/circleci/activation)
+for more details.
+
+```yaml
+version: 2.1
+
+orbs:
+ unity: game-ci/unity@x.y
+
+workflows:
+ test-unity-project:
+ jobs:
+ - unity/test:
+ unity-license-var-name: 'UNITY_ENCODED_LICENSE'
+```
+
+- _Default_: `UNITY_ENCODED_LICENSE`
+- _Required_: `False`
+- _Type_: `env_var_name`
+
+#### unity-password-var-name
+
+The name of the environment variable holding the password set in your
+[Context](/docs/circleci/activation#preparing-the-context). See
+[Activation](/docs/circleci/activation) for more details.
+
+```yaml
+version: 2.1
+
+orbs:
+ unity: game-ci/unity@x.y
+
+workflows:
+ test-unity-project:
+ jobs:
+ - unity/test:
+ unity-password-var-name: 'UNITY_PASSWORD'
+```
+
+- _Default_: `UNITY_PASSWORD`
+- _Required_: `False`
+- _Type_: `env_var_name`
+
+#### unity-serial-var-name
+
+The name of the environment variable holding the serial set in your
+[Context](/docs/circleci/activation#preparing-the-context). If you are testing your project using
+the Unity Personal license, this is **not** required. See [Activation](/docs/circleci/activation)
+for more details.
+
+```yaml
+version: 2.1
+
+orbs:
+ unity: game-ci/unity@x.y
+
+workflows:
+ test-unity-project:
+ jobs:
+ - unity/test:
+ unity-serial-var-name: 'UNITY_SERIAL'
+```
+
+- _Default_: `UNITY_SERIAL`
+- _Required_: `False`
+- _Type_: `env_var_name`
+
+#### unity-username-var-name
+
+The name of the environment variable holding the username set in your
+[Context](/docs/circleci/activation#preparing-the-context). See
+[Activation](/docs/circleci/activation) for more details.
+
+```yaml
+version: 2.1
+
+orbs:
+ unity: game-ci/unity@x.y
+
+workflows:
+ test-unity-project:
+ jobs:
+ - unity/test:
+ unity-username-var-name: 'UNITY_USERNAME'
+```
+
+- _Default_: `UNITY_USERNAME`
+- _Required_: `False`
+- _Type_: `env_var_name`
+
+### Examples
+
+In this section, you will find examples of workflows using this job. However, notice that the
+separation used in the examples is only for the sake of visualisation. You can test all target
+platforms in the same workflow. All examples are based on CircleCI's
+[Demo Project](https://github.com/CircleCI-Public/Unity2D-Demo-Game-CI-CD).
+
+#### Personal License
+
+This example shows how to build your project for several platforms using a Personal License.
+
+```yaml
+version: 2.1
+
+orbs:
+ unity: game-ci/unity@x.y
+
+workflows:
+ build-unity-project:
+ jobs:
+ # Linux
+ - unity/test:
+ name: 'test-linux'
+ step-name: 'Check if the tests run and results are uploaded'
+ unity-license-var-name: 'UNITY_ENCODED_LICENSE'
+ unity-username-var-name: 'UNITY_USERNAME'
+ unity-password-var-name: 'UNITY_PASSWORD'
+ executor:
+ name: 'unity/ubuntu'
+ target_platform: 'linux-il2cpp'
+ editor_version: '2021.3.1f1'
+ resource_class: 'medium'
+ project-path: 'Unity2D-Demo-Game-CI-CD/src'
+ test-platform: 'playmode'
+ context: unity
+
+ # Windows
+ - unity/test:
+ name: 'test-windows'
+ step-name: 'Check if the tests run and results are uploaded'
+ unity-license-var-name: 'UNITY_ENCODED_LICENSE'
+ unity-username-var-name: 'UNITY_USERNAME'
+ unity-password-var-name: 'UNITY_PASSWORD'
+ executor:
+ name: 'unity/windows-2022'
+ size: 'large'
+ editor_version: '2021.3.2f1'
+ target_platform: 'windows-il2cpp'
+ project-path: 'Unity2D-Demo-Game-CI-CD/src'
+ test-platform: 'playmode'
+ context: unity
+
+ # macOS
+ - unity/test:
+ name: 'test-osx'
+ step-name: 'Check if the tests run and results are uploaded'
+ unity-license-var-name: 'UNITY_ENCODED_LICENSE'
+ unity-username-var-name: 'UNITY_USERNAME'
+ unity-password-var-name: 'UNITY_PASSWORD'
+ executor:
+ name: 'unity/macos'
+ editor_version: '2021.3.1f1'
+ resource_class: 'large'
+ project-path: 'Unity2D-Demo-Game-CI-CD/src'
+ test-platform: 'playmode'
+ context: unity
+```
+
+#### Professional License
+
+This example shows how to build your project for several platforms using a Pro License.
+
+```yaml
+version: 2.1
+
+orbs:
+ unity: game-ci/unity@x.y
+
+workflows:
+ build-unity-project:
+ jobs:
+ # Linux
+ - unity/test:
+ name: 'test-linux'
+ step-name: 'Check if the tests run and results are uploaded'
+ unity-serial-var-name: 'UNITY_SERIAL'
+ unity-username-var-name: 'UNITY_USERNAME'
+ unity-password-var-name: 'UNITY_PASSWORD'
+ executor:
+ name: 'unity/ubuntu'
+ target_platform: 'linux-il2cpp'
+ editor_version: '2021.3.1f1'
+ resource_class: 'medium'
+ project-path: 'Unity2D-Demo-Game-CI-CD/src'
+ test-platform: 'playmode'
+ context: unity
+
+ # Windows
+ - unity/test:
+ name: 'test-windows'
+ step-name: 'Check if the tests run and results are uploaded'
+ unity-serial-var-name: 'UNITY_SERIAL'
+ unity-username-var-name: 'UNITY_USERNAME'
+ unity-password-var-name: 'UNITY_PASSWORD'
+ executor:
+ name: 'unity/windows-2022'
+ size: 'large'
+ editor_version: '2021.3.2f1'
+ target_platform: 'windows-il2cpp'
+ project-path: 'Unity2D-Demo-Game-CI-CD/src'
+ test-platform: 'playmode'
+ context: unity
+
+ # macOS
+ - unity/test:
+ name: 'test-osx'
+ step-name: 'Check if the tests run and results are uploaded'
+ unity-serial-var-name: 'UNITY_SERIAL'
+ unity-username-var-name: 'UNITY_USERNAME'
+ unity-password-var-name: 'UNITY_PASSWORD'
+ executor:
+ name: 'unity/macos'
+ editor_version: '2021.3.1f1'
+ resource_class: 'large'
+ project-path: 'Unity2D-Demo-Game-CI-CD/src'
+ test-platform: 'playmode'
+ context: unity
+```
diff --git a/versioned_docs/version-3/11-circleci/05-executors.mdx b/versioned_docs/version-3/11-circleci/05-executors.mdx
new file mode 100644
index 00000000..e802e505
--- /dev/null
+++ b/versioned_docs/version-3/11-circleci/05-executors.mdx
@@ -0,0 +1,448 @@
+# Executors
+
+The Orb provides reusable execution environments for you to run your jobs on. The executors
+available are [macOS](#macos), [macOS on Runner](#macos-runner), [Windows](#windows),
+[Windows on Runner](#windows-runner), [Ubuntu on Docker](#ubuntu)
+
+The `macos` and `windows` executors take longer to setup due to the installation of external
+dependencies. This can be mitigated using their [Runner](https://circleci.com/docs/runner-overview)
+variants. As Runner doesn't share the ephemeral nature of the CircleCI cloud executors, the external
+dependencies will already be installed after the first run, decreasing the environment preparation
+time.
+
+Notice that projects using `IL2CPP` as the
+[scripting backend](https://docs.unity3d.com/Manual/scripting-backends.html) should run on the same
+OS as the [build target](/docs/circleci/build#build-target). For example, if you want to build for
+macOS using `IL2CPP`, you must use the [macos](#macos) or [macos-runner](#macos-runner) executors.
+For other use-cases, it's recommended to use [ubuntu](#ubuntu) for all supported platforms as it
+will be cheaper and faster.
+
+### macos
+
+This executor uses the
+[macOS cloud executor](https://circleci.com/docs/configuration-reference#macos) and it's recommended
+for **macOS IL2CPP builds**. As there are no GameCI images for macOS at the moment, the Unity Editor
+and Hub are installed in runtime, leading to longer build times. Should it become an issue, consider
+using [macos-runner](#macos-runner) instead.
+
+#### editor_version
+
+Choose the Unity Editor version that you want to use to build your project. The options available
+can be found on the Unity [archive](https://unity3d.com/get-unity/download/archive).
+
+```yaml
+version: 2.1
+
+orbs:
+ unity: game-ci/unity@x.y
+
+workflows:
+ build-unity-project:
+ jobs:
+ - unity/build:
+ executor:
+ name: 'unity/macos'
+ editor_version: '2021.3.2f1'
+```
+
+- _Default_: `N/A`
+- _Required_: `True`
+- _Type_: `String`
+
+#### resource_class
+
+Choose the
+[resource class](https://circleci.com/docs/configuration-reference#macos-execution-environment) for
+your execution environment. Try increasing it if your environment is running out of memory during
+the build.
+
+```yaml
+version: 2.1
+
+orbs:
+ unity: game-ci/unity@x.y
+
+workflows:
+ build-unity-project:
+ jobs:
+ - unity/build:
+ executor:
+ name: 'unity/macos'
+ resource_class: 'large'
+```
+
+- _Default_: `medium`
+- _Required_: `False`
+- _Type_: `Enum`
+
+#### xcode_version
+
+Choose the [xcode version](https://circleci.com/docs/using-macos#supported-xcode-versions) for your
+execution environment.
+
+```yaml
+version: 2.1
+
+orbs:
+ unity: game-ci/unity@x.y
+
+workflows:
+ build-unity-project:
+ jobs:
+ - unity/build:
+ executor:
+ name: 'unity/macos'
+ xcode_version: '14.0.0'
+```
+
+- _Default_: `13.4.1`
+- _Required_: `False`
+- _Type_: `String`
+
+### macos-runner
+
+This executor uses [self-hosted runner](https://circleci.com/docs/runner-overview). If you are
+unsure how to create or configure it, follow
+[Installing Self-Hosted Runners with the Web App](https://circleci.com/docs/runner-installation) and
+[CircleCI Self-hosted Runner Installation on macOS](https://circleci.com/docs/runner-installation-mac).
+
+The `macos-runner` is an excellent alternative over [macos](#macos) to build macOS IL2CPP with
+faster build times. Its non-ephemeral nature saves times on installing external dependencies after
+the first run. And in addition, you are free to use an agent with hardware exceeding the
+[available](https://circleci.com/docs/configuration-reference#macos-execution-environment) for the
+web macOS executor.
+
+#### editor_version
+
+Choose the Unity Editor version that you want to use to build your project. The options available
+can be found on the Unity [archive](https://unity3d.com/get-unity/download/archive).
+
+```yaml
+version: 2.1
+
+orbs:
+ unity: game-ci/unity@x.y
+
+workflows:
+ build-unity-project:
+ jobs:
+ - unity/build:
+ executor:
+ name: 'unity/macos-runner'
+ editor_version: '2021.3.2f1'
+```
+
+- _Default_: `N/A`
+- _Required_: `True`
+- _Type_: `String`
+
+#### resource_class
+
+Enter your [runner resource class](https://circleci.com/docs/runner-overview). If you are unsure
+what this means, navigate to the beginning of this [sub-section](#macos-runner).
+
+```yaml
+version: 2.1
+
+orbs:
+ unity: game-ci/unity@x.y
+
+workflows:
+ build-unity-project:
+ jobs:
+ - unity/build:
+ executor:
+ name: 'unity/macos-runner'
+ resource_class: 'my_runner_resource_class'
+```
+
+- _Default_: `N/A`
+- _Required_: `True`
+- _Type_: `String`
+
+#### working_directory
+
+Enter the working directory of your runner agent. This will be where the job steps will run.
+
+```yaml
+version: 2.1
+
+orbs:
+ unity: game-ci/unity@x.y
+
+workflows:
+ build-unity-project:
+ jobs:
+ - unity/build:
+ executor:
+ name: 'unity/macos-runner'
+ working_directory: '/var/opt/circleci/unity_working_dir'
+```
+
+- _Default_: `/var/opt/circleci/workdir`
+- _Required_: `False`
+- _Type_: `String`
+
+### ubuntu
+
+This executor uses the
+[Docker cloud executor](https://circleci.com/docs/configuration-reference#docker) with GameCI
+[images](/docs/docker/docker-images). Since the latter ships with the Unity Hub, Editor and all
+necessary dependencies, none of it is installed in runtime - making `ubuntu` more time-efficient
+than [macos](#macos) and [windows](#windows).
+
+For faster and cheaper runs, use it for all [build targets](/docs/circleci/build#build-target) that
+don't require a host OS other than Linux.
+
+#### editor_version
+
+Choose the Unity Editor version that you want to use to build your project. The available options
+can be found on the [versions](/docs/docker/versions) page.
+
+```yaml
+version: 2.1
+
+orbs:
+ unity: game-ci/unity@x.y
+
+workflows:
+ build-unity-project:
+ jobs:
+ - unity/build:
+ executor:
+ name: 'unity/ubuntu'
+ editor_version: '2021.3.2f1'
+```
+
+- _Default_: `N/A`
+- _Required_: `True`
+- _Type_: `String`
+
+#### resource_class
+
+Choose the
+[resource class](https://circleci.com/docs/configuration-reference#docker-execution-environment) for
+your execution environment. Try increasing it if your environment is running out of memory during
+the build.
+
+```yaml
+version: 2.1
+
+orbs:
+ unity: game-ci/unity@x.y
+
+workflows:
+ build-unity-project:
+ jobs:
+ - unity/build:
+ executor:
+ name: 'unity/macos'
+ resource_class: 'large'
+```
+
+- _Default_: `medium`
+- _Required_: `False`
+- _Type_: `Enum`
+
+#### target_platform
+
+Choose the target platform to be used for the GameCI image. The available options can be found on
+the [versions](/docs/docker/versions) page.
+
+```yaml
+version: 2.1
+
+orbs:
+ unity: game-ci/unity@x.y
+
+workflows:
+ build-unity-project:
+ jobs:
+ - unity/build:
+ executor:
+ name: 'unity/macos'
+ target_platform: 'linux-il2cpp'
+```
+
+- _Default_: `N/A`
+- _Required_: `True`
+- _Type_: `Enum`
+
+### windows
+
+This executor uses the
+[Windows cloud executor](https://circleci.com/docs/configuration-reference#available-windows-machine-images)
+with GameCI [images](/docs/docker/docker-images) and it's recommended for **Windows IL2CPP builds**.
+Due to [limitations](/docs/docker/windows-docker-images#limitations), jobs running on the Windows
+executor must install third-party dependencies in runtime, leading to longer build times. Should it
+become an issue, consider using [windows-runner](#windows-runner) instead.
+
+The orb ships with three variants:
+[windows-2019](https://circleci.com/developer/machine/image/windows-server-2019),
+[windows-2019-cuda](https://circleci.com/developer/machine/image/windows-server-2019-cuda) and
+[windows-2022](https://circleci.com/developer/machine/image/windows-server-2022-gui). If you are
+unsure of which one to use, pick `windows-2022`. If you need an executor with GPU, then choose
+`windows-2019-cuda`.
+
+#### editor_version
+
+Choose the Unity Editor version that you want to use to build your project. The available options
+can be found on the [versions](/docs/docker/versions) page.
+
+```yaml
+version: 2.1
+
+orbs:
+ unity: game-ci/unity@x.y
+
+workflows:
+ build-unity-project:
+ jobs:
+ - unity/build:
+ executor:
+ name: 'unity/windows-2022'
+ ## or name: "unity/windows-2019"
+ ## or name: "unity/windows-2019-cuda"
+ editor_version: '2021.3.2f1'
+```
+
+- _Default_: `N/A`
+- _Required_: `True`
+- _Type_: `String`
+
+#### size
+
+Choose the [size](https://circleci.com/docs/configuration-reference#windows-execution) of your
+execution environment resource class. Try increasing it if your environment is running out of memory
+during the build.
+
+```yaml
+version: 2.1
+
+orbs:
+ unity: game-ci/unity@x.y
+
+workflows:
+ build-unity-project:
+ jobs:
+ - unity/build:
+ executor:
+ name: 'unity/windows-2022'
+ ## or name: "unity/windows-2019"
+ ## or name: "unity/windows-2019-cuda"
+ resource_class: 'xlarge'
+```
+
+- _Default_: `large`
+- _Required_: `False`
+- _Type_: `Enum`
+
+#### target_platform
+
+Choose the target platform to be used for the GameCI image. The available options can be found on
+the [versions](/docs/docker/versions) page.
+
+```yaml
+version: 2.1
+
+orbs:
+ unity: game-ci/unity@x.y
+
+workflows:
+ build-unity-project:
+ jobs:
+ - unity/build:
+ executor:
+ name: 'unity/windows-2022'
+ ## or name: "unity/windows-2019"
+ ## or name: "unity/windows-2019-cuda"
+ target_platform: 'windows-il2cpp'
+```
+
+- _Default_: `N/A`
+- _Required_: `True`
+- _Type_: `Enum`
+
+### windows-runner
+
+This executor uses [self-hosted runner](https://circleci.com/docs/runner-overview). If you are
+unsure how to create or configure it, follow
+[Installing Self-Hosted Runners with the Web App](https://circleci.com/docs/runner-installation) and
+[CircleCI Self-hosted Runner Installation on Windows](https://circleci.com/docs/runner-installation-windows).
+
+The `windows-runner` is an excellent alternative over [windows](#windows) to build Windows IL2CPP
+with faster build times. Its non-ephemeral nature saves times on installing external dependencies
+after the first run. And in addition, you are free to use an agent with hardware exceeding the
+[available](https://circleci.com/docs/configuration-reference#windows-execution) for the web Windows
+executor.
+
+#### editor_version
+
+Choose the Unity Editor version that you want to use to build your project. The available options
+can be found on the [versions](/docs/docker/versions) page.
+
+```yaml
+version: 2.1
+
+orbs:
+ unity: game-ci/unity@x.y
+
+workflows:
+ build-unity-project:
+ jobs:
+ - unity/build:
+ executor:
+ name: 'unity/windows-runner'
+ editor_version: '2021.3.2f1'
+```
+
+- _Default_: `N/A`
+- _Required_: `True`
+- _Type_: `String`
+
+#### resource_class
+
+Enter your [runner resource class](https://circleci.com/docs/runner-overview). If you are unsure
+what this means, navigate to the beginning of [this section](#windows-runner).
+
+```yaml
+version: 2.1
+
+orbs:
+ unity: game-ci/unity@x.y
+
+workflows:
+ build-unity-project:
+ jobs:
+ - unity/build:
+ executor:
+ name: 'unity/windows-runner'
+ resource_class: 'my_runner_resource_class'
+```
+
+- _Default_: `N/A`
+- _Required_: `True`
+- _Type_: `String`
+
+#### working_directory
+
+Enter the working directory of your runner agent. This is be where the job steps will run from.
+
+```yaml
+version: 2.1
+
+orbs:
+ unity: game-ci/unity@x.y
+
+workflows:
+ build-unity-project:
+ jobs:
+ - unity/build:
+ executor:
+ name: 'unity/windows-runner'
+ working_directory: 'C:\Users\circleci\AppData\Local\Temp\Unity_Working_Dir'
+```
+
+- _Default_: `C:\Users\circleci\AppData\Local\Temp\Workdir`
+- _Required_: `False`
+- _Type_: `String`
diff --git a/versioned_docs/version-3/11-circleci/_category_.yaml b/versioned_docs/version-3/11-circleci/_category_.yaml
new file mode 100644
index 00000000..d61b697c
--- /dev/null
+++ b/versioned_docs/version-3/11-circleci/_category_.yaml
@@ -0,0 +1,5 @@
+---
+position: 5.0
+label: CircleCI
+collapsible: true
+collapsed: true
diff --git a/versioned_docs/version-3/index.mdx b/versioned_docs/version-3/index.mdx
new file mode 100644
index 00000000..03ac8283
--- /dev/null
+++ b/versioned_docs/version-3/index.mdx
@@ -0,0 +1,25 @@
+---
+sidebar_position: 1
+---
+
+# Introduction
+
+This site hosts all documentation for GameCI, and will help you setup Continuous Integration for
+your game projects.
+
+Continuous Integration is a widely-used practice where automated pipelines check the latest code
+changes actually work, before merging them into the main branch. This helps developers stay in the
+flow and release faster and (ultimately) with more confidence.
+
+Follow the development on [GitHub](https://github.com/game-ci/documentation).
+
+
+
+Join the discussion on [Discord](https://game.ci/discord).
diff --git a/versioned_sidebars/version-3-sidebars.json b/versioned_sidebars/version-3-sidebars.json
new file mode 100644
index 00000000..cff0c94e
--- /dev/null
+++ b/versioned_sidebars/version-3-sidebars.json
@@ -0,0 +1,8 @@
+{
+ "defaultSidebar": [
+ {
+ "type": "autogenerated",
+ "dirName": "."
+ }
+ ]
+}
diff --git a/versions.json b/versions.json
index d34f7a24..89a34a9b 100644
--- a/versions.json
+++ b/versions.json
@@ -1 +1 @@
-["2", "1"]
+["3", "2", "1"]