Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
d117e90
Add Linux ARM64 support
bitsandfoxes Oct 22, 2026
a9a6d19
Link changelog entry to PR
bitsandfoxes Oct 22, 2026
35f712f
Merge branch 'main' into feat/linux-arm64-support
bitsandfoxes Oct 22, 2026
5bc2ddb
Skip the va_list copy on Linux arm64
bitsandfoxes Oct 23, 2026
7d8982e
Build the Linux x86_64 SDK on Ubuntu 22.04
bitsandfoxes Oct 23, 2026
6645a37
Explain the Ubuntu 22.04 pin for Linux SDK builds
bitsandfoxes Oct 23, 2026
2cf3b95
Shorten the Ubuntu 22.04 pin comment
bitsandfoxes Oct 23, 2026
49bfa7b
Read the Linux player architecture once so copy, cleanup and symbol u…
bitsandfoxes Oct 23, 2026
30f5b60
Fall back to the branch run when a downloaded native SDK lacks the ex…
bitsandfoxes Oct 23, 2026
cc2f4fe
Copy the va_list before each vsnprintf call on Linux arm64
bitsandfoxes Oct 23, 2026
78a61d8
Merge branch 'main' into feat/linux-arm64-support
bitsandfoxes Oct 27, 2026
0283c9e
Add Linux ARM64 server integration test and use Unity's ARM64 plugin …
bitsandfoxes Oct 27, 2026
f3e9d14
Build the Linux arm64 server test on Ubuntu with the Unity CLI
bitsandfoxes Oct 27, 2026
cb3ed1e
Pin the Linux arm64 server build to Ubuntu 24.04
bitsandfoxes Oct 27, 2026
5b28983
Run Unity 6 Linux CI jobs with the Unity CLI instead of GameCI
bitsandfoxes Oct 27, 2026
fd4fd3e
Gate the Unity CLI jobs on the Unity version number and explain the 2…
bitsandfoxes Oct 27, 2026
c287a8c
Merge branch 'main' into feat/linux-arm64-support
bitsandfoxes Oct 28, 2026
0a5768d
Read the Linux architecture from the build settings and test ARM64 wi…
bitsandfoxes Oct 28, 2026
a906d66
Use ARM64 in the changelog
bitsandfoxes Oct 28, 2026
c1d2a02
Merge commit 'a906d66d' into HEAD
bitsandfoxes Oct 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -107,12 +107,24 @@ jobs:
name: Linux-sdk
path: package-dev/Plugins/Linux/Sentry~

- name: Download LinuxArm64 SDK
uses: ./.github/actions/wait-for-artifact
with:
name: LinuxArm64-sdk
path: package-dev/Plugins/Linux/Sentry~

- name: Download LinuxNative SDK
uses: ./.github/actions/wait-for-artifact
with:
name: LinuxNative-sdk
path: package-dev/Plugins/Linux/SentryNative~

- name: Download LinuxNativeArm64 SDK
uses: ./.github/actions/wait-for-artifact
with:
name: LinuxNativeArm64-sdk
path: package-dev/Plugins/Linux/SentryNative~

- name: Download Windows SDK
uses: ./.github/actions/wait-for-artifact
with:
Expand Down
56 changes: 50 additions & 6 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,10 +39,17 @@ jobs:
include:
- target: Android
host: ubuntu-latest
# 22.04 keeps the required glibc version low.
- target: Linux
host: ubuntu-latest
host: ubuntu-22.04
- target: LinuxNative
host: ubuntu-latest
host: ubuntu-22.04
- target: Linux
arch: Arm64
host: ubuntu-22.04-arm
- target: LinuxNative
arch: Arm64
host: ubuntu-22.04-arm
- target: Windows
host: windows-latest
- target: WindowsNative
Expand All @@ -54,6 +61,7 @@ jobs:
uses: ./.github/workflows/sdk.yml
with:
target: ${{ matrix.target }}
arch: ${{ matrix.arch }}
runsOn: ${{ matrix.host }}

build-unity-sdk:
Expand Down Expand Up @@ -130,12 +138,13 @@ jobs:
with:
unity-version: ${{ matrix.unity-version }}

