diff --git a/.github/label-pr.json b/.github/label-pr.json index d99d0d1b0d2..f127845bbdc 100644 --- a/.github/label-pr.json +++ b/.github/label-pr.json @@ -23,7 +23,8 @@ ], "app:password-manager": [ "app/", - "cxf/" + "cxf/", + "testharness/" ], "app:authenticator": [ "authenticator/" diff --git a/.github/workflows/build-testharness.yml b/.github/workflows/build-testharness.yml new file mode 100644 index 00000000000..91868eea863 --- /dev/null +++ b/.github/workflows/build-testharness.yml @@ -0,0 +1,134 @@ +name: Build Test Harness + +on: + push: + paths: + - testharness/** + workflow_dispatch: + inputs: + version-name: + description: "Optional. Version string to use, in X.Y.Z format. Overrides default in the project." + required: false + type: string + version-code: + description: "Optional. Build number to use. Overrides default of GitHub run number." + required: false + type: number + patch_version: + description: "Order 999 - Overrides Patch version" + type: boolean + +env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + JAVA_VERSION: 21 + +permissions: + contents: read + packages: read + +jobs: + version: + name: Calculate Version Name and Number + uses: bitwarden/android/.github/workflows/_version.yml@main + with: + app_codename: "bwpm" + base_version_number: 0 + version_name: ${{ inputs.version-name }} + version_number: ${{ inputs.version-code }} + patch_version: ${{ inputs.patch_version && '999' || '' }} + + build: + name: Build Test Harness + runs-on: ubuntu-24.04 + needs: version + + steps: + - name: Log inputs to job summary + uses: bitwarden/android/.github/actions/log-inputs@main + with: + inputs: "${{ toJson(inputs) }}" + + - name: Check out repo + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + with: + persist-credentials: false + + - name: Validate Gradle wrapper + uses: gradle/actions/wrapper-validation@4d9f0ba0025fe599b4ebab900eb7f3a1d93ef4c2 # v5.0.0 + + - name: Cache Gradle files + uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ${{ runner.os }}-gradle-v2-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties', '**/libs.versions.toml') }} + restore-keys: | + ${{ runner.os }}-gradle-v2- + + - name: Cache build output + uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4 + with: + path: | + ${{ github.workspace }}/build-cache + key: ${{ runner.os }}-build-cache-${{ github.sha }} + restore-keys: | + ${{ runner.os }}-build- + + - name: Configure JDK + uses: actions/setup-java@dded0888837ed1f317902acf8a20df0ad188d165 # v5.0.0 + with: + distribution: "temurin" + java-version: ${{ env.JAVA_VERSION }} + + - name: Configure Ruby + uses: ruby/setup-ruby@44511735964dcb71245e7e55f72539531f7bc0eb # v1.257.0 + with: + bundler-cache: true + + - name: Install Fastlane + run: | + gem install bundler:2.2.27 + bundle config path vendor/bundle + bundle install --jobs 4 --retry 3 + + - name: Increment version + env: + DEFAULT_VERSION_CODE: ${{ github.run_number }} + INPUT_VERSION_CODE: "${{ needs.version.outputs.version_number }}" + INPUT_VERSION_NAME: ${{ needs.version.outputs.version_name }} + run: | + VERSION_CODE="${INPUT_VERSION_CODE:-$DEFAULT_VERSION_CODE}" + VERSION_NAME_INPUT="${INPUT_VERSION_NAME:-}" + bundle exec fastlane setBuildVersionInfo \ + versionCode:"$VERSION_CODE" \ + versionName:"$VERSION_NAME_INPUT" + + regex='appVersionName = "(.+)"' + if [[ "$(cat gradle/libs.versions.toml)" =~ $regex ]]; then + VERSION_NAME="${BASH_REMATCH[1]}" + fi + echo "Version Name: ${VERSION_NAME}" >> "$GITHUB_STEP_SUMMARY" + echo "Version Number: $VERSION_CODE" >> "$GITHUB_STEP_SUMMARY" + + - name: Build Test Harness Debug APK + run: ./gradlew :testharness:assembleDebug + + - name: Upload Test Harness APK + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + with: + name: com.bitwarden.testharness.dev-debug.apk + path: testharness/build/outputs/apk/debug/com.bitwarden.testharness.dev.apk + if-no-files-found: error + + - name: Create checksum for Test Harness APK + run: | + sha256sum "testharness/build/outputs/apk/debug/com.bitwarden.testharness.dev.apk" \ + > ./com.bitwarden.testharness.dev.apk-sha256.txt + + - name: Upload Test Harness SHA file + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + with: + name: com.bitwarden.testharness.dev.apk-sha256.txt + path: ./com.bitwarden.testharness.dev.apk-sha256.txt + if-no-files-found: error diff --git a/testharness/build.gradle.kts b/testharness/build.gradle.kts index a09a0000301..e9cbf770bde 100644 --- a/testharness/build.gradle.kts +++ b/testharness/build.gradle.kts @@ -1,3 +1,4 @@ +import com.android.build.gradle.internal.api.BaseVariantOutputImpl import org.jetbrains.kotlin.gradle.dsl.JvmTarget plugins { @@ -19,8 +20,8 @@ android { // API 28 - CredentialManager with Play Services support minSdk = libs.versions.minSdkBwa.get().toInt() targetSdk = libs.versions.targetSdk.get().toInt() - versionCode = 1 - versionName = "1.0.0" + versionCode = libs.versions.appVersionCode.get().toInt() + versionName = libs.versions.appVersionName.get() testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } @@ -39,6 +40,15 @@ android { } } + applicationVariants.all { + outputs + .mapNotNull { it as? BaseVariantOutputImpl } + .forEach { output -> + // Set the APK output filename. + output.outputFileName = "$applicationId.apk" + } + } + buildFeatures { compose = true buildConfig = true