Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
3609952
Add UE GitHub image generation workflow
tustanivsky Apr 14, 2026
e64bce1
Rename workflow
tustanivsky Apr 14, 2026
8f56408
Temp push trigger
tustanivsky Apr 14, 2026
eb77745
Test images size
tustanivsky Jun 12, 2026
f717d3e
Test clean disk
tustanivsky Jun 13, 2026
8c5dfb4
Test linux custom image build
tustanivsky Jun 15, 2026
1acf660
Test new large runners
tustanivsky Jun 15, 2026
016eb23
Test
tustanivsky Jun 17, 2026
fa35d44
Remove snapshot from Windows image creation job
tustanivsky Jun 18, 2026
fcbe304
Add snapshot to create-image job in workflow
tustanivsky Jun 18, 2026
50d8c61
Drop 5.2 and 5.3 for Windows (size optimization)
tustanivsky Jun 19, 2026
8e81b12
Switch Linux build to Android image which includes both Linux and And…
tustanivsky Jun 19, 2026
81e6750
Add dedicated image generation for Android
tustanivsky Jun 19, 2026
57291d7
Add UE 5.8
tustanivsky Jun 22, 2026
9689405
Test win custom image
tustanivsky Jun 22, 2026
3cab960
Merge branch 'main' into chore/custom-ue-image
tustanivsky Jun 22, 2026
c7e1f18
Test
tustanivsky Jun 23, 2026
2f68f92
Merge branch 'chore/custom-ue-image' of github.com:getsentry/sentry-u…
tustanivsky Jun 23, 2026
57e2049
Test Linux
tustanivsky Jun 23, 2026
03bd012
Test bAllCores
tustanivsky Jun 23, 2026
06bd049
Restore Win versions
tustanivsky Jun 23, 2026
90293db
Test Unity build + PCH
tustanivsky Jun 23, 2026
330ab60
Test
tustanivsky Jun 23, 2026
a012541
Pass bAllCores to UBT explicitly
tustanivsky Jun 23, 2026
5c5e442
Add custom runner for Android
tustanivsky Jun 23, 2026
7c02d05
Cancel previous PR runs
tustanivsky Jun 24, 2026
0c8e773
Add PR/Full test matrix switch
tustanivsky Jun 24, 2026
cfe2a3b
Restore unity build
tustanivsky Jun 24, 2026
26ee66f
Remove redundant cleanup step for linux and android
tustanivsky Jun 24, 2026
d6e7120
Bump checkout action
tustanivsky Jun 24, 2026
c9d027e
Fix comment
tustanivsky Jun 24, 2026
452b911
Enable unity build conditionally
tustanivsky Jun 25, 2026
f4a303d
Merge branch 'main' into chore/custom-ue-image
tustanivsky Jun 25, 2026
9ed6ef1
Add environment for image generation workflows
tustanivsky Jun 29, 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
55 changes: 43 additions & 12 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,10 @@ on:
paths-ignore:
- "**.md"

concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
cancel-in-progress: true

jobs:
android-sdk:
uses: ./.github/workflows/sdk-build.yml
Expand Down Expand Up @@ -220,80 +224,107 @@ jobs:
shell: pwsh
run: ./scripts/packaging/test-contents.ps1

# Resolves the engine-version matrix once for all test platforms. PRs run the legacy 4.27
# (where supported) plus the 3 latest versions; pushes to main/release run the full set.
generate-test-matrix:
runs-on: ubuntu-latest
outputs:
linux: ${{ steps.set-matrix.outputs.linux }}
windows: ${{ steps.set-matrix.outputs.windows }}
android: ${{ steps.set-matrix.outputs.android }}
steps:
- id: set-matrix
env:
IS_PR: ${{ github.event_name == 'pull_request' }}
run: |
if [[ "$IS_PR" == "true" ]]; then
# PRs: legacy 4.27 (where supported) + 3 latest
echo 'linux=["4.27","5.6","5.7","5.8"]' >> "$GITHUB_OUTPUT"
echo 'windows=["4.27","5.6","5.7","5.8"]' >> "$GITHUB_OUTPUT"
echo 'android=["5.6","5.7","5.8"]' >> "$GITHUB_OUTPUT"
else
# main / release: full set
echo 'linux=["4.27","5.2","5.3","5.4","5.5","5.6","5.7","5.8"]' >> "$GITHUB_OUTPUT"
echo 'windows=["4.27","5.5","5.6","5.7","5.8"]' >> "$GITHUB_OUTPUT"
echo 'android=["5.4","5.5","5.6","5.7","5.8"]' >> "$GITHUB_OUTPUT"
fi

