Migrate CI/CD from Azure Pipelines to GitHub Actions#159
Migrate CI/CD from Azure Pipelines to GitHub Actions#159CedricGuillemet wants to merge 8 commits intomainfrom
Conversation
CedricGuillemet
commented
Apr 16, 2026
- Add reusable workflows for each build target:
- build-android.yml (macOS-14, JSC/V8, emulator tests)
- build-ios.yml (Xcode version/simulator parameterized)
- build-linux.yml (GCC/Clang, sanitizers)
- build-macos.yml (Xcode, sanitizers)
- build-uwp.yml (x64/arm64, Chakra/JSI/V8)
- build-win32.yml (win32/x64, Chakra/JSI/V8, crash dumps)
- Add ci.yml orchestrating all 18 build jobs
- Remove azure-pipelines.yml and .github/jobs/
- Add reusable workflows for each build target: - build-android.yml (macOS-14, JSC/V8, emulator tests) - build-ios.yml (Xcode version/simulator parameterized) - build-linux.yml (GCC/Clang, sanitizers) - build-macos.yml (Xcode, sanitizers) - build-uwp.yml (x64/arm64, Chakra/JSI/V8) - build-win32.yml (win32/x64, Chakra/JSI/V8, crash dumps) - Add ci.yml orchestrating all 18 build jobs - Remove azure-pipelines.yml and .github/jobs/ Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
There was a problem hiding this comment.
Pull request overview
Migrates the repository’s CI configuration from Azure Pipelines templates to GitHub Actions by introducing reusable workflows per platform and a single orchestrating workflow.
Changes:
- Adds a new
.github/workflows/ci.ymlworkflow that fans out into platform-specific reusable workflows. - Adds reusable workflows for Win32, UWP, macOS, iOS, Linux, and Android builds/tests.
- Removes the Azure Pipelines definition and its
.github/jobs/*job templates.
Reviewed changes
Copilot reviewed 14 out of 14 changed files in this pull request and generated 13 comments.
Show a summary per file
| File | Description |
|---|---|
| .github/workflows/ci.yml | New CI orchestrator that invokes reusable workflows for all targets. |
| .github/workflows/build-win32.yml | Reusable Win32 build/test workflow with crash-dump artifact upload on failure. |
| .github/workflows/build-uwp.yml | Reusable UWP build workflow (configure + build). |
| .github/workflows/build-macos.yml | Reusable macOS build/test workflow with optional sanitizers and Xcode selection. |
| .github/workflows/build-linux.yml | Reusable Linux build/test workflow with optional compiler + sanitizers. |
| .github/workflows/build-ios.yml | Reusable iOS simulator build/test workflow with Xcode + simulator selection. |
| .github/workflows/build-android.yml | Reusable Android emulator test workflow parameterized by JS engine. |
| .github/jobs/win32.yml | Removed Azure Pipelines Win32 job template. |
| .github/jobs/uwp.yml | Removed Azure Pipelines UWP job template. |
| .github/jobs/macos.yml | Removed Azure Pipelines macOS job template. |
| .github/jobs/linux.yml | Removed Azure Pipelines Linux job template. |
| .github/jobs/ios.yml | Removed Azure Pipelines iOS job template. |
| .github/jobs/android.yml | Removed Azure Pipelines Android job template. |
| .github/azure-pipelines.yml | Removed Azure Pipelines entrypoint workflow. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| push: | ||
| branches: [main] | ||
| pull_request: | ||
| branches: [main] |
There was a problem hiding this comment.
Azure Pipelines previously ran a nightly scheduled build (schedules: cron: "0 0 * * *"), but this GitHub Actions workflow has no equivalent schedule: trigger. If nightly coverage is still desired, add a schedule event (and/or workflow_dispatch) to preserve that behavior.
| branches: [main] | |
| branches: [main] | |
| workflow_dispatch: | |
| schedule: | |
| - cron: '0 0 * * *' |
There was a problem hiding this comment.
Is that extra nightly build needed @bghgary ?
There was a problem hiding this comment.
I didn't know we had this, so I'm guessing not.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Detect host architecture (arm64 vs x86_64) at runtime - Use matching Android system image and ABI filter accordingly - Bump emulator API from 27 to 33 (arm64-v8a images available) - Use swiftshader_indirect GPU for CI reliability - Fix hyphenated input access to use bracket notation Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Redirect emulator output to a log file instead of /dev/null - Separate wait-for-device from boot completion polling - Detect emulator crash (process died) and dump log - Add 240s boot timeout with progress output - Add step-level 5min timeout to prevent infinite hangs - Upload emulator log as artifact on failure for debugging Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
macos-14 Apple Silicon runners do not expose Hypervisor Framework, causing 'HVF error: HV_UNSUPPORTED' and immediate emulator crash. macos-13 is Intel-based with working hardware acceleration. The architecture detection step adapts automatically. Ref: actions/runner-images#9751 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Replace manual emulator setup with the community-standard action that properly handles HVF on Apple Silicon, system image installation, AVD creation, boot waiting, and teardown. Host architecture is detected to select the matching ABI (arm64-v8a on macos-14). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
macOS 14+ runners lack the com.apple.security.hypervisor entitlement required by the Android emulator, causing HVF errors with no workaround. Linux runners have hardware-accelerated KVM support since April 2024, making them the recommended platform for Android emulator CI. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Android emulator does not run reliably on GitHub Actions runners (HVF unsupported on macOS ARM, KVM issues on Linux). Commented out until a stable solution is available. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
| push: | ||
| branches: [main] | ||
| pull_request: | ||
| branches: [main] |
There was a problem hiding this comment.
Consider adding workflow_dispatch: so CI can be manually triggered from the Actions tab without pushing a commit.
| chmod +x gradlew | ||
| ./gradlew connectedAndroidTest \ | ||
| -PabiFilters=x86_64 \ | ||
| -PjsEngine=${{ inputs['js-engine'] }} \ |
There was a problem hiding this comment.
Nit: This file uses bracket notation (inputs['js-engine']) while all other workflow files use dot notation (inputs.js-engine). Both work — just an inconsistency.