Skip to content

c

c #19

Workflow file for this run

name: Flutter Release
# Triggered by pushing a tag (v*)
# pub.dev OIDC requires tag context, so we trigger on tag push
#
# Release process:
# 1. Update version in pubspec.yaml, podspec, CHANGELOG.md
# 2. Commit and push to main
# 3. Create and push tag: git tag v0.2.5 && git push origin v0.2.5
# 4. Workflow runs automatically and publishes everywhere
on:
push:
tags:
- 'v*'
env:
CARGO_TERM_COLOR: always
FLUTTER_VERSION: '3.24.0'
jobs:
# Get version from tag
get-version:
runs-on: ubuntu-latest
outputs:
version: ${{ steps.version.outputs.version }}
steps:
- name: Get version from tag
id: version
run: |
# Strip 'v' prefix from tag
VERSION="${GITHUB_REF_NAME#v}"
echo "version=$VERSION" >> $GITHUB_OUTPUT
echo "Version from tag: $VERSION"
# Generate Dart bindings
generate-bindings:
needs: get-version
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Flutter
uses: subosito/flutter-action@v2
with:
flutter-version: ${{ env.FLUTTER_VERSION }}
channel: stable
- name: Setup Rust
uses: dtolnay/rust-toolchain@stable
- name: Install LLVM/Clang
run: sudo apt-get update && sudo apt-get install -y libclang-dev llvm-dev
- name: Cache Cargo
uses: Swatinem/rust-cache@v2
with:
shared-key: rust-frb-release
- name: Install flutter_rust_bridge_codegen
run: cargo install flutter_rust_bridge_codegen
- name: Get Flutter dependencies
working-directory: packages/fula_client
run: flutter pub get
- name: Generate Dart bindings
run: flutter_rust_bridge_codegen generate
- name: Analyze Dart code
working-directory: packages/fula_client
run: flutter analyze
- name: Upload Flutter package
uses: actions/upload-artifact@v4
with:
name: flutter-package
path: packages/fula_client/
retention-days: 1
# Build Android native libraries
build-android:
needs: get-version
runs-on: ubuntu-latest
strategy:
matrix:
include:
- target: aarch64-linux-android
lib_dir: arm64-v8a
cc: aarch64-linux-android21-clang
ar: llvm-ar
- target: armv7-linux-androideabi
lib_dir: armeabi-v7a
cc: armv7a-linux-androideabi21-clang
ar: llvm-ar
- target: x86_64-linux-android
lib_dir: x86_64
cc: x86_64-linux-android21-clang
ar: llvm-ar
steps:
- uses: actions/checkout@v4
- name: Setup Rust
uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ matrix.target }}
- name: Setup Android NDK
uses: nttld/setup-ndk@v1
id: setup-ndk
with:
ndk-version: r25c
add-to-path: true
- name: Cache Cargo
uses: Swatinem/rust-cache@v2
with:
shared-key: rust-android-release-${{ matrix.target }}
- name: Configure linker for Android
run: |
mkdir -p .cargo
cat >> .cargo/config.toml << INNEREOF
[target.aarch64-linux-android]
linker = "${{ steps.setup-ndk.outputs.ndk-path }}/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android21-clang"
[target.armv7-linux-androideabi]
linker = "${{ steps.setup-ndk.outputs.ndk-path }}/toolchains/llvm/prebuilt/linux-x86_64/bin/armv7a-linux-androideabi21-clang"
[target.x86_64-linux-android]
linker = "${{ steps.setup-ndk.outputs.ndk-path }}/toolchains/llvm/prebuilt/linux-x86_64/bin/x86_64-linux-android21-clang"
INNEREOF
- name: Build for Android
env:
CC: ${{ steps.setup-ndk.outputs.ndk-path }}/toolchains/llvm/prebuilt/linux-x86_64/bin/${{ matrix.cc }}
AR: ${{ steps.setup-ndk.outputs.ndk-path }}/toolchains/llvm/prebuilt/linux-x86_64/bin/${{ matrix.ar }}
run: cargo build -p fula-flutter --target ${{ matrix.target }} --release
- name: Strip debug symbols
run: |
${{ steps.setup-ndk.outputs.ndk-path }}/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip \
target/${{ matrix.target }}/release/libfula_flutter.so
- name: Prepare artifact
run: |
mkdir -p android-libs/${{ matrix.lib_dir }}
cp target/${{ matrix.target }}/release/libfula_flutter.so android-libs/${{ matrix.lib_dir }}/
- name: Upload Android library
uses: actions/upload-artifact@v4
with:
name: android-${{ matrix.lib_dir }}
path: android-libs/
retention-days: 1
# Build iOS native libraries
build-ios:
needs: get-version
runs-on: macos-latest
steps:
- uses: actions/checkout@v4
- name: Setup Rust
uses: dtolnay/rust-toolchain@stable
with:
targets: aarch64-apple-ios,x86_64-apple-ios,aarch64-apple-ios-sim
- name: Cache Cargo
uses: Swatinem/rust-cache@v2
with:
shared-key: rust-ios-release
- name: Build for iOS arm64
run: cargo build -p fula-flutter --target aarch64-apple-ios --release
- name: Build for iOS x86_64 simulator
run: cargo build -p fula-flutter --target x86_64-apple-ios --release
- name: Build for iOS arm64 simulator
run: cargo build -p fula-flutter --target aarch64-apple-ios-sim --release
- name: Strip debug symbols from iOS libraries
run: |
strip -S target/aarch64-apple-ios/release/libfula_flutter.a
strip -S target/x86_64-apple-ios/release/libfula_flutter.a
strip -S target/aarch64-apple-ios-sim/release/libfula_flutter.a
- name: Create XCFramework
run: |
mkdir -p ios-libs
# Create simulator universal library
mkdir -p target/ios-sim-universal
lipo -create \
target/x86_64-apple-ios/release/libfula_flutter.a \
target/aarch64-apple-ios-sim/release/libfula_flutter.a \
-output target/ios-sim-universal/libfula_flutter.a
# Create XCFramework
xcodebuild -create-xcframework \
-library target/aarch64-apple-ios/release/libfula_flutter.a \
-library target/ios-sim-universal/libfula_flutter.a \
-output ios-libs/FulaFlutter.xcframework
- name: Upload iOS libraries
uses: actions/upload-artifact@v4
with:
name: ios-xcframework
path: ios-libs/
retention-days: 1
# Build WASM package
build-wasm:
needs: get-version
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Rust
uses: dtolnay/rust-toolchain@stable
with:
targets: wasm32-unknown-unknown
- name: Cache Cargo
uses: Swatinem/rust-cache@v2
with:
shared-key: rust-wasm-release
- name: Install wasm-pack
run: cargo install wasm-pack
- name: Build WASM
run: |
cd crates/fula-flutter
wasm-pack build --release --target web --out-dir ../../wasm-package
- name: Create npm package.json
run: |
cd wasm-package
cat > package.json << INNEREOF
{
"name": "@functionland/fula-client",
"version": "${{ needs.get-version.outputs.version }}",
"description": "Fula encrypted storage SDK for JavaScript/WASM",
"main": "fula_flutter.js",
"types": "fula_flutter.d.ts",
"files": ["*.js", "*.wasm", "*.d.ts", "snippets/**"],
"repository": {
"type": "git",
"url": "https://github.com/functionland/fula-api"
},
"keywords": ["fula", "storage", "encryption", "wasm", "decentralized"],
"author": "Functionland",
"license": "Apache-2.0"
}
INNEREOF
- name: Upload WASM package
uses: actions/upload-artifact@v4
with:
name: wasm-package
path: wasm-package/
retention-days: 1
# Publish to pub.dev (Android only - iOS downloads from GitHub Releases)
publish-pubdev:
needs: [generate-bindings, build-android]
runs-on: ubuntu-latest
permissions:
id-token: write # Required for pub.dev OIDC authentication
steps:
- name: Download Flutter package
uses: actions/download-artifact@v4
with:
name: flutter-package
path: packages/fula_client/
- name: Download Android arm64 library
uses: actions/download-artifact@v4
with:
name: android-arm64-v8a
path: packages/fula_client/android/src/main/jniLibs/
- name: Download Android armv7 library
uses: actions/download-artifact@v4
with:
name: android-armeabi-v7a
path: packages/fula_client/android/src/main/jniLibs/
- name: Download Android x86_64 library
uses: actions/download-artifact@v4
with:
name: android-x86_64
path: packages/fula_client/android/src/main/jniLibs/
# iOS binaries are NOT included - they're downloaded via podspec from GitHub Releases
# This keeps the pub.dev package under 100MB limit
- name: Setup Flutter
uses: subosito/flutter-action@v2
with:
flutter-version: ${{ env.FLUTTER_VERSION }}
channel: stable
- name: Setup Dart for pub.dev OIDC
uses: dart-lang/setup-dart@v1
- name: Verify package structure
run: |
echo "Package contents:"
find packages/fula_client -type f | head -50
echo ""
echo "Android libs:"
ls -la packages/fula_client/android/src/main/jniLibs/ || echo "No jniLibs"
echo ""
echo "Package size estimate:"
du -sh packages/fula_client/
- name: Publish to pub.dev
working-directory: packages/fula_client
run: flutter pub publish --force
# Publish to npm
publish-npm:
needs: [build-wasm]
runs-on: ubuntu-latest
steps:
- name: Download WASM package
uses: actions/download-artifact@v4
with:
name: wasm-package
path: wasm-package/
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
registry-url: 'https://registry.npmjs.org'
- name: Verify package contents
run: |
echo "WASM package contents:"
ls -la wasm-package/
cat wasm-package/package.json
- name: Publish to npm
working-directory: wasm-package
run: npm publish --access public
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
# Upload artifacts to GitHub Release (created automatically from tag)
upload-release-assets:
needs: [get-version, build-android, build-ios, build-wasm]
runs-on: ubuntu-latest
steps:
- name: Download all artifacts
uses: actions/download-artifact@v4
with:
path: artifacts/
- name: Package artifacts
run: |
cd artifacts
# Package Android libs
mkdir -p android-libs
cp -r android-arm64-v8a/* android-libs/
cp -r android-armeabi-v7a/* android-libs/
cp -r android-x86_64/* android-libs/
zip -r android-libs.zip android-libs/
# Package iOS libs (must match podspec expected structure: Frameworks/FulaFlutter.xcframework)
mkdir -p ios-package/Frameworks
cp -r ios-xcframework/* ios-package/Frameworks/
cd ios-package && zip -r ../ios-libs.zip Frameworks/ && cd ..
# Package WASM
zip -r wasm-package.zip wasm-package/
- name: Upload to GitHub Release
uses: softprops/action-gh-release@v1
with:
tag_name: v${{ needs.get-version.outputs.version }}
files: |
artifacts/android-libs.zip
artifacts/ios-libs.zip
artifacts/wasm-package.zip
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}