ci: unity6 mac (#594) #901
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
--- | |
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" |