build-test-verify

Команды сборки, тестирования, линтинга и развертывания для проекта Bitwarden Android. Используйте при запуске тестов, сборке APK/AAB, запуске lint/detekt, развертывании, использовании…

npx skills add https://github.com/bitwarden/android --skill build-test-verify

Build, Test & Verify

Environment Setup

VariableRequiredDescription
GITHUB_TOKENYes (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

# 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.

# 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:

# 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.

# 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

# 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

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

Больше skills от bitwarden

figma-to-angular
bitwarden
Этот навык преобразует спецификацию дизайна Figma в полностью реализованный компонент Angular с историями Storybook в монорепозитории Bitwarden Clients. Результат должен визуально соответствовать дизайну, следуя всем соглашениям кодовой базы.
force-multiplier
bitwarden
Применить одно намерение ко многим целям одновременно — к флоту репозиториев в экосистеме Bitwarden или ко многим проектам внутри монорепозитория — как N единообразных,…
analyzing-git-sessions
bitwarden
Анализирует git-коммиты и изменения в заданном временном интервале или диапазоне коммитов, предоставляя структурированные сводки для проверки кода, ретроспектив, рабочих журналов или сессий…
coordinating-cross-team-breakdown
bitwarden
Координировать кросс-командное ревью и утверждение для Bitwarden Tech Breakdown. Используется при определении затронутых команд, построении таблицы утверждения Части 3, отслеживании…
assessing-jira-issue-relevance
bitwarden
Используйте, когда пользователь предоставляет один ключ задачи Jira и спрашивает, актуальна ли она, применима ли она, ожидает ли рассмотрения, является ли она ошибкой, была ли исправлена или может…
assessing-test-coverage
bitwarden
Используйте, когда нужно определить, какое тестовое покрытие УЖЕ существует для конкретного изменения (PR, ключ Jira, документ Tech Breakdown, Testmo CSV, изменённые пути или указанные…
retrospecting
bitwarden
Выполняет всесторонний анализ сессий Claude Code, изучая историю git, журналы разговоров, изменения кода и собирая отзывы пользователей для генерации…
reviewing-incremental-changes
bitwarden
Используйте этот навык при повторном рецензировании PR, в котором уже есть комментарии, или при ответе на изменения разработчика после первоначального рецензирования. Применяйте, когда существуют обсуждения PR или…