Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
86 commits
Select commit Hold shift + click to select a range
b2ad27f
doc updates
abueide Feb 18, 2026
4e17890
doc improvements
abueide Feb 18, 2026
2c04221
dependabot
abueide Feb 18, 2026
42dc54e
update docs
abueide Feb 18, 2026
3dcbd2c
refactor ios env
abueide Feb 19, 2026
e59cb51
fix: address PR review issues across plugins and docs
abueide Feb 19, 2026
a7f2af0
fix(react-native): use POSIX-compatible sourcing in init hook
abueide Feb 19, 2026
b876be9
refactor: standardize init scripts and reduce PR CI to max-only
abueide Feb 19, 2026
94c2345
ci: add concurrency cancel-in-progress to release workflow
abueide Feb 19, 2026
400b201
chore: add android device definitions for local path include
abueide Feb 19, 2026
334dfcd
chore(release): android/v0.0.3, ios/v0.0.3, react-native/v0.0.4, devb…
abueide Feb 19, 2026
24a6e39
fix(tests): prevent error swallowing in E2E test suites
abueide Feb 19, 2026
d700bb1
fix(tests): use marker-file approach for reliable failure propagation
abueide Feb 19, 2026
67d11a2
fix(tests): standardize log paths from test-results/ to reports/
abueide Feb 19, 2026
0760ea2
fix(ci): resolve false-green CI checks and E2E build failures
abueide Feb 19, 2026
2ba18bd
fix(tests): remove invalid top-level exit_on_end from process-compose…
abueide Feb 19, 2026
300cba3
feat(tests): standardize test suites on user-layer API
abueide Feb 19, 2026
220ad10
fix(tests): use process_healthy for simulator/emulator dependencies
abueide Feb 19, 2026
1802aa2
fix(tests): keep simulator/emulator processes alive for readiness probes
abueide Feb 19, 2026
aa499b3
chore: add device definitions and update lock files from sync
abueide Feb 19, 2026
3c1bf8a
fix(ci): repair truncated workflow name in e2e-full.yml
abueide Feb 19, 2026
38cf062
docs: add deploy, app lifecycle, and readiness probe commands
abueide Feb 19, 2026
a31f665
fix(ci): pass EMU_HEADLESS and SIM_HEADLESS through pure mode
abueide Feb 19, 2026
cbbd9da
fix(rn): use plugin deploy commands and cap Android API at 35
abueide Feb 19, 2026
7cb2f1d
fix(ci): hardcode headless flags in -e and remove redundant env vars
abueide Feb 19, 2026
e9d7e18
fix(android,ios): replace IN_NIX_SHELL with DEVBOX_PURE_SHELL for pur…
abueide Feb 19, 2026
69cf44b
refactor(rn): remove wrapper scripts, call process-compose from devbo…
abueide Feb 19, 2026
c089de2
fix(ci): use devbox run directly and bump iOS runners to macos-26
abueide Feb 19, 2026
5008058
chore(rn): disable corepack and regenerate lock files
abueide Feb 19, 2026
bce0344
docs(rn): update test docs to use devbox run -e instead of wrapper sc…
abueide Feb 19, 2026
37b500f
fix(android,ios,rn): standardize shell options and remove DEVBOX_CORE…
abueide Feb 19, 2026
579fa9b
refactor(tests): consolidate test framework and use example project f…
abueide Feb 19, 2026
db89228
fix(tests,mcp): fix CI failures and add logFile parameter to devbox_run
abueide Feb 19, 2026
f39b2a1
refactor(tests): data-driven test summary with ASCII table and markdo…
abueide Feb 19, 2026
e9afa46
feat(tests): add progressive summary generation and include resolutio…
abueide Feb 19, 2026
7bc692c
fix(tests): make ios-app-resolution tests cross-platform for Linux CI
abueide Feb 19, 2026
d8c27ee
fix(tests): skip ios-app-resolution on non-Darwin platforms
abueide Feb 19, 2026
6eab5bc
fix(android,ios,rn): standardize probe thresholds and fix emulator se…
abueide Feb 19, 2026
567f9f4
fix(android,ios,rn): add set -e to process-compose command blocks
abueide Feb 19, 2026
430b98d
chore(examples): clean up stale segment-integrations device dirs and …
abueide Feb 20, 2026
c7aa09c
fix(ios): fix pod install in pure mode and consolidate test summaries
abueide Feb 20, 2026
54de878
fix(ios): unset standard build vars (LD, LDFLAGS, CFLAGS) in devbox_o…
abueide Feb 20, 2026
434c538
chore: update device lock files after E2E test runs
abueide Feb 20, 2026
9e437d5
refactor(ios): extract helper functions from devbox_omit_nix_env
abueide Feb 20, 2026
c2975de
fix(rn): only stop Metro in pure mode during E2E cleanup
abueide Feb 20, 2026
e0637ca
fix(rn): remove Metro shutdown handlers to respect dev mode
abueide Feb 20, 2026
1ee5707
refactor(ios): remove redundant shellenv call from init hook
abueide Feb 20, 2026
1c446fa
feat(rn): enhance app verification to check Metro connection and errors
abueide Feb 20, 2026
67ba125
feat(rn): detach emulators/simulators in dev mode, simplify app verif…
abueide Feb 20, 2026
63e22f8
feat(rn): apply detach behavior to all-e2e test suite
abueide Feb 20, 2026
304d1c9
refactor: centralize detach logic with --wait-ready flag
abueide Feb 20, 2026
b4c64cc
fix(rn): add ADB reverse port forwarding for Metro connection
abueide Feb 20, 2026
ec0b215
fix(rn): improve Metro error detection and use Debug builds for iOS
abueide Feb 20, 2026
3d5f7be
refactor(rn): separate build and deploy tasks for iOS
abueide Feb 20, 2026
0eea123
fix(rn): separate emulator launch from readiness verification
abueide Feb 20, 2026
a9ffc01
perf(tests): parallelize unit and integration tests
abueide Feb 20, 2026
b5b091d
fix(rn): make verify-ready work in both pure and dev modes
abueide Feb 20, 2026
5a3f4ad
refactor(tests): rename process-compose YAML files
abueide Feb 20, 2026
b505edd
fix(rn): improve Android app verification to catch Metro errors
abueide Feb 20, 2026
fc94615
fix(rn): remove stale adb reverse rules before setting new ones
abueide Feb 20, 2026
8fa9949
fix(rn): pass Metro port to Android build via gradle flag
abueide Feb 20, 2026
160fc6a
refactor: remove build commands, let users call gradle/xcodebuild dir…
abueide Feb 20, 2026
f824a9d
fix(android): use gradle instead of ./gradlew in test suite
abueide Feb 20, 2026
460e04c
fix(android): add missing android_emulator_ready function
abueide Feb 20, 2026
fcc005c
fix(android): ensure SDK is set up before gradle build
abueide Feb 20, 2026
b9eb8a8
fix(rn): ensure Android SDK is set up before gradle builds
abueide Feb 20, 2026
4fd58a1
refactor(tests): remove unnecessary SDK setup workaround
abueide Feb 20, 2026
398ee28
docs: add environment variable setup strategy
abueide Feb 20, 2026
d3083d8
fix(ios): add DerivedData path to xcodebuild commands
abueide Feb 20, 2026
12f36b3
fix(ios): add missing ios_simulator_ready function
abueide Feb 20, 2026
a29978e
chore: regenerate device lock files
abueide Feb 20, 2026
d070a2f
fix(android): capture only stdout from nix build to fix SDK resolutio…
abueide Feb 20, 2026
be85fe2
refactor: remove stale build command references, use native build tools
abueide Feb 20, 2026
1f0ade9
refactor(ios): rename devbox_omit_nix_env to ios_setup_native_toolchain
abueide Feb 20, 2026
f02d746
refactor: use explicit flags for app run argument parsing
abueide Feb 20, 2026
f7a0161
fix(android): remove silent monkey fallback in app launch, fail with …
abueide Feb 20, 2026
ad4c206
docs: update CLAUDE.md to match current implementation
abueide Feb 20, 2026
b7f7beb
docs: remove temporal language and marketing terms
abueide Feb 20, 2026
0b83a7f
chore: remove TODO checklists and temporary files
abueide Feb 20, 2026
f3c3f3c
test: add POSIX compatibility tests for init scripts
abueide Feb 20, 2026
aec9862
fix: replace remaining android.sh/ios.sh build references
abueide Feb 20, 2026
81f721a
feat(tests): add e2e step tracking functions to test framework
abueide Feb 20, 2026
496705e
fix(ci): add metro port pre-allocation, increase boot timeouts, clean…
abueide Feb 20, 2026
a591987
chore: remove generated_at timestamp from device lock files
abueide Feb 20, 2026
94094de
fix(react-native): add missing test:e2e:all script to devbox.json
abueide Feb 20, 2026
af1ebee
fix(ci): add uninstall to deploy command, fix step tracking paths
abueide Feb 20, 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
6 changes: 6 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
version: 2
updates:
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
14 changes: 7 additions & 7 deletions .github/workflows/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@

