Merge pull request #365 from thomaskioko/renovate/dependency.analysis #104
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: 'zulu' | |
FASTLANE_XCODEBUILD_SETTINGS_TIMEOUT: 120 | |
XCODE_VERSION: '15.3' | |
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 with Gradle | |
run: ./gradlew assemble | |
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/ | |
# TODO: Uncomment this once we have a proper build lane | |
# build-ios: | |
# needs: [common-test] | |
# runs-on: macos-latest | |
# steps: | |
# - name: Checkout project | |
# uses: actions/checkout@v4 | |
# - name: Setup Xcode | |
# uses: maxim-lobanov/setup-xcode@v1 | |
# with: | |
# xcode-version: ${{ env.XCODE_VERSION }} | |
# - name: Set up Ruby | |
# uses: ruby/setup-ruby@v1 | |
# with: | |
# ruby-version: 3.3.0 | |
# 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: Install dependencies with Bundler | |
# run: bundle install | |
# - name: Build iOS App | |
# run: bundle exec fastlane build_tvmaniac | |
# - name: Clear Derived Data | |
# run: bundle exec fastlane clear_derived_data_lane | |
# - name: Upload test results | |
# uses: actions/upload-artifact@v4 | |
# if: failure() | |
# with: | |
# name: test-results | |
# path: fastlane/test_output | |
ios-ui-test: | |
needs: [common-test] | |
runs-on: macos-latest | |
steps: | |
- name: Checkout project | |
uses: actions/checkout@v4 | |
- name: Setup Xcode | |
uses: maxim-lobanov/setup-xcode@v1 | |
with: | |
xcode-version: ${{ env.XCODE_VERSION }} | |
- name: Set up Ruby | |
uses: ruby/setup-ruby@v1 | |
with: | |
ruby-version: 3.3.0 | |
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: Install dependencies with Bundler | |
run: bundle install | |
- name: Run UI Tests | |
run: bundle exec fastlane ui_tests | |
- name: Upload test results | |
uses: actions/upload-artifact@v4 | |
if: failure() | |
with: | |
name: test-results | |
path: fastlane/test_output | |
create-release: | |
needs: [build-android, android-lint, android-screenshot-test, common-test, ios-ui-test, spotless, dependency-health, jvm-test] | |
if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') }} | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Set up JDK | |
uses: actions/setup-java@v4 | |
with: | |
java-version: ${{ env.JDK_VERSION }} | |
distribution: ${{ env.DISTRIBUTION }} | |
- name: Create release | |
uses: softprops/action-gh-release@v2 | |
if: startsWith(github.ref, 'refs/tags/') | |
with: | |
draft: true | |
files: android/app/build/outputs/apk/dev/debug/app-dev-debug.apk | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
- name: Upload build outputs (APKs) | |
uses: actions/upload-artifact@v4 | |
with: | |
name: build-outputs | |
path: android/app/build/outputs |