| name: Composite Flutter Setup |
| description: checkouts the tree, setups the environment |
| inputs: |
| ANDROID_TOOLS_VERSION: |
| description: 'android tools version' |
| default: '13114758' |
| ANDROID_PLATFORM: |
| description: 'android platform version' |
| default: 'android-36' |
| ANDROID_BUILDTOOLS: |
| description: 'android buildtools version' |
| default: '36.1.0' |
| |
| runs: |
| using: 'composite' |
| steps: |
| # Real checkout on github actions for pull requests |
| - name: Checkout code (non-act pull_request) |
| uses: actions/checkout@v4 |
| if: github.event_name == 'pull_request' && !env.ACT |
| with: |
| fetch-depth: 0 |
| fetch-tags: true |
| # Checkout the PR; not the merge commit - we need to describe tags |
| ref: ${{ github.event.pull_request.head.sha }} |
| |
| # Real checkout on github actions for post submit |
| - name: Checkout code (non-act push) |
| uses: actions/checkout@v4 |
| if: github.event_name == 'push' && !env.ACT |
| with: |
| fetch-depth: 0 |
| fetch-tags: true |
| # Checkout the PR; not the merge commit - we need to describe tags |
| ref: ${{ github.event.pull_request.head.sha }} |
| |
| # Fake checkout if running locally |
| - name: Checkout code (act local) |
| uses: actions/checkout@v4 |
| if: env.ACT |
| |
| # If this is a branch / pr NOT on fluter/flutter, set the remote upstream |
| # so the flutter tool can figure out the version |
| - name: Set upstream (if not flutter/flutter) |
| shell: bash |
| if: github.repository != 'flutter/flutter' && !env.ACT |
| run: | |
| git remote add upstream https://github.com/flutter/flutter.git |
| git fetch --all --tags |
| |
| # If running locally; install the JDK - Github runners have everything on them |
| - name: Set up our JDK environment |
| if: env.ACT |
| uses: actions/setup-java@c5195efecf7bdfc987ee8bae7a71cb8b11521c00 |
| with: |
| java-version: '21' |
| distribution: 'temurin' |
| |
| # If running locally; install Android SDK tools - Github runners have everything on them |
| - name: Set Android SDK environment variable |
| shell: bash |
| if: env.ACT |
| run: | |
| echo "ANDROID_SDK_ROOT=/opt/android/sdk" >> $GITHUB_ENV |
| echo "ANDROID_HOME=/opt/android/sdk" >> $GITHUB_ENV |
| - name: Get Android SDK version |
| shell: bash |
| id: android-sdk-version |
| if: env.ACT |
| run: | |
| echo "revision=${{inputs.ANDROID_TOOLS_VERSION}};${{inputs.ANDROID_PLATFORM}};build-tools;${{inputs.ANDROID_BUILDTOOLS}}" >> "$GITHUB_OUTPUT" |
| - name: Android SDK Cache |
| uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae |
| id: android-sdk-setup |
| if: env.ACT |
| with: |
| path: /opt/android/sdk |
| key: ${{ runner.os }}-${{ steps.android-sdk-version.outputs.revision }} |
| - name: Setup Android SDK (cold cache) |
| if: env.ACT && steps.android-sdk-setup.outputs.cache-hit != 'true' |
| uses: android-actions/setup-android@9fc6c4e9069bf8d3d10b2204b1fb8f6ef7065407 |
| with: |
| packages: 'tools platform-tools platforms;${{inputs.ANDROID_PLATFORM}} build-tools;${{inputs.ANDROID_BUILDTOOLS}}' |
| log-accepted-android-sdk-licenses: false |
| cmdline-tools-version: ${{ inputs.ANDROID_TOOLS_VERSION }} |
| - name: Setup Android SDK (warm cache) |
| shell: bash |
| if: env.ACT && steps.android-sdk-setup.outputs.cache-hit == 'true' |
| run: | |
| echo "/opt/android/sdk/cmdline-tools/${{ inputs.ANDROID_TOOLS_VERSION }}/bin" >> "$GITHUB_PATH" |
| echo "/opt/android/sdk/platform-tools" >> "$GITHUB_PATH" |
| |
| # ktlint is needed by tree analyze |
| - name: ktlint cache |
| id: ktlint-cache |
| uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae |
| with: |
| # Cache the ktlint binary in runner.temp to avoid interfering with Flutter's bin folder |
| path: ${{ runner.temp }}/ktlint-bin/ktlint |
| # Hardcode the version in the key since it's hardcoded in the URL |
| key: ${{ runner.os }}-ktlint-1.5.0 |
| |
| - name: Download and Install ktlint 1.5.0 |
| if: steps.ktlint-cache.outputs.cache-hit != 'true' |
| shell: bash |
| run: | |
| mkdir -p ${{ runner.temp }}/ktlint-bin |
| |
| # 1. Download directly into the temp directory |
| curl -fsSL -o ${{ runner.temp }}/ktlint-bin/ktlint https://github.com/ktlint/ktlint/releases/download/1.5.0/ktlint |
| |
| # 2. Verify the checksum to ensure the binary hasn't been tampered with |
| EXPECTED_SHA="a16be01dcc480aab2f55f444b620142152f66e31564b3b9376506d624c28a2ad" |
| echo "$EXPECTED_SHA ${{ runner.temp }}/ktlint-bin/ktlint" | sha256sum --check - |
| |
| # 3. Make the binary executable |
| chmod a+x ${{ runner.temp }}/ktlint-bin/ktlint |
| |
| - name: Add ktlint to PATH |
| shell: bash |
| run: | |
| echo "${{ runner.temp }}/ktlint-bin" >> "$GITHUB_PATH" |
| |
| - name: Add `flutter` to the PATH |
| shell: bash |
| run: | |
| echo "$GITHUB_WORKSPACE/bin" >> "$GITHUB_PATH" |
| |
| - name: Setup PUB_CACHE environment variable |
| shell: bash |
| run: | |
| echo "PUB_CACHE=/opt/pub-cache" >> $GITHUB_ENV |
| |
| # Get the Flutter revision. This is the key for the cache for artifacts |
| # under bin/cache |
| - name: Get Flutter version |
| shell: bash |
| id: flutter-revision |
| run: | |
| echo "revision=$(git rev-parse HEAD)" >> "$GITHUB_OUTPUT" |
| - name: Flutter artifacts cache |
| uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae |
| id: flutter-artifacts |
| with: |
| path: ${{ github.workspace }}/bin/cache |
| key: ${{ runner.os }}-flutter-${{ steps.flutter-revision.outputs.revision }} |
| |
| - name: pub deps hash |
| shell: bash |
| id: pub-deps-hash |
| run: | |
| # Generate stable hash of pubspec.yaml files |
| find dev examples packages -name "pubspec.yaml" -print0 | sort -z | xargs -0 cat | sha256sum >> "$RUNNER_TEMP/pub_deps_sha" |
| echo "revision=$(cat "$RUNNER_TEMP/pub_deps_sha")" >> "$GITHUB_OUTPUT" |
| - name: pub package cache |
| uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae |
| id: pub-cache |
| with: |
| path: | |
| /opt/pub-cache |
| ${{ github.workspace }}/**/.dart_tool |
| ${{ github.workspace }}/**/pubspec.lock |
| key: ${{ runner.os }}-pub-${{ steps.pub-deps-hash.outputs.revision }} |
| |
| - name: Flutter Doctor |
| shell: bash |
| run: | |
| flutter doctor |
| |
| - name: flutter pub get (online) |
| shell: bash |
| if: steps.pub-cache.outputs.cache-hit != 'true' |
| run: | |
| flutter pub get |