This directory contains comprehensive CI/CD workflows using **orchestrated testing** powered by process-compose for the Devbox mobile plugins and example projects.

## What's New: Orchestrated Testing 🚀
## Orchestrated Testing

All workflows now use process-compose orchestration with:
All workflows use process-compose orchestration with:
- ✅ **Automatic status checks** - Boot verification, app deployment, process health
- ✅ **Concurrent execution** - Independent tests run in parallel
- ✅ **Configurable timeouts** - No infinite hangs (`BOOT_TIMEOUT`, `TEST_TIMEOUT`)
Expand Down Expand Up @@ -77,17 +77,17 @@ This workflow provides fast feedback with **improved reliability** through autom
- **Min**: API 21 (Android 5.0 Lollipop) on ubuntu-24.04
- **Max**: API 36 (Android 15) on ubuntu-24.04
- **Hardware Acceleration**: KVM enabled for performance
- **NEW**: Orchestrated with automatic boot verification
- Orchestrated with automatic boot verification

#### iOS
- **Min**: iOS 15.4 on macos-14 (first Apple Silicon macOS supporting iOS 15.4)
- **Max**: iOS 26.2 on macos-15 (latest macOS version)
- **NEW**: Orchestrated with automatic boot verification
- Orchestrated with automatic boot verification

