diff --git a/.github/actions/setup-android/action.yml b/.github/actions/setup-android/action.yml new file mode 100644 index 0000000..690d1d3 --- /dev/null +++ b/.github/actions/setup-android/action.yml @@ -0,0 +1,30 @@ +name: Setup Android +description: Setup CI with Android development tools to compile and test Android source code. + +runs: + using: "composite" + steps: + - name: Install Java + uses: actions/setup-java@v3 + with: + distribution: 'temurin' + java-version: '17' + + - name: Install Android SDK + uses: android-actions/setup-android@v3 + + - name: Cache Gradle dependencies + uses: actions/cache@v4 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} + restore-keys: | + ${{ runner.os }}-gradle- + + - name: Verify gradle scripts are valid gradle scripts + uses: gradle/actions/wrapper-validation@v3 + + - name: Setup Gradle and cache dependencies between builds + uses: gradle/actions/setup-gradle@v3 diff --git a/.github/actions/setup-ios/action.yml b/.github/actions/setup-ios/action.yml new file mode 100644 index 0000000..d6f2264 --- /dev/null +++ b/.github/actions/setup-ios/action.yml @@ -0,0 +1,11 @@ +name: Setup iOS +description: Setup CI with iOS development tools to compile and test iOS source code. + +runs: + using: "composite" + steps: + - name: Install XCode + uses: maxim-lobanov/setup-xcode@v1 + with: + ruby-version: ${{ env.RUBY_VERSION }} + xcode-version: ${{ env.XCODE_VERSION }} diff --git a/.github/workflows/build-sample-apps.yml b/.github/workflows/build-sample-apps.yml new file mode 100644 index 0000000..623445d --- /dev/null +++ b/.github/workflows/build-sample-apps.yml @@ -0,0 +1,136 @@ +name: Build sample apps + +on: + push: + workflow_dispatch: # allow manual run + +concurrency: # cancel previous workflow run if one exists. + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +env: + XCODE_VERSION: "15.3" + +jobs: + build-ios-sample-apps: + runs-on: macos-14 + name: Building sample app ${{ matrix.sample-app }} + strategy: + fail-fast: false # if one sample app fails to build, let the other sample apps continue to build and not cancel them. + matrix: # Use a matrix allowing us to build multiple apps in parallel. Just add an entry to the matrix and it will build! + sample-app: + # List all sample apps you want to have compiled. + # List item is name of directory inside of "apps" directory for the corresponding app to compile. + - "amiapp_flutter" + defaults: + run: + working-directory: apps/${{ matrix.sample-app }} + + steps: + - uses: actions/checkout@v4 + + # Install CLI tools, Ruby, and Ruby dependencies for Fastlane + + - name: Install CLI tools used in CI script + shell: bash + run: | + brew install sd # used in CI script as an easier to use sed CLI. Replaces text in files. + brew install xcbeautify # used by fastlane for output + + - name: Read Ruby Version + id: read_ruby_version + run: echo "RUBY_VERSION=$(cat .ruby-version)" >> $GITHUB_ENV + + - name: Install Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: ${{ env.RUBY_VERSION }} + bundler-cache: true # cache tools to make builds faster in future + + - name: Install Ruby dependencies + run: bundle install + + # Update version numbers and workspace credentials before building the app + + - name: Generate New Version + uses: maierj/fastlane-action@v3.1.0 + with: + subdirectory: apps/${{ matrix.sample-app }} + lane: "generate_new_version" + options: '{"branch_name":"${{ github.ref_name }}", "pull_request_number":"${{ github.event.pull_request.number }}"}' + + - name: Update Flutter SDK Version + uses: maierj/fastlane-action@v3.1.0 + with: + subdirectory: apps/${{ matrix.sample-app }} + lane: "update_flutter_sdk_version" + env: + SDK_VERSION_NAME: ${{ env.SDK_VERSION_NAME }} + APP_VERSION_NAME: ${{ env.APP_VERSION_NAME }} + APP_VERSION_CODE: ${{ env.APP_VERSION_CODE }} + + - name: Update Sample App Version + uses: maierj/fastlane-action@v3.1.0 + with: + subdirectory: apps/${{ matrix.sample-app }} + lane: "update_flutter_app_version" + env: + SDK_VERSION_NAME: ${{ env.SDK_VERSION_NAME }} + APP_VERSION_NAME: ${{ env.APP_VERSION_NAME }} + APP_VERSION_CODE: ${{ env.APP_VERSION_CODE }} + + - name: Setup workspace credentials in flutter environment files + run: | + cp ".env.example" ".env" + sd 'SITE_ID=.*' "SITE_ID=${{ secrets[format('CUSTOMERIO_{0}_WORKSPACE_SITE_ID', matrix.sample-app)] }}" ".env" + sd 'API_KEY=.*' "API_KEY=${{ secrets[format('CUSTOMERIO_{0}_WORKSPACE_API_KEY', matrix.sample-app)] }}" ".env" + + - name: Setup workspace credentials in iOS environment files + run: | + cp "ios/Env.swift.example" "ios/Env.swift" + sd 'siteId: String = ".*"' "siteId: String = \"${{ secrets[format('CUSTOMERIO_{0}_WORKSPACE_SITE_ID', matrix.sample-app)] }}\"" "ios/Env.swift" + sd 'apiKey: String = ".*"' "apiKey: String = \"${{ secrets[format('CUSTOMERIO_{0}_WORKSPACE_API_KEY', matrix.sample-app)] }}\"" "ios/Env.swift" + + # Make sure to fetch dependencies only after updating the version numbers and workspace credentials + + - name: Setup flutter environment and install dependencies + uses: ./.github/actions/setup-flutter + + - name: Install flutter dependencies for sample app + run: flutter pub get + + - name: Setup Android environment for sample app + uses: ./.github/actions/setup-android + + - name: Build and upload Android app via Fastlane + uses: maierj/fastlane-action@v3.1.0 + with: + subdirectory: apps/${{ matrix.sample-app }} + lane: 'android build' + env: + FIREBASE_APP_DISTRIBUTION_SERVICE_ACCOUNT_CREDS_B64: ${{ secrets.FIREBASE_APP_DISTRIBUTION_SERVICE_ACCOUNT_CREDS_B64 }} + + - name: Setup iOS environment for sample app + uses: ./.github/actions/setup-ios + with: + xcode-version: ${{ env.XCODE_VERSION }} + + - name: Cache CocoaPods downloaded dependencies for faster builds in the future + uses: actions/cache@v4 + with: + path: Pods + key: ${{ runner.os }}-${{ matrix.sample-app }}-Pods-${{ github.ref }} + restore-keys: | + ${{ runner.os }}-${{ matrix.sample-app }}-Pods + + - name: pod install + run: pod install --project-directory=ios + + - name: Build and upload iOS app via Fastlane + uses: maierj/fastlane-action@v3.1.0 + with: + subdirectory: apps/${{ matrix.sample-app }} + lane: "ios build" + env: + GOOGLE_CLOUD_MATCH_READONLY_SERVICE_ACCOUNT_B64: ${{ secrets.GOOGLE_CLOUD_MATCH_READONLY_SERVICE_ACCOUNT_B64 }} + FIREBASE_APP_DISTRIBUTION_SERVICE_ACCOUNT_CREDS_B64: ${{ secrets.FIREBASE_APP_DISTRIBUTION_SERVICE_ACCOUNT_CREDS_B64 }}