test-linux:
needs: [package-preparation]
needs: [package-preparation, generate-test-matrix]
name: Linux UE ${{ matrix.unreal }}
secrets: inherit
strategy:
fail-fast: false
matrix:
unreal: ['4.27', '5.2', '5.3', '5.4', '5.5', '5.6', '5.7', '5.8']
unreal: ${{ fromJSON(needs.generate-test-matrix.outputs.linux) }}
uses: ./.github/workflows/test-linux.yml
with:
unreal-version: ${{ matrix.unreal }}

test-windows:
needs: [package-preparation]
needs: [package-preparation, generate-test-matrix]
name: Windows UE ${{ matrix.unreal }}
secrets: inherit
strategy:
fail-fast: false
matrix:
unreal: ['4.27', '5.2', '5.3', '5.4', '5.5', '5.6', '5.7', '5.8']
unreal: ${{ fromJSON(needs.generate-test-matrix.outputs.windows) }}
uses: ./.github/workflows/test-windows.yml
with:
unreal-version: ${{ matrix.unreal }}

test-android:
needs: [package-preparation]
needs: [package-preparation, generate-test-matrix]
name: Android UE ${{ matrix.unreal }}
secrets: inherit
strategy:
fail-fast: false
matrix:
unreal: ['4.27', '5.2', '5.3', '5.4', '5.5', '5.6', '5.7', '5.8']
unreal: ${{ fromJSON(needs.generate-test-matrix.outputs.android) }}
uses: ./.github/workflows/test-android.yml
with:
unreal-version: ${{ matrix.unreal }}

integration-test-linux:
needs: [test-linux]
needs: [test-linux, generate-test-matrix]
name: Linux UE ${{ matrix.unreal }} (${{ matrix.backend }})
secrets: inherit
strategy:
fail-fast: false
matrix:
unreal: ['4.27', '5.2', '5.3', '5.4', '5.5', '5.6', '5.7', '5.8']
unreal: ${{ fromJSON(needs.generate-test-matrix.outputs.linux) }}
backend: [crashpad, native]
uses: ./.github/workflows/integration-test-linux.yml
with:
unreal-version: ${{ matrix.unreal }}
backend: ${{ matrix.backend }}

integration-test-windows:
needs: [test-windows]
needs: [test-windows, generate-test-matrix]
name: Windows UE ${{ matrix.unreal }} (${{ matrix.backend }})
secrets: inherit
strategy:
fail-fast: false
matrix:
# Integration tests are supported only for UE 5.2 and newer where CRC can be disabled
unreal: ['5.2', '5.3', '5.4', '5.5', '5.6', '5.7', '5.8']
unreal: ${{ fromJSON(needs.generate-test-matrix.outputs.windows) }}
backend: [crashpad, native]
exclude:
- unreal: '4.27'
Comment thread
tustanivsky marked this conversation as resolved.
uses: ./.github/workflows/integration-test-windows.yml
with:
unreal-version: ${{ matrix.unreal }}
backend: ${{ matrix.backend }}

integration-test-android:
needs: [test-android]
needs: [test-android, generate-test-matrix]
name: Android UE ${{ matrix.unreal }}
secrets: inherit
strategy:
fail-fast: false
max-parallel: 1
matrix:
unreal: ['5.4', '5.5', '5.6', '5.7', '5.8']
unreal: ${{ fromJSON(needs.generate-test-matrix.outputs.android) }}
uses: ./.github/workflows/integration-test-android.yml
with:
unreal-version: ${{ matrix.unreal }}
52 changes: 52 additions & 0 deletions .github/workflows/custom-image-android.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
name: Build UE Android runner image

on:
workflow_dispatch:
schedule:
- cron: '0 6 * * 1'

env:
REGISTRY: ghcr.io

jobs:
create-image:
name: Create Android image with UE Docker images
runs-on: unreal-image-creating-runner-linux
snapshot: unreal-image-android
environment:
name: main