#### React Native
- Tests both Android and iOS builds on min/max versions
- **NEW**: Unified job with platform matrix (was split before)
- **NEW**: Orchestrated with full status checking
- Unified job with platform matrix
- Orchestrated with full status checking

**Jobs**:

Expand Down Expand Up @@ -210,7 +210,7 @@ When a test fails:

1. **Check the job logs** in the Actions tab
2. **Download artifacts** (uploaded automatically on failure):
- **NEW**: Process-compose logs per process (setup, build, boot, deploy, verify)
- Process-compose logs per process (setup, build, boot, deploy, verify)
- Android: `/tmp/android-e2e-logs/`, build outputs
- iOS: `/tmp/ios-e2e-logs/`, CoreSimulator logs
- React Native: `/tmp/rn-e2e-logs/`, both platforms
Expand Down
26 changes: 7 additions & 19 deletions .github/workflows/e2e-full.yml
Original file line number Diff line number Diff line change
Expand Up @@ -61,12 +61,11 @@ jobs:
- name: Run Android E2E test
working-directory: examples/android
env:
EMU_HEADLESS: 1
BOOT_TIMEOUT: 240
TEST_TIMEOUT: 600
ANDROID_DEFAULT_DEVICE: ${{ matrix.device }}
TEST_TUI: false
run: devbox run --pure test:e2e
run: devbox run --pure -e EMU_HEADLESS=1 test:e2e

- name: Upload reports and logs
if: always()
Expand All @@ -91,7 +90,7 @@ jobs:
- device: min
os: macos-14
- device: max
os: macos-15
os: macos-26
steps:
- uses: actions/checkout@v4

