Skip to content
Open
Changes from all commits
Commits
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
95 changes: 22 additions & 73 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ jobs:
strategy:
fail-fast: false
matrix:
#swift_version: ['nightly-main']
include:
- name: 'macOS 15 X64 API 28'
os: 'macos-15-intel'
Expand Down Expand Up @@ -62,9 +63,9 @@ jobs:
ANDROID_PROFILE: "Nexus 10"
ANDROID_CHANNEL: "3"
ANDROID_NDK_VERSION: "r27d"
SWIFT_TOOLCHAIN_VERSION: "swift-DEVELOPMENT-SNAPSHOT-2025-10-16"
SWIFT_ANDROID_SDK_VERSION: "swift-DEVELOPMENT-SNAPSHOT-2025-10-16"
SWIFT_ANDROID_SDK_CHECKSUM: "451844c232cf1fa02c52431084ed3dc27a42d103635c6fa71bae8d66adba2500"
SWIFT_VERSION: "nightly-main"
BUILD_FLAGS: "--static-swift-stdlib"

steps:
- name: Free Disk Space
if: runner.os == 'Linux'
Expand All @@ -74,71 +75,20 @@ jobs:
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 -O https://download.swift.org/swiftly/darwin/swiftly.pkg && \
installer -pkg swiftly.pkg -target CurrentUserHomeDirectory && \
~/.swiftly/bin/swiftly init --quiet-shell-followup && \
. "${SWIFTLY_HOME_DIR:-$HOME/.swiftly}/env.sh" && \
hash -r
elif [[ "${RUNNER_OS}" == "Linux" ]]; then
curl -O https://download.swift.org/swiftly/linux/swiftly-$(uname -m).tar.gz && \
tar zxf swiftly-$(uname -m).tar.gz && \
./swiftly init --quiet-shell-followup && \
. "${SWIFTLY_HOME_DIR:-$HOME/.local/share/swiftly}/env.sh" && \
hash -r
else
echo "Error: unsupported OS: ${RUNNER_OS}"
exit 1
fi
echo "${SWIFTLY_BIN_DIR}" >> "${GITHUB_PATH}"

- name: Install Swift Host Toolchain
run: swiftly install --use "${SWIFT_TOOLCHAIN_VERSION}"

- name: Install Swift SDK for Android
run: swift sdk install https://download.swift.org/development/android-sdk/${SWIFT_ANDROID_SDK_VERSION}-a/${SWIFT_ANDROID_SDK_VERSION}-a_android-0.1.artifactbundle.tar.gz --checksum ${SWIFT_ANDROID_SDK_CHECKSUM}

- name: List Swift SDKs
run: swift sdk list

- name: Install Android NDK
run: |
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

- name: Setup Android Environment
- name: Create Swift Package
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
swift package init --name hello --type executable

- name: Setup Swift SDK for Android
- name: Build Package for Android
run: |
cd ~/Library/org.swift.swiftpm || cd ${XDG_CONFIG_HOME}/swiftpm || cd ~/.local/swiftpm || cd ~/.swiftpm
./swift-sdks/${SWIFT_ANDROID_SDK_VERSION}-a-android-0.1.artifactbundle/swift-android/scripts/setup-android-sdk.sh
# TODO: the install-and-build-with-sdk.sh script does not yet
# support macOS, so use swiftly to install and setup the toolchain…
#curl -s --retry 3 https://raw.githubusercontent.com/swiftlang/github-workflows/refs/heads/main/.github/workflows/scripts/install-and-build-with-sdk.sh | \
curl -s --retry 3 https://raw.githubusercontent.com/swift-android-sdk/github-workflows/refs/heads/android-workflow/.github/workflows/scripts/install-and-build-with-sdk.sh | \
bash -s -- --android --flags="$BUILD_FLAGS" --android-sdk-triple="${ANDROID_EMULATOR_ARCH_TRIPLE}-unknown-linux-android${ANDROID_API}" --android-ndk-version="${ANDROID_NDK_VERSION}" ${SWIFT_VERSION}

- name: Build Swift Executable for Android
- name: Check Swift Package
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
Expand All @@ -150,6 +100,15 @@ jobs:
sudo udevadm trigger --name-match=kvm
fi

- 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: Android SDKs - setup environment
run: yes y | sdkmanager --licenses > /dev/null

Expand All @@ -165,12 +124,6 @@ jobs:
- 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 &

Expand All @@ -181,16 +134,12 @@ jobs:
- 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: Push Swift Executable to 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/

Expand Down
Loading