mirror of
https://github.com/callstack/agent-device.git
synced 2026-09-14 20:06:34 +08:00
df0a0f7fd2
* perf(package): strip comments from the Apple runner source the npm package ships The packager copies apple/runner/** into dist/ as Swift source, removing only its AGENT_DEVICE_RUNNER_UNIT_TESTS blocks, so doc comments and design notes were downloaded on every install: 71.9 kB of 441.2 kB of packaged runner Swift. Add a lexical scanner for the removal. A regex cannot do this: `//` and `/*` open a comment only in code position, raw literals move their own delimiter and escape with the `#` count, interpolation segments hold code and further literals, and Swift block comments nest. A construct the scanner cannot account for throws at packaging time instead of shipping Swift that does not compile. * fix(package): keep Swift regex literals out of the comment scanner `#/foo//bar/#` is a valid extended regex literal with no comment in it, but the scanner only knew the `#"` raw-string family, so it read the literal's `//` as a line comment and shipped `let pattern = #/foo` — Swift that does not compile. Add `#/…/#` and `##/…/##` as a literal context: matching `#` counts, the single- and multi-line forms, Swift's own-line rule for a multi-line closing delimiter, and the `\/` escape that keeps one from closing early. Bare `/…/` literals stay unresolvable, because the same `/` opens a comment, divides, and starts a regex literal, and only the parse separates them. Where one could begin — an expression position whose `/` is not followed by a space, a tab or `)` — packaging throws by file and line instead of rewriting bytes it cannot prove are code. Divisions (`width/2`, `Double(3)/Double(4)`), the recording scripts' shebang and `(/)` keep flowing through. * fix(package): keep the packaged runner source on the checkout's line numbers `dist/apple/runner/**` is the Swift a user's `xcodebuild` and the runner name a file and line in (it lands in runner.log), so those numbers are only worth reading if they point at the same line of `apple/runner/**`. Both rewriting passes now empty the lines they remove instead of deleting them: comment removal (889 lines, 889 B) and the pre-existing unit-test `#if` block strip, which was moving everything below a block by up to 883 lines (3,737 lines, 3,737 B). `dist/apple/runner/` 555,907 B -> 488,635 B (-67,272 B, -12.1%); its Swift alone 441,196 B -> 373,924 B (-15.2%). Parity costs 4,626 B of the 71,898 B the previous head saved. Nothing in the repo compiles the packaged source, so a mis-lex that failed to throw would ship Swift that does not build and no gate would see it. Add `pnpm check:packaged-runner-swift`: it packages into a throwaway root and asserts line-count parity plus the line of every declaration each packaged file still carries, then runs `swiftc -parse` over all 44 files. The parse half reports itself skipped where no Swift toolchain exists, so the gate is declared on the macOS lane, where both halves run.
162 lines
6.6 KiB
YAML
162 lines
6.6 KiB
YAML
name: macOS
|
|
|
|
on:
|
|
pull_request:
|
|
paths-ignore:
|
|
- 'docs/**'
|
|
- 'website/**'
|
|
- 'README.md'
|
|
- 'AGENTS.md'
|
|
- 'CHANGELOG.md'
|
|
- 'CONTEXT.md'
|
|
- 'CONTRIBUTING.md'
|
|
- 'LICENSE'
|
|
- 'SECURITY.md'
|
|
- '.github/actions/build-docs/action.yml'
|
|
- '.github/workflows/deploy.yml'
|
|
- '.github/workflows/pr-preview.yml'
|
|
- '.github/workflows/pr-preview-cleanup.yml'
|
|
push:
|
|
branches:
|
|
- main
|
|
|
|
permissions:
|
|
contents: read
|
|
|
|
concurrency:
|
|
group: ci-${{ github.workflow }}-${{ github.ref }}
|
|
cancel-in-progress: true
|
|
|
|
jobs:
|
|
# One macOS lane for everything the macOS host can prove: command coverage,
|
|
# the runner's pure-decision XCTests, the helper, and the replay smoke. All
|
|
# of it consumes one runner build, compiled with the unit-test flag so the
|
|
# host XCTest run below has a bundle to execute (#1781 A7).
|
|
#
|
|
# Which tests that build reaches is not a list: it is everything the macOS
|
|
# build compiles, and the simulator-only tests keep themselves out with an
|
|
# `os(iOS)` guard (see the classification note in RunnerTests.swift). The
|
|
# `-skip-testing:` entry is validated by `pnpm check:xctest-selection` for
|
|
# the same reason the nightly's is: `RunnerTests/testCommand` is the
|
|
# runner's 24-hour server entry point, and a typo re-arms the hang. The
|
|
# lane's reporter asserts the executed count equals the reach the check
|
|
# derives from source, so a build without the compile flag or a guard that
|
|
# compiles a file out reads as red rather than as a smaller green.
|
|
#
|
|
# Kill criterion: if the host run proves flaky where the simulator run of the
|
|
# same tests is not (a platform-branch difference this classification
|
|
# missed), gate the offender `os(iOS)` and it returns to the simulator lanes;
|
|
# if that happens to more than a handful, the host lane is the wrong tool and
|
|
# goes.
|
|
smoke-macos:
|
|
name: Smoke Tests
|
|
runs-on: macos-26
|
|
timeout-minutes: 80
|
|
env:
|
|
AGENT_DEVICE_STATE_DIR: ${{ github.workspace }}/.tmp/agent-device-state
|
|
AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH: ${{ github.workspace }}/.tmp/macos-runner-derived
|
|
AGENT_DEVICE_XCUITEST_INCLUDE_UNIT_TESTS: '1'
|
|
RESULT_BUNDLE_PATH: ${{ github.workspace }}/.tmp/xctest-host/RunnerTests.xcresult
|
|
RESULT_SUMMARY_PATH: ${{ github.workspace }}/.tmp/xctest-host/test-results-summary.json
|
|
XCTEST_LANE: host
|
|
steps:
|
|
- name: Checkout
|
|
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
|
|
|
- name: Setup toolchain
|
|
uses: ./.github/actions/setup-node-pnpm
|
|
|
|
- name: Run macOS command coverage contract
|
|
uses: ./.github/actions/run-gate
|
|
with: { gate: macos-coverage }
|
|
|
|
# The npm package ships apple/runner/** as rewritten Swift source, and nothing in the repo
|
|
# compiles the result — the first consumer is a user's xcodebuild. This lane is the only one
|
|
# with a Swift toolchain, so it is where `swiftc -parse` over the packaged files runs; the
|
|
# line-parity half of the same gate needs no toolchain. Seconds, no simulator (#2461).
|
|
- name: Check the packaged runner Swift parses and keeps its line numbering
|
|
uses: ./.github/actions/run-gate
|
|
with: { gate: packaged-runner-swift }
|
|
|
|
- name: Run iOS snapshot Swift/TypeScript differential
|
|
uses: ./.github/actions/run-gate
|
|
with: { gate: ios-snapshot-differential }
|
|
|
|
- name: Restore and build macOS XCTest runner
|
|
uses: ./.github/actions/setup-apple-runner-build
|
|
with:
|
|
derived-path: ${{ env.AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH }}
|
|
cache-key-prefix: macos-runner-prebuilt
|
|
gate: swift-runner-macos
|
|
xcuitest-platform: macos
|
|
xcuitest-destination: platform=macOS,arch=arm64
|
|
|
|
- name: Run the host-runnable runner XCTests
|
|
run: |
|
|
set -euo pipefail
|
|
XCTESTRUN_PATH="$(find "$AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH/Build/Products" -maxdepth 1 -name '*.xctestrun' -print -quit)"
|
|
test -n "$XCTESTRUN_PATH"
|
|
mkdir -p "$(dirname "$RESULT_BUNDLE_PATH")"
|
|
xcodebuild test-without-building \
|
|
-xctestrun "$XCTESTRUN_PATH" \
|
|
-destination 'platform=macOS,arch=arm64' \
|
|
-skip-testing:AgentDeviceRunnerUITests/RunnerTests/testCommand \
|
|
-resultBundlePath "$RESULT_BUNDLE_PATH"
|
|
|
|
# Same shape as xctest-nightly.yml: extract is best-effort, the report step asserts.
|
|
- name: Extract the test-results summary
|
|
if: always()
|
|
run: |
|
|
set -uo pipefail
|
|
[ -d "$RESULT_BUNDLE_PATH" ] || exit 0
|
|
xcrun xcresulttool get test-results summary --path "$RESULT_BUNDLE_PATH" --compact \
|
|
> "$RESULT_SUMMARY_PATH" 2>/dev/null ||
|
|
xcrun xcresulttool get test-results summary --path "$RESULT_BUNDLE_PATH" \
|
|
> "$RESULT_SUMMARY_PATH" 2>/dev/null ||
|
|
rm -f "$RESULT_SUMMARY_PATH"
|
|
exit 0
|
|
|
|
- name: Report the run and assert it executed the source-derived set
|
|
if: always()
|
|
run: |
|
|
set -euo pipefail
|
|
if [ ! -s "$RESULT_SUMMARY_PATH" ]; then
|
|
echo 'No usable test-results summary was produced, so nothing here can show a test ran.'
|
|
echo 'The suite step above failed before or during the run; read its log first.'
|
|
echo '### iOS runner host XCTest lane' >> "$GITHUB_STEP_SUMMARY"
|
|
echo 'No result-bundle summary; see the run log and the uploaded bundle.' >> "$GITHUB_STEP_SUMMARY"
|
|
exit 1
|
|
fi
|
|
node --experimental-strip-types scripts/xctest-run-summary.ts
|
|
|
|
- name: Upload result bundle
|
|
if: always()
|
|
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
|
with:
|
|
name: xctest-host-results-${{ github.run_id }}-${{ github.run_attempt }}
|
|
include-hidden-files: true
|
|
path: .tmp/xctest-host
|
|
if-no-files-found: warn
|
|
|
|
- name: Build macOS helper
|
|
uses: ./.github/actions/run-gate
|
|
with: { gate: macos-helper }
|
|
|
|
- name: Run macOS integration test
|
|
uses: ./.github/actions/run-gate
|
|
with:
|
|
gate: replay-macos
|
|
args: |
|
|
--retries
|
|
2
|
|
--report-junit
|
|
test/artifacts/replays-macos.junit.xml
|
|
|
|
- name: Upload macOS artifacts
|
|
if: always()
|
|
uses: ./.github/actions/upload-agent-device-artifacts
|
|
with:
|
|
artifact-name: macos-artifacts
|
|
agent-state-dir: ${{ env.AGENT_DEVICE_STATE_DIR }}
|
|
runner-derived-path: ${{ env.AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH }}
|