Expand Down Expand Up @@ -122,12 +121,11 @@ jobs:
- name: Run iOS E2E test
working-directory: examples/ios
env:
SIM_HEADLESS: 1
BOOT_TIMEOUT: 180
TEST_TIMEOUT: 600
IOS_DEFAULT_DEVICE: ${{ matrix.device }}
TEST_TUI: false
run: devbox run --pure test:e2e
run: devbox run --pure -e SIM_HEADLESS=1 test:e2e

- name: Upload reports and logs
if: always()
Expand Down Expand Up @@ -162,7 +160,7 @@ jobs:
os: macos-14
- platform: ios
device: max
os: macos-15
os: macos-26
# Web test (fast, no device needed)
- platform: web
device: none
Expand Down Expand Up @@ -223,23 +221,13 @@ jobs:

- name: Run React Native E2E test
working-directory: examples/react-native
env:
EMU_HEADLESS: ${{ matrix.platform == 'android' && '1' || '0' }}
SIM_HEADLESS: ${{ matrix.platform == 'ios' && '1' || '0' }}
BOOT_TIMEOUT: 300
TEST_TIMEOUT: 900
ANDROID_DEFAULT_DEVICE: ${{ matrix.device }}
IOS_DEFAULT_DEVICE: ${{ matrix.device }}
TEST_TUI: false
run: |
if [ "${{ matrix.platform }}" = "android" ]; then
# Use wrapper script for platform-specific optimization
bash tests/run-android-tests.sh
devbox run --pure -e IOS_SKIP_SETUP=1 -e EMU_HEADLESS=1 test:e2e:android
elif [ "${{ matrix.platform }}" = "ios" ]; then
# Use wrapper script for platform-specific optimization
bash tests/run-ios-tests.sh
devbox run --pure -e ANDROID_SKIP_SETUP=1 -e SIM_HEADLESS=1 test:e2e:ios
elif [ "${{ matrix.platform }}" = "web" ]; then
devbox run test:e2e:web
devbox run --pure -e ANDROID_SKIP_SETUP=1 -e IOS_SKIP_SETUP=1 test:e2e:web
fi

- name: Upload reports and logs
Expand Down
69 changes: 18 additions & 51 deletions .github/workflows/pr-checks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,16 +36,12 @@ jobs:
reports/
retention-days: 7

# Android example E2E tests (min/max devices)
# Android example E2E test (max device only on PRs)
android-e2e:
name: Android E2E - ${{ matrix.device }}
name: Android E2E - max
runs-on: ubuntu-24.04
timeout-minutes: 30
needs: fast-tests
strategy:
fail-fast: false
matrix:
device: [min, max]
steps:
- uses: actions/checkout@v4

Expand Down Expand Up @@ -73,37 +69,28 @@ jobs:
- name: Run Android E2E test
working-directory: examples/android
env:
EMU_HEADLESS: 1
BOOT_TIMEOUT: 180
TEST_TIMEOUT: 300
ANDROID_DEFAULT_DEVICE: ${{ matrix.device }}
ANDROID_DEFAULT_DEVICE: max
TEST_TUI: false
run: devbox run --pure test:e2e
run: devbox run --pure -e EMU_HEADLESS=1 test:e2e

- name: Upload reports and logs
if: always()
uses: actions/upload-artifact@v4
with:
name: android-${{ matrix.device }}-reports
name: android-max-reports
path: |
examples/android/reports/
examples/android/app/build/outputs/
retention-days: 7

# iOS example E2E tests (min/max devices)
# iOS example E2E test (max device only on PRs)
ios-e2e:
name: iOS E2E - ${{ matrix.device }}
runs-on: ${{ matrix.os }}
name: iOS E2E - max
runs-on: macos-26
timeout-minutes: 25
needs: fast-tests
strategy:
fail-fast: false
matrix:
include:
- device: min
os: macos-14
- device: max
os: macos-15
steps:
- uses: actions/checkout@v4

