Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
695d149
ci: add GitHub Actions workflow for build, test and lint
Prajwal-4121998 Jun 25, 2026
cfae65e
ci: update .gitignore to exclude Gradle cache and retain wrapper files
Prajwal-4121998 Jun 25, 2026
c10bc95
fix: remove undeclared phantom modules from settings.gradle.kts
Prajwal-4121998 Jun 25, 2026
46c1d99
ci: complete Module 1 - proper three-job pipeline, branch triggers, g…
Prajwal-4121998 Jun 25, 2026
bbd4ea5
Merge pull request #1 from Prajwal-4121998/feature/ci-module1-cleanup
Prajwal-4121998 Jun 25, 2026
5b31750
ci: Module 2+3 - product flavors, signing config, flavor-aware CI pip…
Prajwal-4121998 Jun 26, 2026
a6fa4de
Merge pull request #2 from Prajwal-4121998/feature/ci-module2-build-v…
Prajwal-4121998 Jun 26, 2026
6b5ef02
ci: Module 4 - fix multi-module JaCoCo aggregation, calibrate thresholds
Prajwal-4121998 Jun 30, 2026
e22b328
Merge pull request #3 from Prajwal-4121998/feature/ci-module4-testing…
Prajwal-4121998 Jun 30, 2026
57f43d0
ci: Module 5 - Detekt static analysis across all modules
Prajwal-4121998 Jun 30, 2026
db1d989
Merge pull request #4 from Prajwal-4121998/feature/ci-module5-detekt
Prajwal-4121998 Jun 30, 2026
e0eb246
feat: data:product - Repository implementation with Room caching + un…
Prajwal-4121998 Jul 1, 2026
e7e9e6a
feat: data:product - Repository implementation with Room caching + un…
Prajwal-4121998 Jul 1, 2026
96ad86e
test: improve repository coverage to production grade
Prajwal-4121998 Jul 2, 2026
125bb62
Merge pull request #6 from Prajwal-4121998/feature/jacoco-production-…
Prajwal-4121998 Jul 2, 2026
4114ced
feat: core:designsystem - Material 3 theme from Stitch design spec
Prajwal-4121998 Jul 13, 2026
a02c1bc
Merge pull request #7 from Prajwal-4121998/feature/core-designsystem
Prajwal-4121998 Jul 13, 2026
15d609b
feat: feature:catalog - complete MVI catalog screen with Stitch desig…
Prajwal-4121998 Jul 17, 2026
477765b
Merge pull request #8 from Prajwal-4121998/feature/feature-catalog-mvi
Prajwal-4121998 Jul 17, 2026
2c5ce03
feat: feature:detail - complete MVI detail screen with Stitch design …
Prajwal-4121998 Jul 23, 2026
a4a79a8
Merge pull request #9 from Prajwal-4121998/feature/feature-detail-nav…
Prajwal-4121998 Jul 23, 2026
0167125
feat: implement feature:search with debounced local filtering, error …
Prajwal-4121998 Jul 28, 2026
f4e6bc1
Merge pull request #10 from Prajwal-4121998/feature/feature-search
Prajwal-4121998 Jul 28, 2026
883fc12
refactor: extract SearchProductsUseCase from SearchViewModel for SRP …
Prajwal-4121998 Jul 28, 2026
8630e76
Merge pull request #11 from Prajwal-4121998/feature/search-usecase-ex…
Prajwal-4121998 Jul 28, 2026
54599bd
feat(designsystem): content-shaped skeletons, Coil crossfade pipeline…
Prajwal-4121998 Aug 4, 2026
824f71f
Merge pull request #12 from Prajwal-4121998/feature/designsystem-poli…
Prajwal-4121998 Aug 4, 2026
f66e111
feat: WorkManager - periodic background product sync with constraints
Prajwal-4121998 Aug 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions keystore.propertie
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
storeFile=catalogapp-release.jks
storePassword=prajwal4121998
keyAlias=catalogapp-key
keyPassword=prajwal4121998
190 changes: 190 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,190 @@
name: CatalogApp CI

on:
push:
branches:
- main
- develop
- 'feature/**'
- 'hotfix/**'
pull_request:
branches:
- main
- develop
workflow_dispatch:

env:
GRADLE_OPTS: "-Dorg.gradle.daemon=false -Dorg.gradle.parallel=true -Dkotlin.incremental=false"

jobs:
# ── Job 1: Quality Gates ──────────────────────────────────────────────────
lint-and-test:
name: Lint + Test + Quality Gates
runs-on: ubuntu-latest

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
cache: gradle

- name: Cache Gradle build outputs
uses: actions/cache@v4
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
~/.android/build-cache
key: gradle-${{ runner.os }}-${{ hashFiles('**/*.gradle.kts', '**/gradle-wrapper.properties', '**/libs.versions.toml') }}
restore-keys: |
gradle-${{ runner.os }}-

- name: Grant gradlew permission
run: chmod +x gradlew

- name: Run Android Lint
run: ./gradlew lintDevDebug --stacktrace

- name: Run unit tests
run: ./gradlew testDevDebugUnitTest --stacktrace

- name: Generate JaCoCo coverage report
run: ./gradlew jacocoTestReport --stacktrace

