Skip to main content

build-test-verify

Build, test, lint, and deploy commands for the Bitwarden Android project. Use when running tests, building APKs/AABs, running lint/detekt, deploying, using fastlane, or discovering codebase structure. Triggered by "run tests", "build", "gradle", "lint", "detekt", "deploy", "fastlane", "assemble", "verify", "coverage".

소스 정보

저장소
bitwarden/android
최근 소스 활동
2026년 3월 27일 13:13
감지된 SKILL.md 언어
영어
스타
9,497
포크
1,079

설치 방법

기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.

소스 파일 검토

설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.

SKILL.md 표시 중

SKILL.md
소스 지침 · 읽기 전용 미리보기
name
build-test-verify
version
0.1.0
description
Build, test, lint, and deploy commands for the Bitwarden Android project. Use when running tests, building APKs/AABs, running lint/detekt, deploying, using fastlane, or discovering codebase structure. Triggered by "run tests", "build", "gradle", "lint", "detekt", "deploy", "fastlane", "assemble", "verify", "coverage".
# Build, Test & Verify ## Environment Setup | Variable | Required | Description | |----------|----------|-------------| | `GITHUB_TOKEN` | Yes (CI) | GitHub Packages auth for SDK (`read:packages` scope) | | Build flavors | - | `standard` (Play Store), `fdroid` (no Google services) | | Build types | - | `debug`, `beta`, `release` | If builds fail resolving the Bitwarden SDK, verify `GITHUB_TOKEN` in `user.properties` or environment and check connectivity to `maven.pkg.github.com`. --- ## Building ```bash # Debug builds ./gradlew app:assembleDebug ./gradlew authenticator:assembleDebug # Release builds (requires signing keys) ./gradlew app:assembleStandardRelease ./gradlew app:bundleStandardRelease # F-Droid builds ./gradlew app:assembleFdroidRelease ``` --- ## Running Tests **IMPORTANT**: The app module uses the `standard` flavor. Always use `testStandardDebugUnitTest`, NOT `testDebugUnitTest`. **IMPORTANT**: Always pipe test output through a filter that captures failures on the first run. Gradle suppresses detailed failure output by default, so use `2>&1 | grep -E "FAILED|BUILD|expected:|actual:|AssertionError|failures" | head -30` to see pass/fail results and assertion details without needing a second run. ```bash # App module tests (correct flavor!) ./gradlew app:testStandardDebugUnitTest 2>&1 | grep -E "FAILED|BUILD|expected:|actual:|AssertionError|failures" | head -30 # Run specific test classes ./gradlew app:testStandardDebugUnitTest --tests "com.x8bit.bitwarden.SomeTest" 2>&1 | grep -E "FAILED|BUILD|expected:|actual:|AssertionError|failures" | head -30 # Run all unit tests across all modules ./gradlew test # Individual shared modules (no flavor needed) ./gradlew :core:test ./gradlew :data:test ./gradlew :network:test ./gradlew :ui:test # Authenticator module ./gradlew authenticator:testStandardDebugUnitTest ``` ### Reading Test Reports If you need full failure details beyond what grep captures, check the HTML test report: ```bash # After a test run, open the report at: # app/build/reports/tests/testStandardDebugUnitTest/index.html # Or read individual failure XML: find app/build/test-results -name "*.xml" -exec grep -l "failure" {} \; ``` ### Test Structure ``` app/src/test/ # App unit tests app/src/testFixtures/ # App test utilities core/src/testFixtures/ # Core test utilities (FakeDispatcherManager) data/src/testFixtures/ # Data test utilities (FakeSharedPreferences) network/src/testFixtures/ # Network test utilities (BaseServiceTest) ui/src/testFixtures/ # UI test utilities (BaseViewModelTest, BaseComposeTest) ``` ### Test Quick Reference - **Dispatcher Control**: `FakeDispatcherManager` from `:core:testFixtures` - **MockK**: `mockk<T> { every { } returns }`, `coEvery { }` for suspend - **Flow Testing**: Turbine with `stateEventFlow()` helper from `BaseViewModelTest` - **Time Control**: Inject `Clock` for deterministic time testing --- ## Lint & Static Analysis **IMPORTANT**: Prefer running detekt on modified files only — a full project scan is slow and unnecessary during development. The project supports a `-Pprecommit=true` flag that limits detekt to staged files. **IMPORTANT**: Always pipe detekt output through a filter to capture errors on the first run. Detekt prints violation details to stderr/stdout but Gradle can obscure them. Use the grep pattern below to see violations immediately. ```bash # Detekt on staged files only (preferred during development) git add -u && ./gradlew -Pprecommit=true detekt 2>&1 | grep -E "FAILED|BUILD|Line |Rule |Signature|detekt" | head -40 # Detekt on all files (full scan, use sparingly) ./gradlew detekt 2>&1 | grep -E "FAILED|BUILD|Line |Rule |Signature|detekt" | head -40 # Android Lint ./gradlew lint # Full validation suite (detekt + lint + tests + coverage) ./fastlane check ``` ### How `-Pprecommit=true` Works The root `build.gradle.kts` configures detekt tasks to use `git diff --name-only --cached` when this property is set, limiting analysis to staged files only. This is the same mechanism used by the project's pre-commit hook. Stage your changes with `git add` before running. --- ## Codebase Discovery ```bash # Find existing Bitwarden UI components find ui/src/main/kotlin/com/bitwarden/ui/platform/components/ -name "Bitwarden*.kt" | sort # Find all ViewModels grep -rl "BaseViewModel<" app/src/main/kotlin/ --include="*.kt" # Find all Navigation files with @Serializable routes find app/src/main/kotlin/ -name "*Navigation.kt" | sort # Find all Hilt modules find app/src/main/kotlin/ -name "*Module.kt" -path "*/di/*" | sort # Find all repository interfaces find app/src/main/kotlin/ -name "*Repository.kt" -not -name "*Impl.kt" -path "*/repository/*" | sort # Find encrypted disk source examples grep -rl "EncryptedPreferences" app/src/main/kotlin/ --include="*.kt" # Find Clock injection usage grep -rl "private val clock: Clock" app/src/main/kotlin/ --include="*.kt" # Search existing strings before adding new ones grep -n "search_term" ui/src/main/res/values/strings.xml ``` --- ## Deployment & Versioning **Version location**: `gradle/libs.versions.toml` ```toml appVersionCode = "1" appVersionName = "2025.11.1" ``` Pattern: `YEAR.MONTH.PATCH` **Publishing channels**: - **Play Store**: GitHub Actions workflow with signed AAB - **F-Droid**: Dedicated workflow with F-Droid signing keys - **Firebase App Distribution**: Beta testing
GitHub에서 보기