permissions:
contents: read
packages: read

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

- name: Free up disk space
run: ./scripts/clean-storage-linux.sh

- name: Log in to GitHub package registry
uses: docker/login-action@b45d80f862d83dbcd57f89517bcf500b2ab88fb2
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

# Android images carry the Android SDK/NDK platform files and are large, so the set is limited to
# the versions Android is actually tested on (5.4+)
- name: Pull Unreal Engine Docker images
run: |
set -e
tags=("5.4" "5.5" "5.6" "5.7" "5.8")
for tag in "${tags[@]}"; do
echo "=== Pulling ${{ env.REGISTRY }}/getsentry/unreal-docker:${tag}-android ==="
docker pull "${{ env.REGISTRY }}/getsentry/unreal-docker:${tag}-android"
echo "=== Free disk space after pulling ${tag}-android ==="
df -h /
done

- name: Verify pulled images
run: |
docker images --filter "reference=${{ env.REGISTRY }}/getsentry/unreal-docker" --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}"
50 changes: 50 additions & 0 deletions .github/workflows/custom-image-linux.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
name: Build UE Linux runner image

on:
workflow_dispatch:
Comment thread
sentry-warden[bot] marked this conversation as resolved.
schedule:
- cron: '0 6 * * 1'

env:
REGISTRY: ghcr.io

jobs:
create-image:
name: Create Linux image with UE Docker images
runs-on: unreal-image-creating-runner-linux
snapshot: unreal-image-linux
environment:
name: main

permissions:
contents: read
packages: read

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

- name: Free up disk space
run: ./scripts/clean-storage-linux.sh

- name: Log in to GitHub package registry
uses: docker/login-action@b45d80f862d83dbcd57f89517bcf500b2ab88fb2
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Pull Unreal Engine Docker images
run: |
set -e
tags=("4.27" "5.2" "5.3" "5.4" "5.5" "5.6" "5.7" "5.8")
for tag in "${tags[@]}"; do
echo "=== Pulling ${{ env.REGISTRY }}/getsentry/unreal-docker:${tag}-linux ==="
docker pull "${{ env.REGISTRY }}/getsentry/unreal-docker:${tag}-linux"
echo "=== Free disk space after pulling ${tag}-linux ==="
df -h /
done

- name: Verify pulled images
run: |
docker images --filter "reference=${{ env.REGISTRY }}/getsentry/unreal-docker" --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}"
55 changes: 55 additions & 0 deletions .github/workflows/custom-image-windows.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
name: Build UE Windows runner image

on:
workflow_dispatch:
schedule:
- cron: '0 6 * * 1'

env:
REGISTRY: ghcr.io

jobs:
create-image:
name: Create Windows image with UE Docker images
runs-on: unreal-image-creating-runner-windows
snapshot: unreal-image-windows
environment:
name: main

permissions:
contents: read
packages: read

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

- name: Free up disk space
shell: pwsh
run: ./scripts/clean-storage-win.ps1

- name: Log in to GitHub package registry
uses: docker/login-action@b45d80f862d83dbcd57f89517bcf500b2ab88fb2
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Pull Unreal Engine Docker images
shell: pwsh
run: |
$tags = @('4.27', '5.5', '5.6', '5.7', '5.8')
foreach ($tag in $tags) {
Write-Host "=== Pulling ${{ env.REGISTRY }}/getsentry/unreal-docker:$tag ==="
docker pull "${{ env.REGISTRY }}/getsentry/unreal-docker:$tag"
if ($LASTEXITCODE -ne 0) {
Write-Error "Failed to pull image for tag $tag"
exit 1
}
Write-Host "=== Free disk space after pulling $tag ==="
Get-PSDrive -PSProvider FileSystem | Format-Table -AutoSize Name, @{Name='Used(GB)';Expression={[math]::Round($_.Used/1GB,2)}}, @{Name='Free(GB)';Expression={[math]::Round($_.Free/1GB,2)}}
}

- name: Verify pulled images
run: |
docker images --filter "reference=${{ env.REGISTRY }}/getsentry/unreal-docker" --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}"
35 changes: 10 additions & 25 deletions .github/workflows/test-android.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,32 +11,9 @@ env:
jobs:
test:
name: Test
runs-on: ubuntu-latest-4-cores
runs-on: android-latest-unreal