- name: Verify coverage threshold
run: ./gradlew jacocoTestCoverageVerification --stacktrace

- name: Run Detekt
run: ./gradlew detekt --stacktrace

- name: Upload lint report
if: always()
uses: actions/upload-artifact@v4
with:
name: lint-report
path: app/build/reports/lint-results-devDebug.html
retention-days: 7

- name: Upload test results
if: always()
uses: actions/upload-artifact@v4
with:
name: test-results
path: '**/build/reports/tests/'
retention-days: 7

- name: Upload coverage report
if: always()
uses: actions/upload-artifact@v4
with:
name: jacoco-coverage-report
path: app/build/reports/jacoco/jacocoTestReport/html/
retention-days: 7

- name: Upload Detekt report
if: always()
uses: actions/upload-artifact@v4
with:
name: detekt-report
path: '**/build/reports/detekt/detekt.html'
retention-days: 7

# ── Job 2: Build ──────────────────────────────────────────────────────────
build:
name: Build APK / AAB
runs-on: ubuntu-latest
needs: lint-and-test

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
cache: gradle

- name: Cache Gradle build outputs
uses: actions/cache@v4
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
~/.android/build-cache
key: gradle-${{ runner.os }}-${{ hashFiles('**/*.gradle.kts', '**/gradle-wrapper.properties', '**/libs.versions.toml') }}
restore-keys: |
gradle-${{ runner.os }}-

- name: Grant gradlew permission
run: chmod +x gradlew

- name: Decode keystore
if: github.ref_name == 'main' || github.ref_name == 'develop'
run: |
echo "${{ secrets.KEYSTORE_BASE64 }}" | base64 --decode > ${{ github.workspace }}/catalogapp-release.jks
echo "KEYSTORE_FILE=${{ github.workspace }}/catalogapp-release.jks" >> $GITHUB_ENV

- name: Set signing environment variables
if: github.ref_name == 'main' || github.ref_name == 'develop'
run: |
echo "KEYSTORE_PASSWORD=${{ secrets.KEYSTORE_PASSWORD }}" >> $GITHUB_ENV
echo "KEY_ALIAS=${{ secrets.KEY_ALIAS }}" >> $GITHUB_ENV
echo "KEY_PASSWORD=${{ secrets.KEY_PASSWORD }}" >> $GITHUB_ENV

- name: Build Dev Debug APK (feature branches)
if: github.ref_name != 'develop' && github.ref_name != 'main'
run: ./gradlew assembleDevDebug --stacktrace

- name: Build Staging Debug APK (develop)
if: github.ref_name == 'develop'
run: ./gradlew assembleStagingDebug --stacktrace

- name: Build Prod Release AAB (main)
if: github.ref_name == 'main'
run: ./gradlew bundleProdRelease --stacktrace

- name: Upload Dev APK
if: github.ref_name != 'develop' && github.ref_name != 'main'
uses: actions/upload-artifact@v4
with:
name: dev-debug-apk-${{ github.run_number }}
path: app/build/outputs/apk/dev/debug/*.apk
retention-days: 7

- name: Upload Staging APK
if: github.ref_name == 'develop'
uses: actions/upload-artifact@v4
with:
name: staging-debug-apk-${{ github.run_number }}
path: app/build/outputs/apk/staging/debug/*.apk
retention-days: 1

- name: Upload Prod AAB
if: github.ref_name == 'main'
uses: actions/upload-artifact@v4
with:
name: prod-release-aab-${{ github.run_number }}
path: app/build/outputs/bundle/prodRelease/*.aab
retention-days: 1

- name: Clean up keystore
if: always()
run: rm -f ${{ github.workspace }}/catalogapp-release.jks

# ── Job 3: Deploy ─────────────────────────────────────────────────────────
deploy:
name: Deploy (Module 6 - pending UI)
runs-on: ubuntu-latest
needs: build
if: github.ref_name == 'develop' || github.ref_name == 'main'

steps:
- name: Deploy placeholder
run: echo "Firebase App Distribution configured in Module 6 after first UI screen"
59 changes: 36 additions & 23 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,32 +1,45 @@
# Built outputs
/build
app/build
core/*/build
data/*/build
domain/*/build
feature/*/build

# Gradle
.gradle
gradle/wrapper/gradle-wrapper.jar
*.apk
*.aab
*.ap_
*.dex

# Build folders
build/
app/build/
**/build/

# Gradle cache and wrapper
.gradle/
!gradle/wrapper/gradle-wrapper.jar
!gradle/wrapper/gradle-wrapper.properties

# Local configuration
local.properties
keystore.properties

# Android Studio / IntelliJ
.idea/
# Android Studio IDE files
*.iml
*.iws
*.ipr
captures/
.externalNativeBuild/
.cxx/
*.DS_Store
.idea/
.idea/workspace.xml
.idea/tasks.xml
.idea/gradle.xml
.idea/assetWizardSettings.xml
.idea/dictionaries
.idea/libraries
.idea/caches
.idea/modules.xml
.DS_Store

# Keystore — NEVER commit this
# Signing files — NEVER commit
*.jks
*.keystore

# Google Services (if added later)
google-services.json
# Navigation editor temp files
.navigation/

# Captures
captures/

# Secrets
secrets.properties
# Test results
/app/test-results/
Loading
Loading