feat: playing around with aw-sync on android and misc #377
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Build | |
| on: | |
| push: | |
| branches: [ master ] | |
| tags: | |
| - v* | |
| pull_request: | |
| branches: [ master ] | |
| env: | |
| NDK_VERSION: '25.2.9519653' | |
| NODE_VERSION: '16' | |
| JAVA_VERSION: '17' | |
| jobs: | |
| build-rust: | |
| name: Build aw-server-rust | |
| runs-on: ubicloud-standard-8 | |
| steps: | |
| - uses: actions/checkout@v4 | |
| with: | |
| submodules: 'recursive' | |
| - name: Set RELEASE | |
| run: | | |
| echo "RELEASE=${{ startsWith(github.ref_name, 'v') }}" >> $GITHUB_ENV | |
| - name: Cache JNI libs | |
| uses: actions/cache@v4 | |
| id: cache-jniLibs | |
| env: | |
| cache-name: jniLibs | |
| with: | |
| path: mobile/src/main/jniLibs/ | |
| key: ${{ env.cache-name }}-release-${{ env.RELEASE }}-ndk-${{ env.NDK_VERSION }}-${{ hashFiles('.git/modules/aw-server-rust/HEAD') }} | |
| - name: Display structure of downloaded files | |
| if: steps.cache-jniLibs.outputs.cache-hit == 'true' | |
| run: | | |
| pushd mobile/src/main/jniLibs && ls -R && popd | |
| # Android SDK & NDK | |
| - name: Set up Android SDK | |
| if: steps.cache-jniLibs.outputs.cache-hit != 'true' | |
| uses: android-actions/setup-android@v3 | |
| - name: Set up Android NDK | |
| if: steps.cache-jniLibs.outputs.cache-hit != 'true' | |
| run: | | |
| sdkmanager "ndk;${{ env.NDK_VERSION }}" | |
| ANDROID_NDK_HOME="$ANDROID_SDK_ROOT/ndk/${{ env.NDK_VERSION }}" | |
| ls $ANDROID_NDK_HOME | |
| echo "ANDROID_NDK_HOME=$ANDROID_NDK_HOME" >> $GITHUB_ENV | |
| # Rust | |
| - name: Set up Rust | |
| id: toolchain | |
| uses: dtolnay/rust-toolchain@stable | |
| if: steps.cache-jniLibs.outputs.cache-hit != 'true' | |
| - name: Set up Rust toolchain for Android NDK | |
| if: steps.cache-jniLibs.outputs.cache-hit != 'true' | |
| run: | | |
| ./aw-server-rust/install-ndk.sh | |
| - name: Cache cargo build | |
| uses: actions/cache@v4 | |
| if: steps.cache-jniLibs.outputs.cache-hit != 'true' | |
| env: | |
| cache-name: cargo-build-target | |
| with: | |
| path: aw-server-rust/target | |
| # key needs to contain cachekey due to https://github.com/ActivityWatch/aw-server-rust/issues/180 | |
| key: ${{ env.cache-name }}-${{ runner.os }}-release-${{ env.RELEASE }}-${{ steps.toolchain.outputs.cachekey }}-${{ hashFiles('**/Cargo.lock') }} | |
| restore-keys: | | |
| ${{ env.cache-name }}-${{ runner.os }}-release-${{ env.RELEASE }}-${{ steps.toolchain.outputs.cachekey }}- | |
| - name: Build aw-server-rust | |
| if: steps.cache-jniLibs.outputs.cache-hit != 'true' | |
| run: | | |
| make aw-server-rust | |
| - name: Check that jniLibs present | |
| run: | | |
| test -e mobile/src/main/jniLibs/x86_64/libaw_server.so | |
| - name: Upload jniLibs artifact | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: jniLibs | |
| path: mobile/src/main/jniLibs/ | |
| # This needs to be a seperate job since fastlane update_version, | |
| # fails if run concurrently (such as in build apk/aab matrix), | |
| # thus we need to run it once and and reuse the results. | |
| # https://github.com/fastlane/fastlane/issues/13689#issuecomment-439217502 | |
| get-versionCode: | |
| name: Get latest versionCode | |
| runs-on: ubuntu-latest | |
| outputs: | |
| versionCode: ${{ steps.versionCode.outputs.versionCode }} | |
| steps: | |
| - uses: actions/checkout@v4 | |
| with: | |
| submodules: 'recursive' | |
| # Ruby & Fastlane | |
| # version set by .ruby-version | |
| - name: Set up Ruby and install fastlane | |
| uses: ruby/setup-ruby@v1 | |
| with: | |
| bundler-cache: true | |
| # Needed for `fastlane update_version` | |
| - uses: adnsio/setup-age-action@v1.2.0 | |
| - name: Load Fastlane secrets | |
| env: | |
| KEY_FASTLANE_API: ${{ secrets.KEY_FASTLANE_API }} | |
| run: | | |
| printf "$KEY_FASTLANE_API" > fastlane/api-8546008605074111507-287154-450dc77b365f.json.key | |
| cat fastlane/api-8546008605074111507-287154-450dc77b365f.json.age \ | |
| | age -d -i fastlane/api-8546008605074111507-287154-450dc77b365f.json.key \ | |
| -o fastlane/api-8546008605074111507-287154-450dc77b365f.json | |
| rm fastlane/api-8546008605074111507-287154-450dc77b365f.json.key | |
| # Retry this, in case there are concurrent jobs, which may lead to the error: | |
| # "Google Api Error: Invalid request - This Edit has been deleted." | |
| - name: Update versionCode | |
| uses: Wandalen/wretry.action@v3 | |
| with: | |
| command: bundle exec fastlane update_version | |
| attempt_limit: 3 | |
| attempt_delay: 20000 | |
| - name: Output versionCode | |
| id: versionCode | |
| run: | | |
| cat mobile/build.gradle | grep versionCode | sed 's/.*\s\([0-9]*\)$/versionCode=\1/' >> "$GITHUB_OUTPUT" | |
| build-apk: | |
| name: Build ${{ matrix.type }} | |
| runs-on: ubicloud-standard-4 | |
| needs: [build-rust, get-versionCode] | |
| strategy: | |
| fail-fast: true | |
| matrix: | |
| type: ['apk', 'aab'] | |
| steps: | |
| - uses: actions/checkout@v4 | |
| with: | |
| submodules: 'recursive' | |
| - uses: ActivityWatch/check-version-format-action@v2 | |
| id: version | |
| with: | |
| prefix: 'v' | |
| - name: Echo version | |
| run: | | |
| echo "${{ steps.version.outputs.full }} (stable: ${{ steps.version.outputs.is_stable }})" | |
| - name: Set RELEASE | |
| run: | | |
| # Build in release mode if on a tag/release (longer build times) | |
| echo "RELEASE=${{ startsWith(github.ref_name, 'v') }}" >> $GITHUB_ENV | |
| - name: Set up JDK | |
| uses: actions/setup-java@v4 | |
| with: | |
| distribution: 'temurin' | |
| java-version: ${{ env.JAVA_VERSION }} | |
| # Android SDK & NDK | |
| - name: Set up Android SDK | |
| uses: android-actions/setup-android@v3 | |
| - name: Set up Android NDK | |
| run: | | |
| sdkmanager "ndk;${{ env.NDK_VERSION }}" | |
| ANDROID_NDK_HOME="$ANDROID_SDK_ROOT/ndk/${{ env.NDK_VERSION }}" | |
| ls $ANDROID_NDK_HOME | |
| echo "ANDROID_NDK_HOME=$ANDROID_NDK_HOME" >> $GITHUB_ENV | |
| # Restores jniLibs from cache | |
| # `actions/cache/restore` only restores, without saving back in a post-hook | |
| - uses: actions/cache/restore@v4 | |
| id: cache-jniLibs | |
| env: | |
| cache-name: jniLibs | |
| with: | |
| path: mobile/src/main/jniLibs/ | |
| key: ${{ env.cache-name }}-release-${{ env.RELEASE }}-ndk-${{ env.NDK_VERSION }}-${{ hashFiles('.git/modules/aw-server-rust/HEAD') }} | |
| fail-on-cache-miss: false | |
| - name: Check that jniLibs present | |
| run: | | |
| test -e mobile/src/main/jniLibs/x86_64/libaw_server.so | |
| - name: Set versionName | |
| if: startsWith(github.ref, 'refs/tags/v') # only on runs triggered from tag | |
| run: | | |
| # Sets versionName, tail used to skip "v" at start of tag name | |
| SHORT_VERSION=$(echo "${{ github.ref_name }}" | tail -c +2 -) | |
| sed -i "s/versionName \".*\"/versionName \"$SHORT_VERSION\"/g" \ | |
| mobile/build.gradle | |
| - name: Set versionCode | |
| run: | | |
| # Sets versionCode | |
| sed -i "s/versionCode .*/versionCode ${{needs.get-versionCode.outputs.versionCode}}/" \ | |
| mobile/build.gradle | |
| - uses: adnsio/setup-age-action@v1.2.0 | |
| - name: Load Android secrets | |
| if: env.KEY_ANDROID_JKS != null | |
| env: | |
| KEY_ANDROID_JKS: ${{ secrets.KEY_ANDROID_JKS }} | |
| run: | | |
| printf "$KEY_ANDROID_JKS" > android.jks.key | |
| cat android.jks.age | age -d -i android.jks.key -o android.jks | |
| rm android.jks.key | |
| - name: Assemble | |
| env: | |
| JKS_STOREPASS: ${{ secrets.KEY_ANDROID_JKS_STOREPASS }} | |
| JKS_KEYPASS: ${{ secrets.KEY_ANDROID_JKS_KEYPASS }} | |
| run: | | |
| make dist/aw-android.${{ matrix.type }} | |
| - name: Upload | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: aw-android | |
| path: dist/aw-android*.${{ matrix.type }} | |
| test: | |
| name: Test | |
| runs-on: ubuntu-24.04 | |
| needs: [build-rust] | |
| env: | |
| SUPPLY_TRACK: production # used by fastlane to determine track to publish to | |
| steps: | |
| - uses: actions/checkout@v4 | |
| with: | |
| submodules: 'recursive' | |
| - name: Set RELEASE | |
| run: | | |
| echo "RELEASE=${{ startsWith(github.ref_name, 'v') }}" >> $GITHUB_ENV | |
| - name: Set up JDK | |
| uses: actions/setup-java@v4 | |
| with: | |
| distribution: 'temurin' | |
| java-version: ${{ env.JAVA_VERSION }} | |
| # Android SDK & NDK | |
| - name: Set up Android SDK | |
| uses: android-actions/setup-android@v3 | |
| - name: Set up Android NDK | |
| run: | | |
| sdkmanager "ndk;${{ env.NDK_VERSION }}" | |
| ANDROID_NDK_HOME="$ANDROID_SDK_ROOT/ndk/${{ env.NDK_VERSION }}" | |
| ls $ANDROID_NDK_HOME | |
| echo "ANDROID_NDK_HOME=$ANDROID_NDK_HOME" >> $GITHUB_ENV | |
| # Restores jniLibs from cache | |
| # `actions/cache/restore` only restores, without saving back in a post-hook | |
| - uses: actions/cache/restore@v4 | |
| id: cache-jniLibs | |
| env: | |
| cache-name: jniLibs | |
| with: | |
| path: mobile/src/main/jniLibs/ | |
| key: ${{ env.cache-name }}-release-${{ env.RELEASE }}-ndk-${{ env.NDK_VERSION }}-${{ hashFiles('.git/modules/aw-server-rust/HEAD') }} | |
| fail-on-cache-miss: false | |
| - name: Check that jniLibs present | |
| if: steps.cache-jniLibs.outputs.cache-hit == 'true' | |
| run: | | |
| test -e mobile/src/main/jniLibs/x86_64/libaw_server.so | |
| # Test | |
| - name: Test | |
| if: steps.cache-jniLibs.outputs.cache-hit == 'true' | |
| run: | | |
| make test | |
| test-e2e: | |
| name: Test E2E | |
| needs: [build-rust] | |
| #if: false # disabled | |
| #runs-on: "macos-12" # macOS-latest | |
| runs-on: ubicloud-standard-8 | |
| env: | |
| MATRIX_E_SDK: ${{ matrix.api-level }} | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| api-level: [29] | |
| steps: | |
| - uses: actions/checkout@v4 | |
| with: | |
| submodules: 'recursive' | |
| - name: Set RELEASE | |
| run: | | |
| echo "RELEASE=${{ startsWith(github.ref_name, 'v') }}" >> $GITHUB_ENV | |
| - name: Download jniLibs artifact | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: jniLibs | |
| path: mobile/src/main/jniLibs/ | |
| - name: Display structure of downloaded files | |
| run: | | |
| pushd mobile/src/main/jniLibs && ls -R && popd | |
| - name: Set up JDK | |
| uses: actions/setup-java@v4 | |
| with: | |
| distribution: 'temurin' | |
| java-version: ${{ env.JAVA_VERSION }} | |
| - name: Run Emulator and E2E tests | |
| uses: reactivecircus/android-emulator-runner@v2 | |
| timeout-minutes: 30 | |
| id: test | |
| with: | |
| api-level: ${{ matrix.api-level }} | |
| target: google_apis | |
| arch: x86_64 | |
| ndk: ${{ env.NDK_VERSION }} | |
| emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -no-snapshot-save | |
| disable-animations: true | |
| script: | | |
| make test-e2e || true | |
| adb install -r mobile/build/outputs/apk/debug/mobile-debug.apk | |
| adb shell monkey -p net.activitywatch.android.debug -c android.intent.category.LAUNCHER 1 | |
| sleep 3 | |
| adb shell screencap -p /sdcard/screenshot.png | |
| adb pull /sdcard/screenshot.png . | |
| mkdir -p mobile/build | |
| adb logcat -d > mobile/build/logcat.log | |
| - name: Upload screenshot | |
| uses: actions/upload-artifact@v4 | |
| if: ${{ success() || steps.test.conclusion == 'failure' }} | |
| with: | |
| name: emulator-screenshot | |
| path: screenshot.png | |
| - name: Upload logcat | |
| if: ${{ success() || steps.test.conclusion == 'failure' }} | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: logcat | |
| path: mobile/build/logcat.log | |
| #- name: Publish Test Report | |
| # # # uses: mikepenz/action-junit-report@v3 | |
| # # # # # TODO: Format a little ? or Use some utility to confier GITHUB_STE_SUMMARY.html below into markdown before outputting it into $GITHUB_STEP_SUMMARY? | |
| # if: ${{ success() || steps.test.conclusion == 'failure'}} | |
| # # # with: | |
| # # # report_paths: '**/build/reports/*Tests/**/*.html' # '**/build/test-results/test/TEST-*.xml' | |
| # run: | | |
| # for file in ./mobile/build/reports/androidTests/connected/*.html; do cat $file >> GITHUB_STEP_SUMMARY.html ; done | |
| # # echo '<style>' >> GITHUB_STEP_SUMMARY.html;for file in ./mobile/build/reports/androidTests/connected/**/*.css; do cat $file >> GITHUB_STEP_SUMMARY.html ; done; echo '</style>' >> GITHUB_STEP_SUMMARY.html; | |
| # cat GITHUB_STEP_SUMMARY.html >> $GITHUB_STEP_SUMMARY | |
| release-fastlane: | |
| needs: [build-apk, test] | |
| if: startsWith(github.ref, 'refs/tags/v') # only on runs triggered from tag | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Download APK & AAB | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: aw-android | |
| path: dist | |
| - name: Display structure of downloaded files | |
| working-directory: dist | |
| run: ls -R | |
| # Ruby & Fastlane | |
| # version set by .ruby-version | |
| - name: Set up Ruby and install fastlane | |
| uses: ruby/setup-ruby@v1 | |
| with: | |
| bundler-cache: true | |
| # detect if version tag is stable/beta | |
| - uses: nowsprinting/check-version-format-action@v4 | |
| id: version | |
| with: | |
| prefix: 'v' | |
| - name: Set SUPPLY_TRACK | |
| run: | | |
| # Set SUPPLY_TRACK (used by fastlane) depending on is_stable | |
| if [[ "${{ steps.version.outputs.is_stable }}" == "true" ]]; then | |
| SUPPLY_TRACK="production" | |
| else | |
| SUPPLY_TRACK="internal" | |
| fi | |
| echo "SUPPLY_TRACK=${SUPPLY_TRACK}" >> $GITHUB_ENV | |
| - uses: adnsio/setup-age-action@v1.2.0 | |
| - name: Load Android secrets | |
| env: | |
| KEY_FASTLANE_API: ${{ secrets.KEY_FASTLANE_API }} | |
| run: | | |
| printf "$KEY_FASTLANE_API" > fastlane/api-8546008605074111507-287154-450dc77b365f.json.key | |
| cat fastlane/api-8546008605074111507-287154-450dc77b365f.json.age \ | |
| | age -d -i fastlane/api-8546008605074111507-287154-450dc77b365f.json.key \ | |
| -o fastlane/api-8546008605074111507-287154-450dc77b365f.json | |
| rm fastlane/api-8546008605074111507-287154-450dc77b365f.json.key | |
| - name: Release with fastlane | |
| run: | | |
| # bundle exec fastlane supply run --apk dist/*.apk | |
| bundle exec fastlane supply run --aab dist/*.aab | |
| release-gh: | |
| needs: [build-apk, test] | |
| if: startsWith(github.ref, 'refs/tags/v') # only on runs triggered from tag | |
| runs-on: ubuntu-latest | |
| steps: | |
| # Will download all artifacts to path | |
| - name: Download release APK & AAB | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: aw-android | |
| path: dist | |
| - name: Display structure of downloaded files | |
| working-directory: dist | |
| run: ls -R | |
| # detect if version tag is stable/beta | |
| - uses: nowsprinting/check-version-format-action@v4 | |
| id: version | |
| with: | |
| prefix: 'v' | |
| # create a release | |
| - name: Release | |
| uses: softprops/action-gh-release@v2 | |
| with: | |
| draft: true | |
| prerelease: ${{ !(steps.version.outputs.is_stable == 'true') }} # must compare to true, since boolean outputs are actually just strings, and "false" is truthy since it's not empty: https://github.com/actions/runner/issues/1483#issuecomment-994986996 | |
| files: | | |
| dist/*.apk | |
| dist/*.aab | |
| # body_path: dist/release_notes/release_notes.md | |