# A Linux, docker-based build to prepare a WebGL player. The tests run in `test-run-webgl`.
# A Linux build to prepare a WebGL player. The tests run in `test-run-webgl`.
test-build-webgl:
name: Build ${{ matrix.platform }} ${{ matrix.unity-version }} Test
if: ${{ !startsWith(github.ref, 'refs/heads/release/') }}
needs: [test-create, create-unity-matrix]
runs-on: ubuntu-latest
# Unity 6 runs on the Unity CLI, on 24.04: the newest Ubuntu Unity supports (26.04 lacks libxml2.so.2 for IL2CPP).
runs-on: ${{ fromJSON(matrix.unity-version) >= 6000 && 'ubuntu-24.04' || 'ubuntu-latest' }}
strategy:
fail-fast: false
matrix:
Expand All @@ -144,8 +153,6 @@ jobs:
include:
- platform: WebGL
build_platform: WebGL
env:
UNITY_PATH: docker exec unity unity-editor
steps:
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
Expand All @@ -161,13 +168,15 @@ jobs:
swap-storage: true

- name: Docker Login
if: ${{ fromJSON(matrix.unity-version) < 6000 }}
uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Start the Unity docker container
if: ${{ fromJSON(matrix.unity-version) < 6000 }}
run: ./scripts/ci-docker.sh "$UNITY_VERSION" "$PLATFORM_WITH_SUFFIX" "$UNITY_LICENSE_SERVER_CONFIG"
shell: bash
env:
Expand All @@ -177,6 +186,12 @@ jobs:
PLATFORM_WITH_SUFFIX: ${{ matrix.platform }}${{ matrix.image-suffix }}
UNITY_LICENSE_SERVER_CONFIG: ${{ secrets.UNITY_LICENSE_SERVER_CONFIG }}

- name: Setup Unity
if: ${{ fromJSON(matrix.unity-version) >= 6000 }}
run: ./scripts/setup-unity.ps1 -UnityVersion "${{ matrix.unity-version }}" -Modules webgl
env:
UNITY_LICENSE_SERVER_CONFIG: ${{ secrets.UNITY_LICENSE_SERVER_CONFIG }}

- name: Download IntegrationTest project
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
Expand Down Expand Up @@ -448,6 +463,21 @@ jobs:
with:
unity-version: ${{ fromJSON(needs.create-unity-matrix.outputs.unity-matrix).unity-version[0] }}

test-build-linux-arm64:
# Unity ships an arm64 Linux player only as an IL2CPP dedicated server, from 6000.3 on. One version,
# Native backend only: the x86_64 matrix already covers the version spread and Breakpad.
# The version is the newest matrix entry, so Unity-bump PRs for older versions skip it.
name: Build Linux Server arm64 ${{ needs.create-unity-matrix.outputs.unity-latest }} Integration Test
if: ${{ !startsWith(github.ref, 'refs/heads/release/') && fromJSON(needs.create-unity-matrix.outputs.unity-latest) >= 6000.3 }}
needs: [test-create, create-unity-matrix]
secrets:
UNITY_LICENSE_SERVER_CONFIG: ${{ secrets.UNITY_LICENSE_SERVER_CONFIG }}
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
SENTRY_TEST_DSN: ${{ secrets.SENTRY_TEST_DSN }}
uses: ./.github/workflows/test-build-linux-arm64.yml
with:
unity-version: ${{ needs.create-unity-matrix.outputs.unity-latest }}

test-build-windows-mono:
# The Mono scripting backend resolves P/Invokes differently than IL2CPP, so it needs its own
# player. One version, default (Crashpad) backend only: the IL2CPP matrix already covers the
Expand Down Expand Up @@ -517,6 +547,20 @@ jobs:
platform: windows
backend: ${{ matrix.backend }}

test-run-linux-arm64:
name: Run Linux arm64 native ${{ needs.create-unity-matrix.outputs.unity-latest }} Integration Test
if: ${{ !startsWith(github.ref, 'refs/heads/release/') && fromJSON(needs.create-unity-matrix.outputs.unity-latest) >= 6000.3 }}
needs: [test-build-linux-arm64, create-unity-matrix]
secrets:
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
SENTRY_TEST_DSN: ${{ secrets.SENTRY_TEST_DSN }}
uses: ./.github/workflows/test-run-desktop.yml
with:
unity-version: ${{ needs.create-unity-matrix.outputs.unity-latest }}
platform: linux
architecture: arm64
backend: native

test-run-windows-x86:
name: Run Windows x86 native ${{ fromJSON(needs.create-unity-matrix.outputs.unity-matrix).unity-version[0] }} Integration Test
if: ${{ !startsWith(github.ref, 'refs/heads/release/') }}
Expand Down
7 changes: 6 additions & 1 deletion .github/workflows/create-unity-matrix.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ on:
unity-matrix:
description: 'Unity version matrix'
value: ${{ jobs.create-unity-matrix.outputs.unity-matrix }}
unity-latest:
description: 'Newest Unity version in the matrix'
value: ${{ jobs.create-unity-matrix.outputs.unity-latest }}

