Skip to content

ci: unity6 mac (#594) #901

ci: unity6 mac (#594)

ci: unity6 mac (#594) #901

Workflow file for this run

---
name: UI Tests 🧪
on:
workflow_dispatch:
inputs:
targetPlatform:
description: "Select the platform to build and test"
required: true
default: "All"
type: choice
options:
- All
- StandaloneOSX # Builds Unity 2021 macOS only
- StandaloneOSX-Unity6 # Builds Unity 6 macOS only
- StandaloneWindows64
- Android
- iOS
push:
branches: [main]
pull_request:
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
build:
name: Build ${{ matrix.targetPlatform }} for AltTester 🛠️
runs-on: ubuntu-latest-8-cores
strategy:
fail-fast: false
matrix:
include:
# Unity 2021 macOS build
- targetPlatform: StandaloneOSX
buildMethod: MacBuilder.BuildForAltTester
buildPath: sample/Builds/MacOS
projectPath: sample
unityVersion: 2021.3.26f1
- targetPlatform: StandaloneWindows64
buildMethod: WindowsBuilder.BuildForAltTester
buildPath: sample/Builds/Windows64
projectPath: sample
unityVersion: 2021.3.26f1
- targetPlatform: Android
buildMethod: MobileBuilder.BuildForAltTester
buildPath: sample/Builds/Android
projectPath: sample
unityVersion: 2021.3.26f1
steps:
- uses: actions/checkout@v3
if: github.event_name != 'workflow_dispatch' || github.event.inputs.targetPlatform == 'All' || github.event.inputs.targetPlatform == matrix.targetPlatform
with:
lfs: true
- uses: actions/cache@v3
if: github.event_name != 'workflow_dispatch' || github.event.inputs.targetPlatform == 'All' || github.event.inputs.targetPlatform == matrix.targetPlatform
with:
path: Library
key: Library-${{ matrix.targetPlatform }}-${{ hashFiles(format('{0}/Assets/**', matrix.projectPath), format('{0}/Packages/**', matrix.projectPath), format('{0}/ProjectSettings/**', matrix.projectPath)) }}
restore-keys: |
Library-${{ matrix.targetPlatform }}
Library-
- name: Build project
if: github.event_name != 'workflow_dispatch' || github.event.inputs.targetPlatform == 'All' || github.event.inputs.targetPlatform == matrix.targetPlatform
uses: game-ci/unity-builder@v4
env:
UNITY_EMAIL: ${{ secrets.UNITY_EMAIL }}
UNITY_PASSWORD: ${{ secrets.UNITY_PASSWORD }}
UNITY_SERIAL: ${{ secrets.UNITY_SERIAL }}
with:
targetPlatform: ${{ contains(matrix.targetPlatform, 'Unity6') && 'StandaloneOSX' || matrix.targetPlatform }}
projectPath: ${{ matrix.projectPath }}
unityVersion: ${{ matrix.unityVersion }}
buildMethod: ${{ matrix.buildMethod }}
customParameters: -logFile logFile.log -quit -batchmode
artifactsPath: ${{ matrix.buildPath }}
- name: Ensure build path exists
if: github.event_name != 'workflow_dispatch' || github.event.inputs.targetPlatform == 'All' || github.event.inputs.targetPlatform == matrix.targetPlatform
run: mkdir -p ${{ matrix.buildPath }}
- name: Upload artifact
if: github.event_name != 'workflow_dispatch' || github.event.inputs.targetPlatform == 'All' || github.event.inputs.targetPlatform == matrix.targetPlatform
uses: actions/upload-artifact@v4
with:
name: Build-${{ matrix.targetPlatform }}
path: ${{ matrix.buildPath }}
build-and-test-unity6-macos: # Unity 6 requires a full build cycle to compile AltTester packages properly. This doesn't work well in Game CI, so we have to build it manually.
name: Build & Test Unity 6 macOS 🛠️🧪
runs-on: [self-hosted, macOS]
concurrency:
group: ui-tests-email-inbox-macos
cancel-in-progress: false # Let tests complete rather than canceling
if: github.event_name != 'workflow_dispatch' || github.event.inputs.targetPlatform == 'All' || github.event.inputs.targetPlatform == 'StandaloneOSX-Unity6'
steps:
- name: Cleanup old builds
run: |
# Remove previous build to save space
rm -rf sample-unity6/Tests/* 2>/dev/null || true
- uses: actions/checkout@v3
with:
lfs: true
- name: Force clean package resolution
run: |
echo "Removing Library folder to force clean package resolution..."
rm -rf sample-unity6/Library
echo "✅ Library folder removed"
- name: First build (resolves packages)
run: |
echo "Running first build to trigger package resolution..."
export TMPDIR="/Users/svc_buildsdk/tmp"
mkdir -p "$TMPDIR"
mkdir -p sample-unity6/Tests
/Applications/Unity/Hub/Editor/6000.0.58f1/Unity.app/Contents/MacOS/Unity -projectPath "${{ github.workspace }}/sample-unity6" -executeMethod "MacBuilderUnity6.BuildForAltTester" -logFile "${{ github.workspace }}/sample-unity6/first-build-log.txt" -quit -batchmode --buildPath "${{ github.workspace }}/sample-unity6/Tests/Sample Unity 6 macOS" || true
echo "First build completed (may have failed, that's ok). Checking for AltTester..."
if ls -la "${{ github.workspace }}/sample-unity6/Library/PackageCache/" | grep alttester; then
echo "✅ AltTester found in PackageCache after first build"
else
echo "⚠️ AltTester not found yet, but will be ready for second build"
fi
- name: Build Unity 6 macOS with command line (second build with packages ready)
run: |
echo "Building Unity 6 macOS using command line..."
export TMPDIR="/Users/svc_buildsdk/tmp"
mkdir -p "$TMPDIR"
mkdir -p sample-unity6/Tests
/Applications/Unity/Hub/Editor/6000.0.58f1/Unity.app/Contents/MacOS/Unity -projectPath "${{ github.workspace }}/sample-unity6" -executeMethod "MacBuilderUnity6.BuildForAltTester" -logFile "${{ github.workspace }}/sample-unity6/build-log.log" -quit -batchmode --buildPath "${{ github.workspace }}/sample-unity6/Tests/Sample Unity 6 macOS"
echo "Build completed. Checking for build output..."
ls -la sample-unity6/Tests/
- name: Create temporary keychain
run: |
security list-keychains
security delete-keychain temporary || true
security list-keychains
security create-keychain -p "" temporary
security default-keychain -s temporary
security unlock-keychain -p "" temporary
security set-keychain-settings -lut 600 temporary
- name: Make macOS artifact executable
run: chmod -R +x 'sample-unity6/Tests/Sample Unity 6 macOS.app/Contents/MacOS'
- uses: actions/setup-python@v4
with:
python-version: "3.13"
- name: Install dependencies
run: pip install -r sample-unity6/Tests/requirements-desktop.txt
- name: Run UI tests
env:
UNITY_APP_PATH: Sample Unity 6 macOS.app
UNITY_APP_NAME: Sample Unity 6 macOS
MAILSLURP_API_KEY: ${{ secrets.MAILSLURP_API_KEY }}
BROWSERSTACK_USERNAME: ${{ secrets.BROWSERSTACK_USERNAME }}
BROWSERSTACK_ACCESS_KEY: ${{ secrets.BROWSERSTACK_ACCESS_KEY }}
working-directory: sample-unity6/Tests
run: pytest -xs test/test_mac.py::MacTest
- name: Remove temporary keychain
if: always()
run: |
security list-keychains
security delete-keychain temporary
security default-keychain -s ~/Library/Keychains/login.keychain-db
security list-keychains -d user -s ~/Library/Keychains/login.keychain-db
security list-keychains
- name: Upload first build log
if: always()
uses: actions/upload-artifact@v4
with:
name: Unity6-First-Build-Log
path: sample-unity6/first-build-log.txt
- name: Upload build log
if: always()
uses: actions/upload-artifact@v4
with:
name: Unity6-Build-Log
path: sample-unity6/build-log.log
test:
name: Run ${{ matrix.targetPlatform }} UI tests 🧪
needs: build
strategy:
matrix:
include:
- targetPlatform: StandaloneOSX
runs-on: [self-hosted, macOS]
test_script: pytest -xs test/test_mac.py::MacTest
projectPath: sample
unityAppName: SampleApp
unityAppExtension: .app
concurrency_group: macos
- targetPlatform: StandaloneWindows64
runs-on: [self-hosted, windows]
test_script: python -m pytest -xs test/test_windows.py::WindowsTest
projectPath: sample
unityAppName: Immutable Sample
unityAppExtension: .exe
concurrency_group: windows
# - targetPlatform: Android
# runs-on: [ self-hosted, macOS ]
# test_script: browserstack-sdk pytest -s ./test/test_android.py --browserstack.config "browserstack.android.yml"
concurrency:
group: ui-tests-email-inbox-${{ matrix.concurrency_group }}
cancel-in-progress: false # Let tests complete rather than canceling
runs-on: ${{ matrix.runs-on }}
steps:
- uses: actions/checkout@v3
if: github.event_name != 'workflow_dispatch' || github.event.inputs.targetPlatform == 'All' || github.event.inputs.targetPlatform == matrix.targetPlatform
with:
lfs: true
- name: Create temporary keychain
if: contains(matrix.targetPlatform, 'StandaloneOSX') && (github.event_name != 'workflow_dispatch' || github.event.inputs.targetPlatform == 'All' || github.event.inputs.targetPlatform == matrix.targetPlatform)
run: |
security list-keychains
security delete-keychain temporary || true
security list-keychains
security create-keychain -p "" temporary
security default-keychain -s temporary
security unlock-keychain -p "" temporary
security set-keychain-settings -lut 600 temporary
- uses: actions/download-artifact@v4
if: github.event_name != 'workflow_dispatch' || github.event.inputs.targetPlatform == 'All' || github.event.inputs.targetPlatform == matrix.targetPlatform
with:
name: Build-${{ matrix.targetPlatform }}
path: ${{ matrix.projectPath }}/Tests
- name: Make macOS artifact executable
if: |
contains(matrix.targetPlatform, 'StandaloneOSX') &&
(github.event_name != 'workflow_dispatch' || github.event.inputs.targetPlatform == 'All' || github.event.inputs.targetPlatform == matrix.targetPlatform)
run: chmod -R +x '${{ matrix.projectPath }}/Tests/${{ matrix.unityAppName }}.app/Contents/MacOS'
- uses: actions/setup-python@v4
if: github.event_name != 'workflow_dispatch' || github.event.inputs.targetPlatform == 'All' || github.event.inputs.targetPlatform == matrix.targetPlatform
with:
python-version: "3.13"
- name: Install dependencies (Windows)
if: matrix.targetPlatform == 'StandaloneWindows64' && (github.event_name != 'workflow_dispatch' || github.event.inputs.targetPlatform == 'All' || github.event.inputs.targetPlatform == 'StandaloneWindows64')
run: pip install -r "${{ matrix.projectPath }}/Tests/requirements-desktop.txt"
- name: Install dependencies (Mac)
if: contains(matrix.targetPlatform, 'StandaloneOSX') && (github.event_name != 'workflow_dispatch' || github.event.inputs.targetPlatform == 'All' || github.event.inputs.targetPlatform == matrix.targetPlatform)
run: pip install -r "${{ matrix.projectPath }}/Tests/requirements-desktop.txt"
- name: Run UI tests
if: github.event_name != 'workflow_dispatch' || github.event.inputs.targetPlatform == 'All' || github.event.inputs.targetPlatform == matrix.targetPlatform
env:
UNITY_APP_PATH: ${{ matrix.unityAppName }}${{ matrix.unityAppExtension }}
UNITY_APP_NAME: ${{ matrix.unityAppName }}
MAILSLURP_API_KEY: ${{ secrets.MAILSLURP_API_KEY }}
BROWSERSTACK_USERNAME: ${{ secrets.BROWSERSTACK_USERNAME }}
BROWSERSTACK_ACCESS_KEY: ${{ secrets.BROWSERSTACK_ACCESS_KEY }}
working-directory: ${{ matrix.projectPath }}/Tests
run: ${{ matrix.test_script }}
- name: Remove temporary keychain
if: contains(matrix.targetPlatform, 'StandaloneOSX') && (github.event_name != 'workflow_dispatch' || github.event.inputs.targetPlatform == 'All' || github.event.inputs.targetPlatform == matrix.targetPlatform)
run: |
security list-keychains
security delete-keychain temporary
security default-keychain -s ~/Library/Keychains/login.keychain-db
security list-keychains -d user -s ~/Library/Keychains/login.keychain-db
security list-keychains
build-ios: #test-ios:
name: Run iOS build #UI tests 🧪
needs:
- build
- test
runs-on: [ self-hosted, macOS ]
if: github.event_name != 'workflow_dispatch' || github.event.inputs.targetPlatform == 'All' || github.event.inputs.targetPlatform == 'iOS'
steps:
- uses: actions/checkout@v3
with:
lfs: true
- name: Build iOS app
working-directory: sample
run: ./build_ios.sh
# - uses: actions/setup-python@v4
# with:
# python-version: "3.13"
# - name: Install dependencies
# run: pip install -r "sample/Tests/requirements-mobile.txt"
# - name: Run UI tests
# env:
# MAILSLURP_API_KEY: ${{ secrets.MAILSLURP_API_KEY }}
# BROWSERSTACK_USERNAME: ${{ secrets.BROWSERSTACK_USERNAME }}
# BROWSERSTACK_ACCESS_KEY: ${{ secrets.BROWSERSTACK_ACCESS_KEY }}
# working-directory: sample/Tests/test/ios
# run: browserstack-sdk pytest -xs ./test_ios.py --browserstack.config "browserstack.ios.yml"