{ "output": "name: CI\npermissions:\n contents: read\n pull-requests: write\n checks: write\n\nenv:\n FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true\n\non:\n push:\n branches: [ \"master\" ]\n pull_request:\n branches: [ \"master\" ]\n\nconcurrency:\n group: ci-${{ github.ref }}\n cancel-in-progress: true\n\njobs:\n lint:\n name: Lint & Static Analysis\n runs-on: ubuntu-latest\n steps:\n - name: Checkout code\n uses: actions/checkout@v6\n\n - name: Set up JDK 17\n uses: actions/setup-java@v5\n with:\n java-version: '17'\n distribution: 'temurin'\n cache: gradle\n\n - name: Grant execute permission for gradlew\n run: chmod +x gradlew\n\n - name: Run Lint & Static Analysis\n run: ./gradlew lintDebug ktlintCheck detekt\n\n test:\n name: Unit & Robolectric Tests\n runs-on: ubuntu-latest\n steps:\n - name: Checkout code\n uses: actions/checkout@v6\n with:\n lfs: true\n\n - name: Set up JDK 17\n uses: actions/setup-java@v5\n with:\n java-version: '17'\n distribution: 'temurin'\n cache: gradle\n\n - name: Grant execute permission for gradlew\n run: chmod +x gradlew\n\n - name: Run JVM Tests & Generate Combined Coverage\n run: ./gradlew verifyWithCoverage -Proborazzi.test.verify=true -Pcoverage --info\n\n - name: Upload HTML Coverage Report\n uses: actions/upload-artifact@v7\n with:\n name: jacoco-html-report\n path: app/build/reports/jacoco/verifyWithCoverage/html/\n\n - name: Upload Roborazzi Results\n if: failure()\n uses: actions/upload-artifact@v7\n with:\n name: roborazzi-results\n path: app/build/test-results/roborazzi\n\n build:\n name: Build Debug APK and Bundle\n runs-on: ubuntu-latest\n needs: [ lint, test ]\n steps:\n - name: Checkout code\n uses: actions/checkout@v6\n\n - name: Set up JDK 17\n uses: actions/setup-java@v5\n with:\n java-version: '17'\n distribution: 'temurin'\n cache: gradle\n\n - name: Grant execute permission for gradlew\n run: chmod +x gradlew\n\n - name: Build Debug APK and Bundle\n run: ./gradlew assembleDebug bundleDebug\n\n - name: Upload Debug APK\n uses: actions/upload-artifact@v7\n with:\n name: debug-apk\n path: app/build/outputs/apk/debug/*.apk\n if-no-files-found: error\n retention-days: 7\n\n ci-success:\n name: CI Success\n if: ${{ always() }}\n runs-on: ubuntu-latest\n needs: [ lint, test, build ]\n steps:\n - name: Verify required jobs succeeded\n run: |\n if [ \"${{ needs.lint.result }}\" != \"success\" ] || \\\n [ \"${{ needs.test.result }}\" != \"success\" ] || \\\n [ \"${{ needs.build.result }}\" != \"success\" ]; then\n echo \"One or more required jobs did not succeed:\"\n echo \"lint=${{ needs.lint.result }}\"\n echo \"test=${{ needs.test.result }}\"\n echo \"build=${{ needs.build.result }}\"\n exit 1\n fi\n\n echo \"All checks passed successfully!\"\n" }