mirror of
https://github.com/fankes/termux-app.git
synced 2025-09-06 02:35:19 +08:00
The `versionName` will now follow semantic version `2.0.0` spec in the format `major.minor.patch(-prerelease)(+buildmetadata)`. This will make versioning the prerelease and github debug builds versions easier and follow a spec. The @termux devs should make sure that when bumping `versionName` in `build.gradle` files and when creating a tag for new releases on github that they include the patch number as well, like `v0.1.0` instead of just `v0.1`. The `build.gradle` files and `attach_debug_apks_to_release` workflow will now validate the version as well and the build/attachment will fail if `versionName` does not follow the spec. https://semver.org/spec/v2.0.0.html APKs released on github for debug build workflows and releases are now referred as `Github` releases as per7b10a35f
and94e01d68
, so APK filenames have been modified to include `github` in the filename. The APKs are still debuggable, so that tag remains too. For github workflows the apk filename format will be `termux-app_<current_version>+<last_commit_hash>-github-debug_<arch>.apk`, like `termux-app_v0.1.0+xxxxxxxx-github-debug_arm64-v8a.apk` and for github releases it will be `termux-app_<release_version>+github-debug_<arch>.apk`, like `termux-app_v0.1+github-debug_arm64-v8a.apk`. The `last_commit_hash` will be the first `8` characters of the commit hash. The `<last_commit_hash>-github-debug` will act as `buildmetadata` and will not affect versioning precedence. For github workflows triggered by `push` and `pull_request` triggers, `<current_version>+<last_commit_hash>` will be used as new `versionName`, like `v0.1.0+xxxxxxxx`. This will make tracking which build a user is using easier and help in resolving issues as well. Note that users using github releases and termux devs using `$TERMUX_VERSION` environment variables in scripts should take commit hash into consideration and possibly use something like `dpkg --compare-versions "$TERMUX_VERSION" ge 0.1` where appropriate instead of mathematical comparisons. The `app/build.gradle` now also supports following `TERMUX_` scoped environmental variables and `RELEASE_TAG` variable will not be used anymore since it may conflict with possibly other variables used by users. They will also allow enabling split APKs for both debug and release builds. - `TERMUX_APP_VERSION_NAME` will be used as `versionName` if its set. - `TERMUX_APK_VERSION_TAG` will be used as `termux-app_<TERMUX_APK_VERSION_TAG>_<arch>.apk` if its set. The `_<arch>` will only exist for split APKs. - `TERMUX_SPLIT_APKS_FOR_DEBUG_BUILDS` will define whether split APKs should be enabled for debug builds. Default value is `1`. - `TERMUX_SPLIT_APKS_FOR_RELEASE_BUILDS` will define whether split APKs should be enabled for release builds. Default value is `0` since F-Droid does not support split APKs, check #1904. So based on above, if in future github releases are to be converted to `release` builds instead of `debug` builds, something like following can be done and even a workflow can be created for it. Users can also build split APKs release builds for themselves if they want. ``` export TERMUX_SPLIT_APKS_FOR_RELEASE_BUILDS=1 ./gradlew assembleRelease -Pandroid.injected.signing.store.file="$(pwd)/app/dev_keystore.jks" -Pandroid.injected.signing.store.password=xrj45yWGLbsO7W0v -Pandroid.injected.signing.key.alias=alias -Pandroid.injected.signing.key.password=xrj45yWGLbsO7W0v ``` The APK will be found at `./app/build/outputs/apk/release/termux-app_<version>_<arch>.apk` The `TERMUX_SPLIT_APKS_FOR_DEBUG_BUILDS` can be set to `0` to disable building split APKs which may be helpful for users building termux on device considering they will extra space and build time. Instructions for building are at https://github.com/termux/termux-packages/pull/7227#issuecomment-893022283. ``` export TERMUX_SPLIT_APKS_FOR_DEBUG_BUILDS=0 ./gradlew assembleDebug ``` The APK will be found at `./app/build/outputs/apk/debug/termux-app_debug_universal.apk` Note that F-Droid uses algorithm at https://gitlab.com/fdroid/fdroidserver/-/blob/2.1a0/fdroidserver/build.py#L746 to automatically detect built APKs, so ensure any modifications to location or file name are compliant. Current updates should be. Auto updates are detected by checkupdates bot at https://gitlab.com/fdroid/fdroidserver/-/blob/master/fdroidserver/checkupdates.py
114 lines
4.7 KiB
YAML
114 lines
4.7 KiB
YAML
name: Build
|
|
|
|
on:
|
|
push:
|
|
branches:
|
|
- master
|
|
pull_request:
|
|
branches:
|
|
- master
|
|
|
|
jobs:
|
|
build:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- name: Clone repository
|
|
uses: actions/checkout@v2
|
|
|
|
- name: Build APKs
|
|
shell: bash {0}
|
|
run: |
|
|
exit_on_error() { echo "$1"; exit 1; }
|
|
|
|
echo "Setting vars"
|
|
# Set RELEASE_VERSION_NAME to "<CURRENT_VERSION_NAME>+<last_commit_hash>"
|
|
CURRENT_VERSION_NAME_REGEX='\s+versionName "([^"]+)"$'
|
|
CURRENT_VERSION_NAME="$(grep -m 1 -E "$CURRENT_VERSION_NAME_REGEX" ./app/build.gradle | sed -r "s/$CURRENT_VERSION_NAME_REGEX/\1/")"
|
|
RELEASE_VERSION_NAME="v$CURRENT_VERSION_NAME+${GITHUB_SHA:0:7}" # The "+" is necessary so that versioning precedence is not affected
|
|
if ! printf "%s" "${RELEASE_VERSION_NAME/v/}" | grep -qP '^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$'; then
|
|
exit_on_error "The versionName '${RELEASE_VERSION_NAME/v/}' is not a valid version as per semantic version '2.0.0' spec in the format 'major.minor.patch(-prerelease)(+buildmetadata)'. https://semver.org/spec/v2.0.0.html."
|
|
fi
|
|
|
|
APK_DIR_PATH="./app/build/outputs/apk/debug"
|
|
APK_VERSION_TAG="$RELEASE_VERSION_NAME-github-debug" # Note the "-", GITHUB_SHA will already have "+" before it
|
|
APK_BASENAME_PREFIX="termux-app_$APK_VERSION_TAG"
|
|
|
|
# Used by attachment steps later
|
|
echo "APK_DIR_PATH=$APK_DIR_PATH" >> $GITHUB_ENV
|
|
echo "APK_VERSION_TAG=$APK_VERSION_TAG" >> $GITHUB_ENV
|
|
echo "APK_BASENAME_PREFIX=$APK_BASENAME_PREFIX" >> $GITHUB_ENV
|
|
|
|
echo "Building APKs for '$RELEASE_VERSION_NAME' build"
|
|
export TERMUX_APP_VERSION_NAME="${RELEASE_VERSION_NAME/v/}" # Used by app/build.gradle
|
|
export TERMUX_APK_VERSION_TAG="$APK_VERSION_TAG" # Used by app/build.gradle
|
|
if ! ./gradlew assembleDebug; then
|
|
exit_on_error "Build failed for '$RELEASE_VERSION_NAME' build."
|
|
fi
|
|
|
|
echo "Validating APKs"
|
|
for abi in universal arm64-v8a armeabi-v7a x86_64 x86; do
|
|
if ! test -f "$APK_DIR_PATH/${APK_BASENAME_PREFIX}_$abi.apk"; then
|
|
files_found="$(ls "$APK_DIR_PATH")"
|
|
exit_on_error "Failed to find built APK at '$APK_DIR_PATH/${APK_BASENAME_PREFIX}_$abi.apk'. Files found: "$'\n'"$files_found"
|
|
fi
|
|
done
|
|
|
|
echo "Generating sha25sums file"
|
|
if ! (cd "$APK_DIR_PATH"; sha256sum \
|
|
"${APK_BASENAME_PREFIX}_universal.apk" \
|
|
"${APK_BASENAME_PREFIX}_arm64-v8a.apk" \
|
|
"${APK_BASENAME_PREFIX}_armeabi-v7a.apk" \
|
|
"${APK_BASENAME_PREFIX}_x86_64.apk" \
|
|
"${APK_BASENAME_PREFIX}_x86.apk" \
|
|
> sha256sums); then
|
|
exit_on_error "Generate sha25sums failed for '$RELEASE_VERSION_NAME' release."
|
|
fi
|
|
|
|
- name: Attach universal APK file
|
|
uses: actions/upload-artifact@v2
|
|
with:
|
|
name: ${{ env.APK_BASENAME_PREFIX }}_universal
|
|
path: |
|
|
${{ env.APK_DIR_PATH }}/${{ env.APK_BASENAME_PREFIX }}_universal.apk
|
|
${{ env.APK_DIR_PATH }}/output-metadata.json
|
|
|
|
- name: Attach arm64-v8a APK file
|
|
uses: actions/upload-artifact@v2
|
|
with:
|
|
name: ${{ env.APK_BASENAME_PREFIX }}_arm64-v8a
|
|
path: |
|
|
${{ env.APK_DIR_PATH }}/${{ env.APK_BASENAME_PREFIX }}_arm64-v8a.apk
|
|
${{ env.APK_DIR_PATH }}/output-metadata.json
|
|
|
|
- name: Attach armeabi-v7a APK file
|
|
uses: actions/upload-artifact@v2
|
|
with:
|
|
name: ${{ env.APK_BASENAME_PREFIX }}_armeabi-v7a
|
|
path: |
|
|
${{ env.APK_DIR_PATH }}/${{ env.APK_BASENAME_PREFIX }}_armeabi-v7a.apk
|
|
${{ env.APK_DIR_PATH }}/output-metadata.json
|
|
|
|
- name: Attach x86_64 APK file
|
|
uses: actions/upload-artifact@v2
|
|
with:
|
|
name: ${{ env.APK_BASENAME_PREFIX }}_x86_64
|
|
path: |
|
|
${{ env.APK_DIR_PATH }}/${{ env.APK_BASENAME_PREFIX }}_x86_64.apk
|
|
${{ env.APK_DIR_PATH }}/output-metadata.json
|
|
|
|
- name: Attach x86 APK file
|
|
uses: actions/upload-artifact@v2
|
|
with:
|
|
name: ${{ env.APK_BASENAME_PREFIX }}_x86
|
|
path: |
|
|
${{ env.APK_DIR_PATH }}/${{ env.APK_BASENAME_PREFIX }}_x86.apk
|
|
${{ env.APK_DIR_PATH }}/output-metadata.json
|
|
|
|
- name: Attach sha256sums file
|
|
uses: actions/upload-artifact@v2
|
|
with:
|
|
name: sha256sums
|
|
path: |
|
|
${{ env.APK_DIR_PATH }}/sha256sums
|
|
${{ env.APK_DIR_PATH }}/output-metadata.json
|