Skip to content

sdk-install-demo ci #125

sdk-install-demo ci

sdk-install-demo ci #125

Workflow file for this run

name: sdk-install-demo ci
on:
push:
branches: [ main ]
workflow_dispatch:
pull_request:
schedule:
- cron: '0 1,7,13,20 * * *'
jobs:
install-sdk:
strategy:
fail-fast: false
matrix:
include:
- name: 'macOS 15 X64 API 28'
os: 'macos-15-intel'
ANDROID_API: 28
NDK_VERSION: 'r27d'
EMULATOR_ARCH: 'x86_64'
EMULATOR_ARCH_TRIPLE: 'x86_64'
EMULATOR_GPU: 'swiftshader_indirect'
- name: 'Ubuntu X64 API 28'
os: 'ubuntu-latest'
ANDROID_API: 28
NDK_VERSION: 'r28c'
EMULATOR_ARCH: 'x86_64'
EMULATOR_ARCH_TRIPLE: 'x86_64'
EMULATOR_GPU: 'swiftshader_indirect'
- name: 'Ubuntu X64 API 35'
os: 'ubuntu-latest'
ANDROID_API: 35
NDK_VERSION: 'r29'
EMULATOR_ARCH: 'x86_64'
EMULATOR_ARCH_TRIPLE: 'x86_64'
EMULATOR_GPU: 'swiftshader_indirect'
# Android SDK for Linux is only x86_64
#- name: 'Ubuntu ARM API 28'
# os: 'ubuntu-24.04-arm'
# ANDROID_API: 28
# EMULATOR_ARCH: 'arm64-v8a'
# EMULATOR_ARCH_TRIPLE: 'aarch64'
# EMULATOR_GPU: 'swiftshader_indirect'
# Cannot test on ARM macOS because Android emulator required nested
# virtualization
#- name: 'macOS 15 ARM'
# os: 'macos-15'
# ANDROID_API: 28
# EMULATOR_ARCH: 'arm64-v8a'
# EMULATOR_ARCH_TRIPLE: 'aarch64'
# EMULATOR_GPU: 'swiftshader_indirect'
runs-on: ${{ matrix.os }}
env:
ANDROID_API: ${{ matrix.ANDROID_API }}
ANDROID_EMULATOR_ARCH: ${{ matrix.EMULATOR_ARCH }}
ANDROID_EMULATOR_ARCH_TRIPLE: ${{ matrix.EMULATOR_ARCH_TRIPLE }}
ANDROID_EMULATOR_GPU: ${{ matrix.EMULATOR_GPU }}
ANDROID_TARGET: 'default'
#ANDROID_BUILD_TOOLS_VERSION: 36.0.0
ANDROID_BUILD_TOOLS_VERSION: 'latest'
BUILD_TOOLS_VERSION: "35.0.0"
ANDROID_EMULATOR_NAME: 'demo'
ANDROID_PROFILE: "Nexus 10"
ANDROID_CHANNEL: "3"
ANDROID_NDK_VERSION: "${{ matrix.NDK_VERSION }}"
steps:
- name: Free Disk Space
if: runner.os == 'Linux'
run: |
sudo rm -rf /usr/share/dotnet
sudo rm -rf /opt/ghc
sudo rm -rf "/usr/local/share/boost"
sudo rm -rf "$AGENT_TOOLSDIRECTORY"
- name: Install Prerequisites
run: |
if [[ "${RUNNER_OS}" == "Linux" ]]; then
# libcurl4-openssl-dev needed for host toolchain
sudo apt-get -y install libcurl4-openssl-dev
fi
# swiftly install instructions from https://www.swift.org/install/linux/
- name: Install Swiftly
run: |
if [[ "${RUNNER_OS}" == "macOS" ]]; then
curl -fsSL -O https://download.swift.org/swiftly/darwin/swiftly.pkg
installer -pkg swiftly.pkg -target CurrentUserHomeDirectory
~/.swiftly/bin/swiftly init --quiet-shell-followup --skip-install
. "${SWIFTLY_HOME_DIR:-$HOME/.swiftly}/env.sh"
elif [[ "${RUNNER_OS}" == "Linux" ]]; then
curl -fsSL -O https://download.swift.org/swiftly/linux/swiftly-$(uname -m).tar.gz
tar zxf swiftly-$(uname -m).tar.gz
./swiftly init --quiet-shell-followup --skip-install
. "${SWIFTLY_HOME_DIR:-$HOME/.local/share/swiftly}/env.sh"
else
echo "Error: unsupported OS: ${RUNNER_OS}"
exit 1
fi
hash -r
echo "${SWIFTLY_BIN_DIR}" >> "${GITHUB_PATH}"
- name: Get Latest Toolchain Info
run: |
sdk_json=$(curl -fsSL "https://www.swift.org/api/v1/install/dev/main/android-sdk.json") || fatal "Failed to fetch android-sdk development snapshots"
snapshot_tag=$(echo "$sdk_json" | jq -r '.[0].dir')
checksum=$(echo "$sdk_json" | jq -r '.[0].checksum')
echo "SWIFT_TOOLCHAIN_VERSION=${snapshot_tag}" >> ${GITHUB_ENV}
echo "SWIFT_ANDROID_SDK_VERSION=${snapshot_tag}" >> ${GITHUB_ENV}
echo "SWIFT_ANDROID_SDK_CHECKSUM=${checksum}" >> ${GITHUB_ENV}
- name: Install Swift Host Toolchain
run: swiftly install --use "${SWIFT_TOOLCHAIN_VERSION}"
- name: Install Swift SDK for Android
run: swiftly run swift sdk install https://download.swift.org/development/android-sdk/${SWIFT_ANDROID_SDK_VERSION}/${SWIFT_ANDROID_SDK_VERSION}_android-0.1.artifactbundle.tar.gz --checksum ${SWIFT_ANDROID_SDK_CHECKSUM}
- name: List Swift SDKs
run: |
swiftly run swift sdk list
swiftly run swift --version
swiftly run swift --version +"${SWIFT_TOOLCHAIN_VERSION}"
- name: Setup Android NDK
run: |
# Only install the NDK if it is overridden
# Otherwise use the runner-installed NDK
if [[ ! -z "${ANDROID_NDK_VERSION}" ]]; then
mkdir ~/android-ndk
cd ~/android-ndk
curl -fsSLO https://dl.google.com/android/repository/android-ndk-${ANDROID_NDK_VERSION}-$(uname -s).zip
unzip -q android-ndk-${ANDROID_NDK_VERSION}-*.zip
echo "ANDROID_NDK_HOME=${PWD}/android-ndk-${ANDROID_NDK_VERSION}" >> $GITHUB_ENV
fi
# note that we must *not* have ANDROID_NDK_ROOT set!
# https://github.com/swiftlang/swift-driver/pull/1879
echo "ANDROID_NDK_ROOT=" >> $GITHUB_ENV
- name: Setup Android Environment
run: |
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
# needed for Linux or else the emulator will be created in
# ~/.android/avd but it will be sought in ~/.config/.android/avd
if [[ "${RUNNER_OS}" == "Linux" ]]; then
echo "ANDROID_AVD_HOME=${XDG_CONFIG_HOME:-$HOME}/.android/avd" >> $GITHUB_ENV
fi
- name: Setup Swift SDK for Android
run: |
cd ~/Library/org.swift.swiftpm || cd ${XDG_CONFIG_HOME}/swiftpm || cd ~/.local/swiftpm || cd ~/.swiftpm
./swift-sdks/${SWIFT_ANDROID_SDK_VERSION}*.artifactbundle/swift-android/scripts/setup-android-sdk.sh
- name: Build Swift Executable for Android
run: |
mkdir hello
cd hello
swiftly run swift package init --type executable
swiftly run swift build --swift-sdk "${ANDROID_EMULATOR_ARCH_TRIPLE}-unknown-linux-android${ANDROID_API}" --static-swift-stdlib
file .build/debug/hello
- name: Enable KVM
if: runner.os == 'Linux'
run: |
if [[ "${RUNNER_ARCH}" == "X64" ]]; then
echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules
sudo udevadm control --reload-rules
sudo udevadm trigger --name-match=kvm
fi
- name: Android SDKs - setup environment
run: yes y | sdkmanager --licenses > /dev/null
- name: Android SKDs - setup build tools
run: sdkmanager --install "build-tools;${BUILD_TOOLS_VERSION}" platform-tools "platforms;android-${ANDROID_API}" --channel="${ANDROID_CHANNEL}"
- name: Android SKDs - setup emulator
run: sdkmanager --install emulator --channel="${ANDROID_CHANNEL}"
- name: Android Emulator - download required images
run: sdkmanager --install "system-images;android-${ANDROID_API};${ANDROID_TARGET};${ANDROID_EMULATOR_ARCH}" --channel="${ANDROID_CHANNEL}"
- name: Android Emulator - Create
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
#- name: Android - Find AVDs
# run: find ~/ -type d -name '*.avd'
#- name: Android - List AVDs
# run: emulator -list-avds
- name: Android - Boot
run: nohup emulator -memory 4096 -avd "${ANDROID_EMULATOR_NAME}" -wipe-data -no-window -accel off -no-accel -gpu "${ANDROID_EMULATOR_GPU}" -no-snapshot -noaudio -no-boot-anim 2>&1 > emulator.log &
- name: ADB Wait For Device
run: adb wait-for-any-device
timeout-minutes: 5
- name: Pause briefly
run: sleep 30
#- name: ADB Press Power Button
# run: adb shell input keyevent 82
- name: Check Android Emulator
run: |
adb shell 'echo Hello Android!'
- name: Run Swift Executable on Android Emulator
run: |
cd hello
adb push .build/debug/hello /data/local/tmp
adb push $ANDROID_NDK_HOME/toolchains/llvm/prebuilt/*/sysroot/usr/lib/${ANDROID_EMULATOR_ARCH_TRIPLE}-linux-android/libc++_shared.so /data/local/tmp/
adb shell /data/local/tmp/hello
- name: Install testing prerequisites on Android Emulator
run: |
cd ~/Library/org.swift.swiftpm || cd ${XDG_CONFIG_HOME}/swiftpm || cd ~/.local/swiftpm || cd ~/.swiftpm
# add necessary dependencies
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/
adb shell ls /data/local/tmp/
cd -
- name: Create run-tests script
run: |
cat > run-tests.sh << "EOF"
#!/bin/bash -ex
ORG=$(echo "${1}" | cut -d '/' -f 1)
PACKAGE=$(echo "${1}" | cut -d '/' -f 2)
git clone https://github.com/${ORG}/${PACKAGE}
cd ${PACKAGE}
swiftly run swift build --swift-sdk "${ANDROID_EMULATOR_ARCH_TRIPLE}-unknown-linux-android${ANDROID_API}" --build-tests +"${SWIFT_TOOLCHAIN_VERSION}"
adb push .build/debug/${PACKAGE}PackageTests.xctest /data/local/tmp/
# copy up any test resources
adb push .build/debug/*.resources /data/local/tmp/ || true
# push potential dependent libraries
adb push $ANDROID_NDK_HOME/toolchains/llvm/prebuilt/*/sysroot/usr/lib/${ANDROID_EMULATOR_ARCH_TRIPLE}-linux-android/libc++_shared.so /data/local/tmp/
cd ~/Library/org.swift.swiftpm || cd ${XDG_CONFIG_HOME}/swiftpm || cd ~/.local/swiftpm || cd ~/.swiftpm
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/
cd -
adb shell ls /data/local/tmp/
adb shell /data/local/tmp/${PACKAGE}PackageTests.xctest
EOF
chmod +x run-tests.sh
cat run-tests.sh
- name: Run swift-collections tests
run: ./run-tests.sh apple/swift-collections
- name: Run swift-numerics tests
run: ./run-tests.sh apple/swift-numerics
- name: Run swift-algorithms tests
run: ./run-tests.sh apple/swift-algorithms
- name: Run swift-atomics tests
run: ./run-tests.sh apple/swift-atomics
- name: Run swift-system tests
run: ./run-tests.sh apple/swift-system
- name: Run swift-crypto tests
# needs: Tests/CryptoExtrasVectors/rfc-7914-scrypt.txt
if: false
run: ./run-tests.sh apple/swift-crypto
- name: Run swift-nio tests
run: ./run-tests.sh apple/swift-nio
- name: Run swift-argument-parser tests
run: ./run-tests.sh apple/swift-argument-parser
- name: Android - Show Emulator Log
if: always()
run: cat emulator.log || true