Skip to content

Android Upstream Release #3

Android Upstream Release

Android Upstream Release #3

name: Android Upstream Release
on:
schedule:
- cron: '17 3 * * *'
workflow_dispatch:
inputs:
tag:
description: 'Optional upstream tag to build (e.g. v0.37.1)'
required: false
type: string
push:
tags:
- 'v*'
permissions:
contents: write
env:
CARGO_TERM_COLOR: always
jobs:
resolve-tag:
runs-on: ubuntu-latest
permissions:
contents: read
outputs:
target_tag: ${{ steps.pick.outputs.target_tag }}
should_build: ${{ steps.pick.outputs.should_build }}
steps:
- name: Checkout fork
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Resolve upstream tag
id: pick
env:
INPUT_TAG: ${{ github.event.inputs.tag }}
EVENT_NAME: ${{ github.event_name }}
REF_NAME: ${{ github.ref_name }}
GH_TOKEN: ${{ github.token }}
REPO: ${{ github.repository }}
run: |
set -euo pipefail
git remote add upstream https://github.com/rtk-ai/rtk.git 2>/dev/null || true
git fetch upstream '+refs/tags/*:refs/upstream-tags/*'
git fetch origin '+refs/tags/*:refs/tags/*'
TARGET=""
if [ -n "${INPUT_TAG:-}" ]; then
TARGET="$INPUT_TAG"
elif [ "$EVENT_NAME" = "push" ]; then
TARGET="$REF_NAME"
else
TARGET="$(git for-each-ref refs/upstream-tags --format='%(refname:strip=2)' | grep '^v' | sort -V | tail -n1)"
fi
if [ -z "$TARGET" ]; then
echo "target_tag=" >> "$GITHUB_OUTPUT"
echo "should_build=false" >> "$GITHUB_OUTPUT"
exit 0
fi
if ! git rev-parse -q --verify "refs/upstream-tags/$TARGET" >/dev/null; then
echo "target_tag=$TARGET" >> "$GITHUB_OUTPUT"
echo "should_build=false" >> "$GITHUB_OUTPUT"
exit 0
fi
SHOULD_BUILD="true"
# Manual dispatch with explicit tag is force-build.
# Schedule skips only when Android assets are already present in release.
if [ "$EVENT_NAME" = "schedule" ]; then
REL_JSON="$(gh api "repos/$REPO/releases/tags/$TARGET" 2>/dev/null || true)"
if [ -n "$REL_JSON" ]; then
HAS_TAR="$(printf '%s' "$REL_JSON" | jq -r '[.assets[].name] | any(. == "rtk-aarch64-linux-android-'"$TARGET"'.tar.gz")')"
HAS_SHA="$(printf '%s' "$REL_JSON" | jq -r '[.assets[].name] | any(. == "rtk-aarch64-linux-android-'"$TARGET"'.tar.gz.sha256")')"
if [ "$HAS_TAR" = "true" ] && [ "$HAS_SHA" = "true" ]; then
SHOULD_BUILD="false"
fi
fi
fi
echo "target_tag=$TARGET" >> "$GITHUB_OUTPUT"
echo "should_build=$SHOULD_BUILD" >> "$GITHUB_OUTPUT"
build-and-release:
needs: resolve-tag
if: needs.resolve-tag.outputs.should_build == 'true' && needs.resolve-tag.outputs.target_tag != ''
runs-on: ubuntu-latest
env:
TARGET_TAG: ${{ needs.resolve-tag.outputs.target_tag }}
TARGET_TRIPLE: aarch64-linux-android
API_LEVEL: '24'
steps:
- name: Checkout fork
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Fetch and checkout upstream tag commit
id: upstream
run: |
set -euo pipefail
git remote add upstream https://github.com/rtk-ai/rtk.git 2>/dev/null || true
git fetch upstream '+refs/tags/*:refs/upstream-tags/*'
COMMIT="$(git rev-parse "refs/upstream-tags/${TARGET_TAG}^{commit}")"
echo "commit_sha=$COMMIT" >> "$GITHUB_OUTPUT"
git checkout -f "$COMMIT"
- name: Set up Rust
uses: dtolnay/rust-toolchain@stable
with:
targets: aarch64-linux-android
- name: Setup Android NDK
uses: nttld/setup-ndk@v1
id: setup-ndk
with:
ndk-version: r27d
- name: Configure Android linker
run: |
TOOLCHAIN="${{ steps.setup-ndk.outputs.ndk-path }}/toolchains/llvm/prebuilt/linux-x86_64/bin"
echo "CC_aarch64_linux_android=$TOOLCHAIN/aarch64-linux-android${API_LEVEL}-clang" >> $GITHUB_ENV
echo "CXX_aarch64_linux_android=$TOOLCHAIN/aarch64-linux-android${API_LEVEL}-clang++" >> $GITHUB_ENV
echo "CARGO_TARGET_AARCH64_LINUX_ANDROID_LINKER=$TOOLCHAIN/aarch64-linux-android${API_LEVEL}-clang" >> $GITHUB_ENV
echo "AR_aarch64_linux_android=$TOOLCHAIN/llvm-ar" >> $GITHUB_ENV
- name: Build Android arm64 release
run: cargo build --release --target $TARGET_TRIPLE
- name: Package artifacts
run: |
set -euo pipefail
BIN="target/${TARGET_TRIPLE}/release/rtk"
OUT="rtk-${TARGET_TRIPLE}-${TARGET_TAG}.tar.gz"
cp "$BIN" rtk
tar -czvf "$OUT" rtk
sha256sum "$OUT" > "$OUT.sha256"
file rtk || true
ls -lh "$OUT" "$OUT.sha256"
- name: Upload workflow artifact
uses: actions/upload-artifact@v4
with:
name: rtk-android-${{ env.TARGET_TAG }}
path: |
rtk-aarch64-linux-android-${{ env.TARGET_TAG }}.tar.gz
rtk-aarch64-linux-android-${{ env.TARGET_TAG }}.tar.gz.sha256
- name: Create or update release on fork
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ env.TARGET_TAG }}
target_commitish: ${{ steps.upstream.outputs.commit_sha }}
name: RTK ${{ env.TARGET_TAG }} (Android)
prerelease: false
generate_release_notes: true
files: |
rtk-aarch64-linux-android-${{ env.TARGET_TAG }}.tar.gz
rtk-aarch64-linux-android-${{ env.TARGET_TAG }}.tar.gz.sha256