env:
# Unity versions used in PRs
Expand All @@ -28,6 +31,7 @@ jobs:
runs-on: ubuntu-latest
outputs:
unity-matrix: ${{ steps.set-matrix.outputs.matrix }}
unity-latest: ${{ steps.set-matrix.outputs.latest }}
steps:
- name: Set Unity version matrices based on event type
id: set-matrix
Expand All @@ -49,4 +53,5 @@ jobs:
fi

# Unity version matrix
echo "matrix={\"unity-version\":$versions}" >> $GITHUB_OUTPUT
echo "matrix={\"unity-version\":$versions}" >> $GITHUB_OUTPUT
echo "latest=$(jq -r '.[-1]' <<< "$versions")" >> $GITHUB_OUTPUT
11 changes: 8 additions & 3 deletions .github/workflows/sdk.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,16 @@ on:
target:
required: true
type: string
arch:
required: false
type: string
default: ""

env:
DOTNET_CLI_TELEMETRY_OPTOUT: 1
DOTNET_NOLOGO: 1
TARGET: ${{ inputs.target }}
ARTIFACT: ${{ inputs.target }}${{ inputs.arch }}

jobs:
build:
Expand Down Expand Up @@ -63,7 +68,7 @@ jobs:
# hash of package/package.json for cache busting on release builds (version bump)
path: |
package-dev/Plugins
key: sdk=${{ env.TARGET }}-${{ hashFiles('submodules-status', 'package/package.json', 'Directory.Build.targets', 'build/native-sdks.targets', 'sdk-static/**', 'scripts/build-cocoa-sdk.ps1', 'scripts/build-native-ndk-local.ps1') }}
key: sdk=${{ env.ARTIFACT }}-${{ hashFiles('submodules-status', 'package/package.json', 'Directory.Build.targets', 'build/native-sdks.targets', 'sdk-static/**', 'scripts/build-cocoa-sdk.ps1', 'scripts/build-native-ndk-local.ps1') }}

- name: Installing Linux Dependencies
if: ${{ (env.TARGET == 'Linux' || env.TARGET == 'LinuxNative') && steps.cache.outputs.cache-hit != 'true' }}
Expand Down Expand Up @@ -143,15 +148,15 @@ jobs:
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
if: ${{ env.TARGET == 'Linux' }}
with:
name: ${{ env.TARGET }}-sdk
name: ${{ env.ARTIFACT }}-sdk
path: package-dev/Plugins/Linux/Sentry~
# Lower retention period - we only need this to retry CI.
retention-days: 14

- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
if: ${{ env.TARGET == 'LinuxNative' }}
with:
name: ${{ env.TARGET }}-sdk
name: ${{ env.ARTIFACT }}-sdk
path: package-dev/Plugins/Linux/SentryNative~
# Lower retention period - we only need this to retry CI.
retention-days: 14
Expand Down
27 changes: 25 additions & 2 deletions .github/workflows/test-build-android.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,30 +20,49 @@ defaults:
jobs:
build:
name: ${{ inputs.unity-version }}
runs-on: ubuntu-latest-4-cores
# Unity 6 runs on the Unity CLI, on 24.04: the newest Ubuntu Unity supports (26.04 lacks libxml2.so.2 for IL2CPP).
runs-on: ${{ fromJSON(inputs.unity-version) >= 6000 && 'ubuntu-24.04' || 'ubuntu-latest-4-cores' }}
env:
GITHUB_ACTOR: ${{ github.actor }}
UNITY_PATH: docker exec unity unity-editor
UNITY_VERSION: ${{ inputs.unity-version }}

steps:
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

- name: Free Disk Space
if: ${{ fromJSON(inputs.unity-version) >= 6000 }}
uses: jlumbroso/free-disk-space@f68fdb76e2ea636224182cfb7377ff9a1708f9b8 # v1.3.0
with:
android: true
dotnet: false
haskell: true
large-packages: false
docker-images: false
swap-storage: true

- name: Docker Login
if: ${{ fromJSON(inputs.unity-version) < 6000 }}
uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0
with:
registry: ghcr.io
username: ${{ env.GITHUB_ACTOR }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Start the Unity docker container
if: ${{ fromJSON(inputs.unity-version) < 6000 }}
run: ./scripts/ci-docker.sh "$UNITY_VERSION" 'android' "$UNITY_LICENSE_SERVER_CONFIG"
shell: bash
env:
UNITY_LICENSE_SERVER_CONFIG: ${{ secrets.UNITY_LICENSE_SERVER_CONFIG }}
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}

