Merge pull request #401 from thomaskioko/fix-ios-snapshot-tests #210
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: | |
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-lint: | |
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 lint | |
- name: Upload Lint Report | |
uses: actions/upload-artifact@v4 | |
if: always() | |
with: | |
name: android-lint-report | |
path: app/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 | |
- name: Upload Spotless Report | |
uses: actions/upload-artifact@v4 | |
if: always() | |
with: | |
name: spotless-report | |
path: | | |
**/build/reports/spotless | |
app/build/reports/spotless | |
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 Report | |
uses: actions/upload-artifact@v4 | |
if: always() | |
with: | |
name: dependency-health-report | |
path: ./**/build/reports/tests/ | |
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: 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 | |
continue-on-error: false | |
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: always() | |
uses: actions/upload-artifact@v4 | |
with: | |
name: screenshot-test-results | |
path: '**/build/outputs/roborazzi/*_compare.png' | |
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 Report | |
uses: actions/upload-artifact@v4 | |
if: always() | |
with: | |
name: jvm-test-report | |
path: ./**/build/reports/tests/ | |
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/tests/ | |
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 | |