name: Hash Bags iOS Simulator build # Phase 1 of iOS CI: validate the Mac runner end-to-end by producing an # unsigned simulator .app. Drop the resulting Runner.app into the iOS # Simulator on any Apple Silicon Mac to verify the app actually compiles # and launches. # # Phase 2 (separate workflow): full TestFlight pipeline with signing. on: # Manual-only for now. Trigger via Actions → "Hash Bags iOS Simulator # build" → Run workflow when you want a build. workflow_dispatch: # Cancel in-flight runs when a newer commit lands on the same branch — so a # burst of commits doesn't pile up N copies of the same long build. concurrency: group: ios-sim-${{ github.ref }} cancel-in-progress: true defaults: run: shell: bash jobs: build: runs-on: macos-latest env: APP_IOS_TYPE: cakewallet BRANCH_NAME: ${{ github.head_ref || github.ref_name }} steps: - uses: actions/checkout@v4 with: fetch-depth: 1 # Self-hosted Mac runner persists Flutter between runs. Only install if # it's not already on PATH or version doesn't match. - name: Check Flutter 3.32.0 id: flutter_check run: | if command -v flutter >/dev/null && flutter --version 2>/dev/null | grep -q "3\.32\.0"; then echo "installed=true" >> "$GITHUB_OUTPUT" flutter --version else echo "installed=false" >> "$GITHUB_OUTPUT" fi - name: Install Flutter 3.32.0 (if missing) if: steps.flutter_check.outputs.installed != 'true' uses: subosito/flutter-action@v2 with: flutter-version: '3.32.0' channel: stable cache: true - name: Install CocoaPods (if missing) run: | if command -v pod >/dev/null; then pod --version exit 0 fi if command -v brew >/dev/null; then brew install cocoapods else export GEM_HOME="$HOME/.gem" export PATH="$GEM_HOME/bin:$PATH" echo "GEM_HOME=$HOME/.gem" >> "$GITHUB_ENV" echo "$HOME/.gem/bin" >> "$GITHUB_PATH" gem install --user-install cocoapods --no-document fi pod --version - name: Install Go + gomobile (if missing) run: | if ! command -v go >/dev/null; then if command -v brew >/dev/null; then brew install go else echo "Go missing and brew not available"; exit 1 fi fi go version # Ensure $(go env GOPATH)/bin is on PATH for subsequent steps. GOPATH=$(go env GOPATH) echo "$GOPATH/bin" >> "$GITHUB_PATH" export PATH="$PATH:$GOPATH/bin" # gomobile + gobind are needed by scripts/build_bitbox_flutter.sh if ! command -v gomobile >/dev/null; then go install golang.org/x/mobile/cmd/gomobile@latest go install golang.org/x/mobile/cmd/gobind@latest fi which gomobile && gomobile version || true - name: Show toolchain run: | set -x flutter --version xcodebuild -version pod --version uname -m which curl unzip # ---- External prebuilt deps (same as android/linux) ------------------ # macOS doesn't ship wget by default; using curl everywhere. - name: Fetch prebuilt torch_dart run: | set -x -e pushd scripts rm -rf torch_dart torch_dart.tar.gz curl -fsSL -o torch_dart.tar.gz https://github.com/MrCyjaneK/torch_dart/releases/download/v1.0.17/torch_dart-v1.0.17.tar.gz mkdir torch_dart tar -xzf torch_dart.tar.gz -C torch_dart rm torch_dart.tar.gz popd - name: Fetch prebuilt reown_flutter run: | set -x -e pushd scripts rm -rf reown_flutter reown_flutter.tar.gz curl -fsSL -o reown_flutter.tar.gz https://github.com/cake-tech/reown_flutter/releases/download/v0.0.4/reown_flutter-v0.0.4.tar.gz mkdir reown_flutter tar -xzf reown_flutter.tar.gz -C reown_flutter rm reown_flutter.tar.gz popd - name: Clone BitBox Flutter run: | set -x -e pushd scripts ./build_bitbox_flutter.sh popd # ---- Native crypto cores (monero_c prebuilt bundle) ------------------ - name: Fetch prebuilt monero_c bundle run: | set -x -e ./scripts/prepare_moneroc.sh MONERO_C_TAG=$(cd scripts/monero_c && git describe --tags) mkdir -p "scripts/monero_c/release/$MONERO_C_TAG" pushd "scripts/monero_c/release/$MONERO_C_TAG" curl -fsSL -O https://github.com/MrCyjaneK/monero_c/releases/download/v0.18.4.6-RC1/release-bundle.zip unzip -q release-bundle.zip rm release-bundle.zip echo "=== bundle contents (one level) ===" ls popd # iOS native lib staging: Cake's scripts/ios/setup.sh + gen_framework.sh # expect pre-built .a archives in specific paths. The first run will # likely surface what's missing; we iterate from there. - name: Inspect iOS targets available in monero_c bundle run: | set -x MONERO_C_TAG=$(cd scripts/monero_c && git describe --tags) BUNDLE_DIR="scripts/monero_c/release/$MONERO_C_TAG" # List anything iOS-y find "$BUNDLE_DIR" -maxdepth 1 -name '*ios*' -o -name '*apple*' 2>/dev/null || true ls "$BUNDLE_DIR" || true # ---- Configure: pubspec.yaml, Info.plist, GeneratedPluginRegistrant --- - name: Run iOS configure (cakewallet profile) run: | set -x -e pushd scripts/ios source ./app_env.sh cakewallet ./app_config.sh popd # ---- Secrets --------------------------------------------------------- - name: Generate per-module secrets.g.dart files (all empty defaults) run: dart run tool/generate_new_secrets.dart - name: Inject Trocador affiliate secrets env: TROCADOR_API_KEY: ${{ secrets.TROCADOR_API_KEY }} TROCADOR_MONERO_API_KEY: ${{ secrets.TROCADOR_MONERO_API_KEY }} TROCADOR_EXCHANGE_MARKUP: ${{ secrets.TROCADOR_EXCHANGE_MARKUP }} run: | # macOS sed needs '' after -i; Linux sed doesn't accept that. This # workflow runs on macos only. sed -i '' \ -e "s|const trocadorApiKey = '';|const trocadorApiKey = '${TROCADOR_API_KEY}';|" \ -e "s|const trocadorMoneroApiKey = '';|const trocadorMoneroApiKey = '${TROCADOR_MONERO_API_KEY}';|" \ -e "s|const trocadorExchangeMarkup = '';|const trocadorExchangeMarkup = '${TROCADOR_EXCHANGE_MARKUP:-1}';|" \ lib/.secrets.g.dart grep '^const trocador' lib/.secrets.g.dart # ---- Flutter init + codegen ----------------------------------------- - name: Initialize Flutter SDK (iOS precache) run: | flutter --version flutter precache --ios --no-linux --no-android --no-macos --no-windows --no-fuchsia --no-web || true - name: Build generated code (mobx + hive adapters) run: bash model_generator.sh - name: Generate localization run: dart run tool/generate_localization.dart # CocoaPods: the iOS Podfile installs Flutter plugin pods. Required # before flutter build can link them. - name: pod install run: | cd ios pod install --repo-update # ---- Build iOS Simulator app (no codesign) --------------------------- - name: Build iOS Simulator app run: | set -x -e flutter build ios --simulator --no-codesign \ --dart-define-from-file=env.json ls -la build/ios/iphonesimulator/ - name: Zip Runner.app run: | cd build/ios/iphonesimulator zip -r hash_wallet_ios_sim_${{ github.sha }}.zip Runner.app - name: Upload .app artifact uses: actions/upload-artifact@v3 with: name: hash-wallet-ios-sim-${{ github.sha }} path: build/ios/iphonesimulator/hash_wallet_ios_sim_*.zip retention-days: 14