Skip to content

Commit 0dd31fa

Browse files
authored
Attempt to re-use existing Android emulator configuration (#3)
* Attempt to re-use existing Android emulator configuration * Setup Android environment before running sdkmanager * Update emualtor creation * Update emulator * Update emulator testing * Update emulator testing * Update emulator testing * Update emulator testing * Update emulator testing * Update emulator testing * Update emulator testing * Update emulator testing * Update emulator testing * Update emulator testing * Update emulator testing * Update emulator testing * Update emulator testing * Update emulator testing * Update emulator testing * Update emulator testing * Update emulator testing * Update emulator testing * Update emulator testing * Update emulator testing * Update emulator testing * Update emulator testing * Update emulator testing * Update emulator testing * Update action script * Add more package tests * Update testing packages * Update testing packages * Update testing packages * Update testing packages * Update testing packages * Update testing packages * Update testing packages * Update testing packages
1 parent 3a815fa commit 0dd31fa

File tree

2 files changed

+143
-120
lines changed

2 files changed

+143
-120
lines changed

.github/workflows/ci.yml

Lines changed: 84 additions & 120 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ on:
55
workflow_dispatch:
66
pull_request:
77
schedule:
8-
- cron: '0 1,7,13,20 * * *'
8+
- cron: '0 13 * * *'
99

1010
jobs:
1111
install-sdk:
@@ -27,6 +27,13 @@ jobs:
2727
EMULATOR_ARCH: 'x86_64'
2828
EMULATOR_ARCH_TRIPLE: 'x86_64'
2929

30+
- name: 'macOS 15 X64 API 30'
31+
os: 'macos-15-intel'
32+
ANDROID_API: 30
33+
NDK_VERSION: 'r27d'
34+
EMULATOR_ARCH: 'x86_64'
35+
EMULATOR_ARCH_TRIPLE: 'x86_64'
36+
3037
- name: 'Ubuntu X64 API 35'
3138
os: 'ubuntu-latest'
3239
ANDROID_API: 35
@@ -50,19 +57,9 @@ jobs:
5057
# EMULATOR_ARCH_TRIPLE: 'aarch64'
5158

5259
runs-on: ${{ matrix.os }}
53-
env:
54-
ANDROID_API: ${{ matrix.ANDROID_API }}
55-
ANDROID_EMULATOR_ARCH: ${{ matrix.EMULATOR_ARCH }}
56-
ANDROID_EMULATOR_ARCH_TRIPLE: ${{ matrix.EMULATOR_ARCH_TRIPLE }}
57-
ANDROID_TARGET: 'default'
58-
#ANDROID_BUILD_TOOLS_VERSION: 36.0.0
59-
ANDROID_BUILD_TOOLS_VERSION: 'latest'
60-
BUILD_TOOLS_VERSION: "35.0.0"
61-
ANDROID_EMULATOR_NAME: 'demo'
62-
ANDROID_PROFILE: "Nexus 10"
63-
ANDROID_CHANNEL: "3"
64-
ANDROID_NDK_VERSION: "${{ matrix.NDK_VERSION }}"
6560
steps:
61+
- uses: actions/checkout@v4
62+
6663
- name: Free Disk Space
6764
if: runner.os == 'Linux'
6865
run: |
@@ -71,6 +68,48 @@ jobs:
7168
sudo rm -rf "/usr/local/share/boost"
7269
sudo rm -rf "$AGENT_TOOLSDIRECTORY"
7370
71+
- name: Setup Android Environment
72+
run: |
73+
echo "$ANDROID_HOME/cmdline-tools/latest/bin" >> $GITHUB_PATH
74+
echo "$ANDROID_HOME/platform-tools" >> $GITHUB_PATH
75+
echo "$ANDROID_HOME/build-tools/latest" >> $GITHUB_PATH
76+
echo "$ANDROID_HOME/tools" >> $GITHUB_PATH
77+
echo "$ANDROID_HOME/emulator" >> $GITHUB_PATH
78+
79+
echo "ANDROID_API=${{ matrix.ANDROID_API }}" >> $GITHUB_ENV
80+
echo "ANDROID_EMULATOR_ARCH=${{ matrix.EMULATOR_ARCH }}" >> $GITHUB_ENV
81+
echo "ANDROID_EMULATOR_ARCH_TRIPLE=${{ matrix.EMULATOR_ARCH_TRIPLE }}" >> $GITHUB_ENV
82+
echo "ANDROID_TARGET=default" >> $GITHUB_ENV
83+
#echo "ANDROID_PROFILE=Pixel 6" >> $GITHUB_ENV
84+
echo "ANDROID_PROFILE=Nexus 10" >> $GITHUB_ENV
85+
echo "ANDROID_CHANNEL=3" >> $GITHUB_ENV
86+
echo "ANDROID_NDK_VERSION=${{ matrix.NDK_VERSION }}" >> $GITHUB_ENV
87+
88+
if [[ "${RUNNER_OS}" == "Linux" ]]; then
89+
# needed for Linux or else the emulator will be created in
90+
# ~/.android/avd but it will be sought in ~/.config/.android/avd
91+
echo "ANDROID_AVD_HOME=${XDG_CONFIG_HOME:-$HOME}/.android/avd" >> $GITHUB_ENV
92+
93+
# enable KVM on Linux, else error on emulator launch:
94+
# CPU acceleration status: This user doesn't have permissions to use KVM (/dev/kvm).
95+
echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules
96+
sudo udevadm control --reload-rules
97+
sudo udevadm trigger --name-match=kvm
98+
fi
99+
100+
- name: Create and Launch Android Emulator
101+
run: |
102+
EMULATOR_SPEC="system-images;android-${ANDROID_API};default;${ANDROID_EMULATOR_ARCH}"
103+
EMULATOR_NAME="swiftemu"
104+
sdkmanager --list_installed
105+
yes | sdkmanager --licenses > /dev/null
106+
sdkmanager --install "${EMULATOR_SPEC}" "emulator" "platform-tools" "platforms;android-${ANDROID_API}"
107+
avdmanager create avd -n "${EMULATOR_NAME}" -k "${EMULATOR_SPEC}" --device "${ANDROID_PROFILE}"
108+
emulator -list-avds
109+
# launch the emulator in the background; we will cat the logs at the end
110+
nohup emulator -memory 4096 -avd "${EMULATOR_NAME}" -wipe-data -no-window -no-snapshot -noaudio -no-boot-anim 2>&1 > emulator.log &
111+
adb logcat 2>&1 > logcat.log &
112+
74113
- name: Install Prerequisites
75114
run: |
76115
if [[ "${RUNNER_OS}" == "Linux" ]]; then
@@ -138,19 +177,12 @@ jobs:
138177
# https://github.com/swiftlang/swift-driver/pull/1879
139178
echo "ANDROID_NDK_ROOT=" >> $GITHUB_ENV
140179
141-
- name: Setup Android Environment
142-
run: |
143-
echo "$ANDROID_HOME/cmdline-tools/latest/bin:$ANDROID_HOME/emulator:$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools:$ANDROID_HOME/build-tools/${{ env.ANDROID_BUILD_TOOLS_VERSION }}" >> $GITHUB_PATH
144-
# needed for Linux or else the emulator will be created in
145-
# ~/.android/avd but it will be sought in ~/.config/.android/avd
146-
if [[ "${RUNNER_OS}" == "Linux" ]]; then
147-
echo "ANDROID_AVD_HOME=${XDG_CONFIG_HOME:-$HOME}/.android/avd" >> $GITHUB_ENV
148-
fi
149-
150180
- name: Setup Swift SDK for Android
151181
run: |
152182
cd ~/Library/org.swift.swiftpm || cd ${XDG_CONFIG_HOME}/swiftpm || cd ~/.local/swiftpm || cd ~/.swiftpm
153183
./swift-sdks/${SWIFT_ANDROID_SDK_VERSION}*.artifactbundle/swift-android/scripts/setup-android-sdk.sh
184+
cd ./swift-sdks/${SWIFT_ANDROID_SDK_VERSION}*.artifactbundle
185+
echo "SWIFT_ANDROID_SDK_HOME=${PWD}" >> $GITHUB_ENV
154186
155187
- name: Build Swift Executable for Android
156188
run: |
@@ -160,55 +192,12 @@ jobs:
160192
swiftly run swift build --swift-sdk "${ANDROID_EMULATOR_ARCH_TRIPLE}-unknown-linux-android${ANDROID_API}" --static-swift-stdlib
161193
file .build/debug/hello
162194
163-
- name: Enable KVM
164-
if: runner.os == 'Linux'
165-
run: |
166-
if [[ "${RUNNER_ARCH}" == "X64" ]]; then
167-
echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules
168-
sudo udevadm control --reload-rules
169-
sudo udevadm trigger --name-match=kvm
170-
fi
171-
172-
- name: Android SDKs - list installed SDKs
173-
run: sdkmanager --list_installed
174-
175-
- name: Android SDKs - setup environment
176-
run: yes y | sdkmanager --licenses > /dev/null
177-
178-
- name: Android SKDs - setup build tools
179-
run: sdkmanager --install "build-tools;${BUILD_TOOLS_VERSION}" platform-tools "platforms;android-${ANDROID_API}" --channel="${ANDROID_CHANNEL}"
180-
181-
- name: Android SKDs - setup emulator
182-
run: sdkmanager --install emulator --channel="${ANDROID_CHANNEL}"
183-
184-
- name: Android Emulator - download required images
185-
run: sdkmanager --install "system-images;android-${ANDROID_API};${ANDROID_TARGET};${ANDROID_EMULATOR_ARCH}" --channel="${ANDROID_CHANNEL}"
186-
187-
- name: Android Emulator - Create
188-
run: avdmanager --verbose create avd --force -n "${ANDROID_EMULATOR_NAME}" --device "${ANDROID_PROFILE}" --abi "${ANDROID_TARGET}/${ANDROID_EMULATOR_ARCH}" --package "system-images;android-${ANDROID_API};${ANDROID_TARGET};${ANDROID_EMULATOR_ARCH}" --sdcard 512M
189-
190-
#- name: Android - Find AVDs
191-
# run: find ~/ -type d -name '*.avd'
192-
193-
#- name: Android - List AVDs
194-
# run: emulator -list-avds
195-
196-
- name: Android - Boot
197-
run: nohup emulator -memory 4096 -avd "${ANDROID_EMULATOR_NAME}" -wipe-data -no-window -no-snapshot -noaudio -no-boot-anim 2>&1 > emulator.log &
198-
199-
- name: ADB Wait For Device
195+
- name: Wait for Android Emulator
200196
run: adb wait-for-any-device
201197
timeout-minutes: 5
202198

203-
- name: Pause briefly
204-
run: sleep 30
205-
206-
#- name: ADB Press Power Button
207-
# run: adb shell input keyevent 82
208-
209199
- name: Check Android Emulator
210-
run: |
211-
adb shell 'echo Hello Android!'
200+
run: adb shell 'echo Hello Android!'
212201

213202
- name: Run Swift Executable on Android Emulator
214203
run: |
@@ -217,72 +206,47 @@ jobs:
217206
adb push $ANDROID_NDK_HOME/toolchains/llvm/prebuilt/*/sysroot/usr/lib/${ANDROID_EMULATOR_ARCH_TRIPLE}-linux-android/libc++_shared.so /data/local/tmp/
218207
adb shell /data/local/tmp/hello
219208
220-
- name: Create run-tests script
221-
run: |
222-
cat > run-tests.sh << "EOF"
223-
#!/bin/bash -ex
224-
ORG=$(echo "${1}" | cut -d '/' -f 1)
225-
PACKAGE=$(echo "${1}" | cut -d '/' -f 2)
226-
227-
git clone https://github.com/${ORG}/${PACKAGE}
228-
cd ${PACKAGE}
229-
230-
swiftly run swift build --swift-sdk "${ANDROID_EMULATOR_ARCH_TRIPLE}-unknown-linux-android${ANDROID_API}" --build-tests +"${SWIFT_TOOLCHAIN_VERSION}"
231-
232-
adb push .build/debug/${PACKAGE}PackageTests.xctest /data/local/tmp/
233-
# copy up any test resources
234-
adb push .build/debug/*.resources /data/local/tmp/ || true
209+
- run: ./android-ci.sh test apple/swift-numerics
235210

236-
# push potential dependent libraries
237-
adb push $ANDROID_NDK_HOME/toolchains/llvm/prebuilt/*/sysroot/usr/lib/${ANDROID_EMULATOR_ARCH_TRIPLE}-linux-android/libc++_shared.so /data/local/tmp/
211+
- run: ./android-ci.sh test apple/swift-algorithms
238212

239-
# Since we are building with --static-swift-stdlib, we don't
240-
# need to copy any of the other libraries
241-
cd ~/Library/org.swift.swiftpm || cd ${XDG_CONFIG_HOME}/swiftpm || cd ~/.local/swiftpm || cd ~/.swiftpm
242-
adb push swift-sdks/${SWIFT_ANDROID_SDK_VERSION}*.artifactbundle/swift-android/swift-resources/usr/lib/swift-${ANDROID_EMULATOR_ARCH_TRIPLE}/android/*.so /data/local/tmp/
243-
cd -
213+
- run: ./android-ci.sh test apple/swift-atomics
244214

245-
adb shell ls /data/local/tmp/
215+
- run: ./android-ci.sh build swiftlang/swift-subprocess
246216

247-
adb shell /data/local/tmp/${PACKAGE}PackageTests.xctest
248-
EOF
217+
# build-only because it uses hardwired StringLiteralRepresentedLiteralValueTests.swift
218+
- run: ./android-ci.sh build swiftlang/swift-syntax
249219

250-
chmod +x run-tests.sh
251-
cat run-tests.sh
220+
# build-only because tests crash in NetrcTests.testNoErrorMixedAccount
221+
# and tests use abslute file paths
222+
- run: ./android-ci.sh build swiftlang/swift-tools-support-core
252223

253-
- name: Run swift-collections tests
254-
# too slow
255-
if: false
256-
run: ./run-tests.sh apple/swift-collections
224+
# build-only because it tries to write to "/tmp/old.txt" and "/tmp/" does not exist
225+
- run: ./android-ci.sh build swiftlang/swift-markdown
257226

258-
- name: Run swift-numerics tests
259-
run: ./run-tests.sh apple/swift-numerics
227+
# no tests in swift-toolchain-sqlite
228+
- run: ./android-ci.sh build swiftlang/swift-toolchain-sqlite
260229

261-
- name: Run swift-algorithms tests
262-
run: ./run-tests.sh apple/swift-algorithms
230+
# build-only: tests work, but they take a very long time
231+
- run: ./android-ci.sh build apple/swift-collections
263232

264-
- name: Run swift-atomics tests
265-
run: ./run-tests.sh apple/swift-atomics
233+
# build-only: https://github.com/apple/swift-system/pull/272
234+
- run: ./android-ci.sh build apple/swift-system
266235

267-
- name: Run swift-system tests
268-
run: ./run-tests.sh apple/swift-system
236+
# build-only: tests references Tests/ file paths by absolute filename
237+
- run: ./android-ci.sh build apple/swift-crypto
269238

270-
- name: Run swift-crypto tests
271-
# needs: Tests/CryptoExtrasVectors/rfc-7914-scrypt.txt
272-
if: false
273-
run: ./run-tests.sh apple/swift-crypto
239+
- run: ./android-ci.sh build apple/swift-nio
274240

275-
- name: Run swift-nio tests
276-
if: false
277-
run: ./run-tests.sh apple/swift-nio
241+
# build-only, since tests needs local files:
242+
# error: MathExampleTests.testMath_AddHelp : failed - No executable at '/data/local/tmp/math'.
243+
#- run: ./android-ci.sh build apple/swift-argument-parser
278244

279-
- name: Run swift-argument-parser tests
280-
# needs local files:
281-
# error: MathExampleTests.testMath_AddHelp : failed - No executable at '/data/local/tmp/math'.
282-
if: false
283-
run: ./run-tests.sh apple/swift-argument-parser
245+
- name: Show Android Emulator Log
246+
if: always()
247+
run: cat emulator.log
284248

285-
- name: Android - Show Emulator Log
249+
- name: Show Android Logcat Output
286250
if: always()
287-
run: cat emulator.log || true
251+
run: cat logcat.log
288252

android-ci.sh

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
#!/bin/bash -ex
2+
3+
if [[ -z "${2}" ]]; then
4+
echo "$0: Usage: $0 build/test org/package"
5+
exit 1
6+
fi
7+
8+
ACT=${1}
9+
ORG=$(echo "${2}" | cut -d '/' -f 1)
10+
PACKAGE=$(echo "${2}" | cut -d '/' -f 2)
11+
12+
git clone https://github.com/${ORG}/${PACKAGE}
13+
cd ${PACKAGE}
14+
15+
TRIPLE="${ANDROID_EMULATOR_ARCH_TRIPLE}-unknown-linux-android${ANDROID_API}"
16+
swiftly run swift build --swift-sdk "${TRIPLE}" --build-tests +"${SWIFT_TOOLCHAIN_VERSION}"
17+
18+
if [[ "${ACT}" == "build" ]]; then
19+
# build-only, not test, so we are done
20+
exit 0
21+
fi
22+
23+
if [[ "${ACT}" != "test" ]]; then
24+
# build-only, not test
25+
echo "$0: Usage: $0 build/test org/package"
26+
exit 1
27+
fi
28+
29+
STAGING="android-test-${PACKAGE}"
30+
rm -rf .build/"${STAGING}"
31+
mkdir .build/"${STAGING}"
32+
33+
# for the common case of tests referencing their own files as hardwired resource paths
34+
if [[ -d Tests ]]; then
35+
cp -a Tests .build/"${STAGING}"
36+
fi
37+
38+
cd .build/
39+
cp -a debug/*.xctest "${STAGING}"
40+
cp -a debug/*.resources "${STAGING}" || true
41+
cp -a ${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/*/sysroot/usr/lib/${ANDROID_EMULATOR_ARCH_TRIPLE}-linux-android/libc++_shared.so "${STAGING}"
42+
cp -a ${SWIFT_ANDROID_SDK_HOME}/swift-android/swift-resources/usr/lib/swift-${ANDROID_EMULATOR_ARCH_TRIPLE}/android/*.so "${STAGING}"
43+
44+
adb push ${STAGING} /data/local/tmp/
45+
46+
cd -
47+
48+
TEST_CMD="./${PACKAGE}PackageTests.xctest"
49+
TEST_SHELL="cd /data/local/tmp/${STAGING}"
50+
TEST_SHELL="${TEST_SHELL} && ${TEST_CMD}"
51+
52+
# Run a second time with the Swift Testing library
53+
# We additionally need to handle the special exit code EXIT_NO_TESTS_FOUND (69 on Android),
54+
# which can happen when the tests link to Testing, but no tests are executed
55+
# see: https://github.com/swiftlang/swift-package-manager/blob/1b593469e8ad3daf2cc10e798340bd2de68c402d/Sources/Commands/SwiftTestCommand.swift#L1542
56+
TEST_SHELL="${TEST_SHELL} && ${TEST_CMD} --testing-library swift-testing && [ \$? -eq 0 ] || [ \$? -eq 69 ]"
57+
58+
adb shell "${TEST_SHELL}"
59+

0 commit comments

Comments
 (0)