steps:
- name: Free disk space
run: |
# time df -h
sudo time swapoff -a
sudo time rm -f /swapfile
sudo time rm -rf /usr/local/lib/android
sudo time rm -rf /usr/share/dotnet
sudo time rm -rf /usr/share/swift
sudo time rm -rf /usr/local/share/powershell
sudo time rm -rf /usr/local/.ghcup
sudo time rm -rf /usr/local/lib/node_modules
sudo time rm -rf /usr/local/share/boost
sudo time rm -rf /usr/lib/google-cloud-sdk
sudo time rm -rf /usr/lib/jvm
sudo time rm -rf /opt/pipx
sudo time rm -rf /opt/ghc
sudo time rm -rf "$AGENT_TOOLSDIRECTORY"
sudo time apt-get clean
sudo time rm -rf /var/lib/apt/lists/*
# time docker rmi $(docker image ls -aq)
# time du --max-depth=3 --threshold=100M -h /usr /opt /var 2>/dev/null | sort -hr
df -h

- name: Log in to GitHub package registry
uses: docker/login-action@b45d80f862d83dbcd57f89517bcf500b2ab88fb2
with:
Expand All @@ -49,6 +26,7 @@ jobs:
WORKSPACE_PATH: ${{ github.workspace }}
UNREAL_VERSION: ${{ inputs.unreal-version }}
DISALLOW_RAW_POINTERS: ${{ inputs.unreal-version == '4.27' && 'false' || 'true' }}
SENTRY_UNITY_BUILD: ${{ github.event_name == 'pull_request' }}
run: |
# We start the container with the user ID of the parent GH action user to avoid permission issues on volume.
# For UE 5.4 we have to enable ipv6 to fix container startup issues. See https://github.com/adamrehn/ue4-docker/issues/357
Expand All @@ -65,6 +43,7 @@ jobs:
--env HOME="/home/$user" \
--env PATH="/home/$user/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" \
--env DISALLOW_RAW_POINTERS=$DISALLOW_RAW_POINTERS \
--env SENTRY_UNITY_BUILD=$SENTRY_UNITY_BUILD \
--network ip6net -p 80:80 \
ghcr.io/getsentry/unreal-docker:"$UNREAL_VERSION"-android
docker logout ghcr.io
Expand Down Expand Up @@ -109,7 +88,6 @@ jobs:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
with:
path: checkout
submodules: recursive

- name: Extract package to sample/Plugins
env:
Expand Down Expand Up @@ -161,13 +139,17 @@ jobs:

- name: Build Android package (Development)
id: build-android-dev
env:
# Use all logical cores for compilation. '-AllCores' is a UE5-era UBT flag, so skip it on 4.27.
UBT_EXTRA_ARGS: ${{ inputs.unreal-version == '4.27' && '' || '-AllCores' }}
run: |
docker exec -w /workspace/checkout/sample \
-e TMPDIR=/home/gh/.cache/tmp \
unreal /home/ue4/UnrealEngine/Engine/Build/BatchFiles/RunUAT.sh BuildCookRun \
-project=/workspace/checkout/sample/SentryPlayground.uproject \
-archivedirectory=/workspace/checkout/sample/Builds \
-platform=Android \
-UBTArgs="$UBT_EXTRA_ARGS" \
-clientconfig=Development \
-nop4 \
-cook \
Expand All @@ -181,6 +163,8 @@ jobs:
- name: Build Android package (Shipping)
id: build-android-shipping
env:
# Use all logical cores for compilation. '-AllCores' is a UE5-era UBT flag, so skip it on 4.27.
UBT_EXTRA_ARGS: ${{ inputs.unreal-version == '4.27' && '' || '-AllCores' }}
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
SENTRY_ORG: ${{ secrets.SENTRY_ORG }}
SENTRY_PROJECT: ${{ secrets.SENTRY_PROJECT }}
Expand All @@ -194,6 +178,7 @@ jobs:
-project=/workspace/checkout/sample/SentryPlayground.uproject \
-archivedirectory=/workspace/checkout/sample/Builds \
-platform=Android \
-UBTArgs="$UBT_EXTRA_ARGS" \
-distribution \
-clientconfig=Shipping \
-nop4 \
Expand Down
Loading
Loading