Cleanup & Improvements. #246
Workflow file for this run
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Android and iOS CI Pipeline | |
on: | |
push: | |
branches: [ main ] | |
pull_request: | |
types: [ opened, synchronize ] | |
concurrency: | |
group: ci-${{ github.ref }}-${{ github.head_ref }} | |
cancel-in-progress: true | |
env: | |
JDK_VERSION: 21 | |
DISTRIBUTION: 'temurin' | |
XCODE_VERSION: latest-stable | |
GRADLE_CACHE_PATH: | | |
~/.gradle/caches | |
~/.gradle/wrapper | |
SPM_CACHE_PATH: | | |
~/Library/Caches/org.swift.swiftpm | |
~/Library/Developer/Xcode/DerivedData | |
jobs: | |
build-android: | |
needs: android-screenshot-test | |
runs-on: ubuntu-latest | |
env: | |
TMDB_API_KEY: ${{ secrets.TMDB_API_KEY }} | |
TMDB_API_URL: ${{ secrets.TMDB_API_URL }} | |
TRAKT_CLIENT_ID: ${{ secrets.TRAKT_CLIENT_ID }} | |
TRAKT_CLIENT_SECRET: ${{ secrets.TRAKT_CLIENT_SECRET }} | |
TRAKT_REDIRECT_URI: ${{ secrets.TRAKT_REDIRECT_URI }} | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
steps: | |
- name: 🚚 Checkout Code | |
uses: actions/checkout@v4 | |
- name: Set up JDK | |
uses: actions/setup-java@v4 | |
with: | |
distribution: ${{ env.DISTRIBUTION }} | |
java-version: ${{ env.JDK_VERSION }} | |
- name: 📁 Setup Gradle Cache | |
uses: actions/cache@v4 | |
with: | |
path: ${{ env.GRADLE_CACHE_PATH }} | |
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} | |
restore-keys: | | |
${{ runner.os }}-gradle- | |
- name: 🐘 Setup Gradle 8.8 | |
uses: gradle/actions/setup-gradle@v4 | |
with: | |
gradle-version: 8.11 | |
- name: Add App Secrets | |
run: | | |
echo "TMDB_API_KEY=$TMDB_API_KEY" >> ./local.properties | |
echo "TMDB_API_URL=$TMDB_API_URL" >> ./local.properties | |
echo "TRAKT_CLIENT_ID=$TRAKT_CLIENT_ID" >> ./local.properties | |
echo "TRAKT_CLIENT_SECRET=$TRAKT_CLIENT_SECRET" >> ./local.properties | |
echo "TRAKT_REDIRECT_URI=$TRAKT_REDIRECT_URI" >> ./local.properties | |
- name: 🤖 Build Android App | |
run: | | |
./gradlew check \ | |
:android:app:assemble \ | |
:android:app:bundle \ | |
-x assembleNonMinifiedRelease \ | |
-x bundleNonMinifiedRelease \ | |
-Pandroidx.baselineprofile.skipgeneration=true \ | |
--no-configuration-cache | |
android-screenshot-test: | |
runs-on: ubuntu-latest | |
timeout-minutes: 45 | |
permissions: | |
contents: write | |
pull-requests: write | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v4 | |
- name: Set up JDK | |
uses: actions/setup-java@v4 | |
with: | |
distribution: ${{ env.DISTRIBUTION }} | |
java-version: ${{ env.JDK_VERSION }} | |
- name: Setup Gradle Cache | |
uses: actions/cache@v4 | |
with: | |
path: ${{ env.GRADLE_CACHE_PATH }} | |
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} | |
restore-keys: | | |
${{ runner.os }}-gradle- | |
- name: Install Dependencies | |
run: ./gradlew dependencies | |
- name: Roborazzi Screenshot Tests | |
id: screenshotsverify | |
continue-on-error: true | |
run: ./gradlew clean verifyRoborazziDebug | |
- name: Generate Roborazzi Screenshot Report | |
id: screenshots-report | |
continue-on-error: true | |
run: ./gradlew compareRoborazziDebug | |
- name: Prevent Pushing New Screenshots if This is a Fork | |
id: checkfork_screenshots | |
if: steps.screenshotsverify.outcome == 'failure' && github.event.pull_request.head.repo.full_name != github.repository | |
run: | | |
echo "::error::Screenshot tests failed, please create a PR in your fork first." && exit 1 | |
- name: Generate New Screenshots if Verification Failed and It's a PR | |
id: screenshotsrecord | |
if: steps.screenshotsverify.outcome == 'failure' && github.event_name == 'pull_request' | |
run: ./gradlew recordRoborazziDebug | |
- name: Push New Screenshots if Available | |
uses: stefanzweifel/git-auto-commit-action@v5 | |
if: steps.screenshotsrecord.outcome == 'success' | |
with: | |
file_pattern: '**/*.png' | |
disable_globbing: true | |
commit_message: "🤖 Beep Beep: Update screenshots 🤖" | |
- name: Upload Screenshot Results | |
if: ${{ !cancelled() }} | |
uses: actions/upload-artifact@v4 | |
with: | |
name: screenshot-test-results | |
path: '**/build/outputs/roborazzi/*_compare.png' | |
android-lint: | |
needs: android-screenshot-test | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: actions/setup-java@v4 | |
with: | |
distribution: ${{ env.DISTRIBUTION }} | |
java-version: ${{ env.JDK_VERSION }} | |
- name: Setup Gradle Cache | |
uses: actions/cache@v4 | |
with: | |
path: ${{ env.GRADLE_CACHE_PATH }} | |
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} | |
restore-keys: | | |
${{ runner.os }}-gradle- | |
- name: Lint Project | |
run: ./gradlew :android:app:lintRelease | |
- name: Upload Lint Report | |
if: ${{ !cancelled() }} | |
uses: actions/upload-artifact@v4 | |
with: | |
name: android-lint-report | |
path: '**/build/reports/lint-results-*.html' | |
spotless: | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: actions/setup-java@v4 | |
with: | |
distribution: ${{ env.DISTRIBUTION }} | |
java-version: ${{ env.JDK_VERSION }} | |
- name: Setup Gradle Cache | |
uses: actions/cache@v4 | |
with: | |
path: ${{ env.GRADLE_CACHE_PATH }} | |
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} | |
restore-keys: | | |
${{ runner.os }}-gradle- | |
- name: Run Spotless | |
run: ./gradlew spotlessCheck --no-configuration-cache | |
dependency-health: | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: actions/setup-java@v4 | |
with: | |
distribution: ${{ env.DISTRIBUTION }} | |
java-version: ${{ env.JDK_VERSION }} | |
- name: Setup Gradle Cache | |
uses: actions/cache@v4 | |
with: | |
path: ${{ env.GRADLE_CACHE_PATH }} | |
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} | |
restore-keys: | | |
${{ runner.os }}-gradle- | |
- name: Dependency Health | |
run: ./gradlew buildHealth | |
- name: Upload Dependency health Report | |
uses: actions/upload-artifact@v4 | |
if: always() | |
with: | |
name: dependency-health-report | |
path: '**/build/reports/dependency-analysis/build-health-report.txt' | |
jvm-test: | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: actions/setup-java@v4 | |
with: | |
distribution: ${{ env.DISTRIBUTION }} | |
java-version: ${{ env.JDK_VERSION }} | |
- name: Setup Gradle Cache | |
uses: actions/cache@v4 | |
with: | |
path: ${{ env.GRADLE_CACHE_PATH }} | |
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} | |
restore-keys: | | |
${{ runner.os }}-gradle- | |
- name: Run JVM Tests | |
run: ./gradlew jvmTest | |
- name: Upload Test Reports | |
uses: actions/upload-artifact@v4 | |
if: always() | |
with: | |
name: test-report | |
path: '**/build/reports/*' | |
common-test: | |
runs-on: macos-latest | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v4 | |
- name: Set up JDK | |
uses: actions/setup-java@v4 | |
with: | |
distribution: ${{ env.DISTRIBUTION }} | |
java-version: ${{ env.JDK_VERSION }} | |
- name: Setup Gradle Cache | |
uses: actions/cache@v4 | |
with: | |
path: ${{ env.GRADLE_CACHE_PATH }} | |
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} | |
restore-keys: | | |
${{ runner.os }}-gradle- | |
- name: Run Common iOS Unit Tests | |
run: | | |
if [[ $(uname -m) == 'arm64' ]]; then | |
./gradlew clean iosSimulatorArm64Test | |
else | |
./gradlew clean iosX64Test | |
fi | |
- name: Upload Common Test Report | |
uses: actions/upload-artifact@v4 | |
if: always() | |
with: | |
name: common-test-report | |
path: '**/build/reports/*' | |
build-ios: | |
runs-on: macos-15 | |
timeout-minutes: 60 | |
env: | |
FASTLANE_XCODEBUILD_SETTINGS_TIMEOUT: 60 | |
steps: | |
- name: 🚚 Checkout project | |
uses: actions/checkout@v4 | |
- name: 📀 Setup Xcode version | |
uses: maxim-lobanov/setup-xcode@v1 | |
with: | |
xcode-version: ${{ env.XCODE_VERSION }} | |
- name: 💎 Set up Ruby | |
uses: ruby/setup-ruby@v1 | |
with: | |
bundler-cache: true | |
- name: Cache SPM dependencies | |
uses: actions/cache@v4 | |
with: | |
path: ${{ env.SPM_CACHE_PATH }} | |
key: ${{ runner.os }}-spm-${{ hashFiles('**/Package.resolved') }} | |
restore-keys: | | |
${{ runner.os }}-spm- | |
- name: 📦 Setup Gradle Cache | |
uses: actions/cache@v4 | |
with: | |
path: ${{ env.GRADLE_CACHE_PATH }} | |
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} | |
restore-keys: | | |
${{ runner.os }}-gradle- | |
- name: 🧹 Clear Derived Data | |
run: bundle exec fastlane clear_derived_data_lane | |
- name: 📦 Install dependencies with Bundler | |
run: bundle install | |
- name: 🧱 Build iOS App | |
run: bundle exec fastlane build_tvmaniac | |
- name: Upload build artifacts | |
uses: actions/upload-artifact@v4 | |
if: always() | |
with: | |
name: ios-build | |
path: | | |
build/ | |
fastlane/logs | |
ios-snapshot-test: | |
runs-on: macos-15 | |
timeout-minutes: 60 | |
env: | |
FASTLANE_XCODEBUILD_SETTINGS_TIMEOUT: 60 | |
steps: | |
- name: 🚚 Checkout project | |
uses: actions/checkout@v4 | |
- name: 📀 Setup Xcode version | |
uses: maxim-lobanov/setup-xcode@v1 | |
with: | |
xcode-version: ${{ env.XCODE_VERSION }} | |
- name: 📱 List Available Simulators | |
run: xcrun simctl list devices | |
- name: 💎 Set up Ruby | |
uses: ruby/setup-ruby@v1 | |
with: | |
bundler-cache: true | |
- run: brew install swiftlint | |
- name: Cache SPM dependencies | |
uses: actions/cache@v4 | |
with: | |
path: ${{ env.SPM_CACHE_PATH }} | |
key: ${{ runner.os }}-spm-${{ hashFiles('**/Package.resolved') }} | |
restore-keys: | | |
${{ runner.os }}-spm- | |
- name: 📦 Setup Gradle Cache | |
uses: actions/cache@v4 | |
with: | |
path: ${{ env.GRADLE_CACHE_PATH }} | |
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} | |
restore-keys: | | |
${{ runner.os }}-gradle- | |
- name: Install dependencies with Bundler | |
run: bundle install | |
- name: 📸 Run Snapshot Tests | |
run: bundle exec fastlane snapshot_tests | |
- name: Upload test results | |
uses: actions/upload-artifact@v4 | |
if: always() | |
with: | |
name: snapshot-test-results | |
path: | | |
fastlane/test_output | |
fastlane/logs | |
derived_data/Logs/Test | |