- name: Setup Unity
if: ${{ fromJSON(inputs.unity-version) >= 6000 }}
run: ./scripts/setup-unity.ps1 -UnityVersion "$env:UNITY_VERSION" -Modules android
env:
UNITY_LICENSE_SERVER_CONFIG: ${{ secrets.UNITY_LICENSE_SERVER_CONFIG }}

- name: Download IntegrationTest project
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
Expand Down Expand Up @@ -105,6 +124,8 @@ jobs:

- name: Export APK - Runtime Initialization
run: ./test/Scripts.Integration.Test/build-project.ps1 -UnityPath "$env:UNITY_PATH" -Platform "Android" -UnityVersion "$env:UNITY_VERSION"
env:
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}

- name: Assert symbols and sources were uploaded (Runtime)
run: ./test/Scripts.Integration.Test/assert-symbol-upload.ps1 -LogPath samples/IntegrationTest/Logs/sentry-symbols-upload.log
Expand Down Expand Up @@ -144,6 +165,8 @@ jobs:

- name: Export APK - Build-Time Initialization
run: ./test/Scripts.Integration.Test/build-project.ps1 -UnityPath "$env:UNITY_PATH" -Platform "Android" -UnityVersion "$env:UNITY_VERSION"
env:
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}

- name: Assert symbols and sources were uploaded (Build-Time)
run: ./test/Scripts.Integration.Test/assert-symbol-upload.ps1 -LogPath samples/IntegrationTest/Logs/sentry-symbols-upload.log
Expand Down
14 changes: 12 additions & 2 deletions .github/workflows/test-build-ios.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@ defaults:
jobs:
build:
name: ${{ inputs.unity-version }}
runs-on: ubuntu-latest
# Unity 6 runs on the Unity CLI, on 24.04: the newest Ubuntu Unity supports (26.04 lacks libxml2.so.2 for IL2CPP).
runs-on: ${{ fromJSON(inputs.unity-version) >= 6000 && 'ubuntu-24.04' || 'ubuntu-latest' }}
strategy:
matrix:
include:
Expand All @@ -29,27 +30,34 @@ jobs:
build_platform: iOS
env:
GITHUB_ACTOR: ${{ github.actor }}
UNITY_PATH: docker exec unity unity-editor
UNITY_VERSION: ${{ inputs.unity-version }}

steps:
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

- name: Docker Login
if: ${{ fromJSON(inputs.unity-version) < 6000 }}
uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0
with:
registry: ghcr.io
username: ${{ env.GITHUB_ACTOR }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Start the Unity docker container
if: ${{ fromJSON(inputs.unity-version) < 6000 }}
run: ./scripts/ci-docker.sh "$UNITY_VERSION" "iOS" "$UNITY_LICENSE_SERVER_CONFIG"
shell: bash
env:
UNITY_LICENSE_SERVER_CONFIG: ${{ secrets.UNITY_LICENSE_SERVER_CONFIG }}
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}

- name: Setup Unity
if: ${{ fromJSON(inputs.unity-version) >= 6000 }}
run: ./scripts/setup-unity.ps1 -UnityVersion "$env:UNITY_VERSION" -Modules ios
env:
UNITY_LICENSE_SERVER_CONFIG: ${{ secrets.UNITY_LICENSE_SERVER_CONFIG }}

- name: Download IntegrationTest project
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
Expand Down Expand Up @@ -127,6 +135,7 @@ jobs:
run: ./test/Scripts.Integration.Test/build-project.ps1 -UnityPath "$env:UNITY_PATH" -Platform "$env:BUILD_PLATFORM" -UnityVersion "$env:UNITY_VERSION"
env:
BUILD_PLATFORM: ${{ matrix.build_platform }}
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}

# We create tar explicitly because upload-artifact is slow for many files.
- name: Create archive (runtime initialization)
Expand Down Expand Up @@ -155,6 +164,7 @@ jobs:
run: ./test/Scripts.Integration.Test/build-project.ps1 -UnityPath "$env:UNITY_PATH" -Platform "$env:BUILD_PLATFORM" -UnityVersion "$env:UNITY_VERSION"
env:
BUILD_PLATFORM: ${{ matrix.build_platform }}
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}

- name: Create archive (build-time initialization)
run: |
Expand Down
Loading
Loading