Expand Down Expand Up @@ -134,24 +121,23 @@ jobs:
- name: Run iOS E2E test
working-directory: examples/ios
env:
SIM_HEADLESS: 1
BOOT_TIMEOUT: 120
TEST_TIMEOUT: 300
IOS_DEFAULT_DEVICE: ${{ matrix.device }}
IOS_DEFAULT_DEVICE: max
TEST_TUI: false
run: devbox run --pure test:e2e
run: devbox run --pure -e SIM_HEADLESS=1 test:e2e

- name: Upload reports and logs
if: always()
uses: actions/upload-artifact@v4
with:
name: ios-${{ matrix.device }}-reports
name: ios-max-reports
path: |
examples/ios/reports/
~/Library/Logs/CoreSimulator/
retention-days: 7

# React Native E2E tests (Android min/max, iOS min/max, Web)
# React Native E2E tests (max device only on PRs, plus web)
react-native-e2e:
name: React Native E2E - ${{ matrix.platform }}-${{ matrix.device }}
runs-on: ${{ matrix.os }}
Expand All @@ -161,21 +147,12 @@ jobs:
fail-fast: false
matrix:
include:
# Android tests
- platform: android
device: min
os: ubuntu-24.04
- platform: android
device: max
os: ubuntu-24.04
# iOS tests
- platform: ios
device: min
os: macos-14
- platform: ios
device: max
os: macos-15
# Web test (fast, no device needed)
os: macos-26
- platform: web
device: none
os: ubuntu-24.04
Expand Down Expand Up @@ -235,23 +212,13 @@ jobs:

- name: Run React Native E2E test
working-directory: examples/react-native
env:
EMU_HEADLESS: ${{ matrix.platform == 'android' && '1' || '0' }}
SIM_HEADLESS: ${{ matrix.platform == 'ios' && '1' || '0' }}
BOOT_TIMEOUT: 240
TEST_TIMEOUT: 600
ANDROID_DEFAULT_DEVICE: ${{ matrix.device }}
IOS_DEFAULT_DEVICE: ${{ matrix.device }}
TEST_TUI: false
run: |
if [ "${{ matrix.platform }}" = "android" ]; then
# Use wrapper script for platform-specific optimization
bash tests/run-android-tests.sh
devbox run --pure -e IOS_SKIP_SETUP=1 -e EMU_HEADLESS=1 test:e2e:android
elif [ "${{ matrix.platform }}" = "ios" ]; then
# Use wrapper script for platform-specific optimization
bash tests/run-ios-tests.sh
devbox run --pure -e ANDROID_SKIP_SETUP=1 -e SIM_HEADLESS=1 test:e2e:ios
elif [ "${{ matrix.platform }}" = "web" ]; then
devbox run test:e2e:web
devbox run --pure -e ANDROID_SKIP_SETUP=1 -e IOS_SKIP_SETUP=1 test:e2e:web
fi

- name: Upload reports and logs
Expand All @@ -275,7 +242,7 @@ jobs:
steps:
- name: Check job results
run: |
echo "📊 PR Check Results:"
echo "PR Check Results:"
echo " Fast Tests: ${{ needs.fast-tests.result }}"
echo " Android E2E: ${{ needs.android-e2e.result }}"
echo " iOS E2E: ${{ needs.ios-e2e.result }}"
Expand All @@ -289,4 +256,4 @@ jobs:
echo "::error::One or more PR checks failed"
exit 1
fi
echo "::notice::All PR checks passed!"
echo "::notice::All PR checks passed!"
4 changes: 4 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,10 @@ on:
push:
branches: [main]

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
check-release:
runs-on: ubuntu-latest
Expand Down
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,12 @@
*.cache
.claude/

# Test results (only last run kept locally)
# Test results and temp dirs (only last run kept locally)
/reports/
/reports/tmp/
/test-results/
tests/test-results/
examples/*/reports/
examples/*/test-results/
plugins/*/tests/reports/
plugins/*/tests/test-results/
Loading
Loading