diff --git a/.github/workflows/build-only.yml b/.github/workflows/build-only.yml new file mode 100644 index 0000000..ece337a --- /dev/null +++ b/.github/workflows/build-only.yml @@ -0,0 +1,234 @@ +name: "Build only" + +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: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + submodules: 'recursive' + - name: Set RELEASE + run: | + echo "RELEASE=${{ startsWith(github.ref_name, 'v') }}" >> $GITHUB_ENV + + - name: Cache JNI libs + uses: actions/cache@v3 + 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@v2 + - 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@1.79.0 + 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@v3 + 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 + + # 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@v2 + with: + submodules: 'recursive' + + - 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: ubuntu-20.04 + needs: [build-rust, get-versionCode] + strategy: + fail-fast: true + matrix: + type: ['apk', 'aab'] + + steps: + - uses: actions/checkout@v2 + 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@v1 + with: + java-version: ${{ env.JAVA_VERSION }} + + # Android SDK & NDK + - name: Set up Android SDK + uses: android-actions/setup-android@v2 + - 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@v3 + 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: true + + - 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@v3 + with: + name: aw-android + path: dist/aw-android*.${{ matrix.type }} + + release-gh: + needs: [build-apk] + 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@v3 + 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@v2 + id: version + with: + prefix: 'v' + + # create a release + - name: Release + uses: softprops/action-gh-release@v1 + 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 \ No newline at end of file diff --git a/Makefile b/Makefile index e1648c5..d264c60 100644 --- a/Makefile +++ b/Makefile @@ -210,4 +210,4 @@ clean: .PHONY: fastlane/metadata/android/en-US/images/icon.png fastlane/metadata/android/en-US/images/icon.png: aw-server-rust/aw-webui/media/logo/logo.png - convert $< -resize 75% -gravity center -background white -extent 512x512 $@ + magick $< -resize 75% -gravity center -background white -extent 512x512 $@ diff --git a/README.md b/README.md index bbb6201..ee19819 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ If you haven't already, initialize the submodules with: `git submodule update -- To build aw-server-rust you need to have Rust nightly installed (with rustup). Then you can build it with: -``` +```sh export ANDROID_NDK_HOME=`pwd`/aw-server-rust/NDK # The path to your NDK pushd aw-server-rust && ./install-ndk.sh; popd # This configures the NDK for use with Rust, and installs the NDK if missing env RELEASE=false make aw-server-rust # Set RELEASE=true to build in release mode (slower build, harder to debug) diff --git a/android.jks.age b/android.jks.age index 7a1d329..9d9b8d4 100644 Binary files a/android.jks.age and b/android.jks.age differ