diff --git a/.github/autobuild/android.sh b/.github/autobuild/android.sh new file mode 100755 index 0000000000..7aeb4ce82f --- /dev/null +++ b/.github/autobuild/android.sh @@ -0,0 +1,112 @@ +#!/bin/bash +set -eu + +COMMANDLINETOOLS_VERSION=6858069 +ANDROID_NDK_VERSION=r21d +ANDROID_PLATFORM=android-30 +ANDROID_BUILD_TOOLS=30.0.2 +AQTINSTALL_VERSION=2.0.6 +QT_VERSION=5.15.2 + +# Only variables which are really needed by sub-commands are exported. +# Definitions have to stay in a specific order due to dependencies. +QT_BASEDIR="/opt/Qt" +ANDROID_BASEDIR="/opt/android" +BUILD_DIR=build +export ANDROID_SDK_ROOT="${ANDROID_BASEDIR}/android-sdk" +COMMANDLINETOOLS_DIR="${ANDROID_SDK_ROOT}"/cmdline-tools/latest/ +ANDROID_NDK_ROOT="${ANDROID_BASEDIR}/android-ndk" +ANDROID_NDK_HOST="linux-x86_64" +ANDROID_SDKMANAGER="${COMMANDLINETOOLS_DIR}/bin/sdkmanager" +export JAVA_HOME="/usr/lib/jvm/java-8-openjdk-amd64/" +export PATH="${PATH}:${ANDROID_SDK_ROOT}/tools" +export PATH="${PATH}:${ANDROID_SDK_ROOT}/platform-tools" + +if [[ ! ${jamulus_buildversionstring:-} =~ [0-9]+\.[0-9]+\.[0-9]+ ]]; then + echo "Environment variable jamulus_buildversionstring has to be set to a valid version string" + exit 1 +fi + +setup_ubuntu_dependencies() { + export DEBIAN_FRONTEND="noninteractive" + + sudo apt-get -qq update + sudo apt-get -qq --no-install-recommends -y install build-essential zip unzip bzip2 p7zip-full curl chrpath openjdk-8-jdk-headless +} + +setup_android_sdk() { + mkdir -p "${ANDROID_BASEDIR}" + + if [[ -d "${COMMANDLINETOOLS_DIR}" ]]; then + echo "Using commandlinetools installation from previous run (actions/cache)" + else + mkdir -p "${COMMANDLINETOOLS_DIR}" + curl -s -o downloadfile "https://dl.google.com/android/repository/commandlinetools-linux-${COMMANDLINETOOLS_VERSION}_latest.zip" + unzip -q downloadfile + mv cmdline-tools/* "${COMMANDLINETOOLS_DIR}" + fi + + yes | "${ANDROID_SDKMANAGER}" --licenses + "${ANDROID_SDKMANAGER}" --update + "${ANDROID_SDKMANAGER}" "platforms;${ANDROID_PLATFORM}" + "${ANDROID_SDKMANAGER}" "build-tools;${ANDROID_BUILD_TOOLS}" +} + +setup_android_ndk() { + mkdir -p "${ANDROID_BASEDIR}" + if [[ -d "${ANDROID_NDK_ROOT}" ]]; then + echo "Using NDK installation from previous run (actions/cache)" + else + curl -s -o downloadfile "https://dl.google.com/android/repository/android-ndk-${ANDROID_NDK_VERSION}-linux-x86_64.zip" + unzip -q downloadfile + mv "android-ndk-${ANDROID_NDK_VERSION}" "${ANDROID_NDK_ROOT}" + fi +} + +setup_qt() { + if [[ -d "${QT_BASEDIR}" ]]; then + echo "Using Qt installation from previous run (actions/cache)" + else + echo "Installing Qt..." + python3 -m pip install "aqtinstall==${AQTINSTALL_VERSION}" + python3 -m aqt install-qt --outputdir "${QT_BASEDIR}" linux android "${QT_VERSION}" \ + --archives qtbase qttools qttranslations qtandroidextras + fi +} + +build_app_as_apk() { + QT_DIR="${QT_BASEDIR}/${QT_VERSION}/android" + MAKE="${ANDROID_NDK_ROOT}/prebuilt/${ANDROID_NDK_HOST}/bin/make" + + "${QT_DIR}/bin/qmake" -spec android-clang + "${MAKE}" -j "$(nproc)" + "${MAKE}" INSTALL_ROOT="${BUILD_DIR}" -f Makefile install + "${QT_DIR}"/bin/androiddeployqt --input android-Jamulus-deployment-settings.json --output "${BUILD_DIR}" \ + --android-platform "${ANDROID_PLATFORM}" --jdk "${JAVA_HOME}" --gradle +} + +pass_artifact_to_job() { + mkdir deploy + artifact_deploy_filename="jamulus_${jamulus_buildversionstring}_android.apk" + echo "Moving ${BUILD_DIR}/build/outputs/apk/debug/build-debug.apk to deploy/${artifact_deploy_filename}" + mv "./${BUILD_DIR}/build/outputs/apk/debug/build-debug.apk" "./deploy/${artifact_deploy_filename}" + echo "::set-output name=artifact_1::${artifact_deploy_filename}" +} + +case "${1:-}" in + setup) + setup_ubuntu_dependencies + setup_android_ndk + setup_android_sdk + setup_qt + ;; + build) + build_app_as_apk + ;; + get-artifacts) + pass_artifact_to_job + ;; + *) + echo "Unknown stage '${1:-}'" + exit 1 +esac diff --git a/.github/workflows/autobuild.yml b/.github/workflows/autobuild.yml index ebac4d1e9e..d783578bfc 100644 --- a/.github/workflows/autobuild.yml +++ b/.github/workflows/autobuild.yml @@ -87,9 +87,9 @@ jobs: - config_name: Android .apk (artifact+codeQL) target_os: android building_on_os: ubuntu-20.04 - cmd1_prebuild: "./autobuild/android/autobuild_apk_1_prepare.sh" - cmd2_build: "./autobuild/android/autobuild_apk_2_build.sh" - cmd3_postbuild: "./autobuild/android/autobuild_apk_3_copy_files.sh" + cmd1_prebuild: "./.github/autobuild/android.sh setup" + cmd2_build: "./.github/autobuild/android.sh build" + cmd3_postbuild: "./.github/autobuild/android.sh get-artifacts" run_codeql: true # Jamulus.pro needs to count git history length for android versioning: checkout_fetch_depth: '0' @@ -196,7 +196,7 @@ jobs: /opt/Qt /opt/android/android-sdk /opt/android/android-ndk - key: ${{ matrix.config.target_os }}-${{ hashFiles('.github/workflows/autobuild.yml', 'autobuild/android/autobuild_apk_1_prepare.sh', 'autobuild/android/install-qt.sh') }}-${{ matrix.config.cmd1_prebuild }} + key: ${{ matrix.config.target_os }}-${{ hashFiles('.github/workflows/autobuild.yml', '.github/autobuild/android.sh') }}-${{ matrix.config.cmd1_prebuild }} - name: Set up build dependencies for ${{ matrix.config.config_name }} if: matrix.config.cmd1_prebuild diff --git a/autobuild/android/autobuild_apk_1_prepare.sh b/autobuild/android/autobuild_apk_1_prepare.sh deleted file mode 100755 index d90e2d6295..0000000000 --- a/autobuild/android/autobuild_apk_1_prepare.sh +++ /dev/null @@ -1,90 +0,0 @@ -#!/bin/bash -e - -# autobuild_1_prepare: set up environment, install Qt & dependencies - - -################### -### PROCEDURE ### -################### - -COMMANDLINETOOLS_VERSION=6858069 -ANDROID_NDK_VERSION=r21d -AQTINSTALL_VERSION=2.0.6 - -export DEBIAN_FRONTEND="noninteractive" -echo "::set-env name=DEBIAN_FRONTEND::${DEBIAN_FRONTEND}" - -sudo apt-get -qq update -# Dependencies to create Android pkg -sudo apt-get -qq --no-install-recommends -y install build-essential zip unzip bzip2 p7zip-full wget curl chrpath libxkbcommon-x11-0 \ - openjdk-8-jre-headless openjdk-8-jdk-headless - -# Add Android tools and platform tools to PATH -export ANDROID_HOME="/opt/android/android-sdk" -export ANDROID_SDK_ROOT="${ANDROID_HOME}" -export ANDROID_NDK_ROOT="/opt/android/android-ndk" -COMMANDLINETOOLS_DIR="${ANDROID_SDK_ROOT}"/cmdline-tools/latest/ - -export PATH="${PATH}:${ANDROID_HOME}/tools" -export PATH="${PATH}:${ANDROID_HOME}/platform-tools" -export JAVA_HOME="/usr/lib/jvm/java-8-openjdk-amd64/" - -# other variables -export MY_QT_VERSION="5.15.2" -export ANDROID_NDK_HOST="linux-x86_64" -export ANDROID_SDKMANAGER="${COMMANDLINETOOLS_DIR}/bin/sdkmanager" - -# paths for Android SDK -mkdir -p "${ANDROID_SDK_ROOT}"/build-tools/latest/ - -# Install Android sdk -if [[ -d "${COMMANDLINETOOLS_DIR}" ]]; then - echo "Using commandlinetools installation from previous run (actions/cache)" -else - mkdir -p "${COMMANDLINETOOLS_DIR}" - wget -q -O downloadfile https://dl.google.com/android/repository/commandlinetools-linux-${COMMANDLINETOOLS_VERSION}_latest.zip - unzip -q downloadfile - mv cmdline-tools/* "${COMMANDLINETOOLS_DIR}" -fi - -# Install Android ndk -if [[ -d "${ANDROID_NDK_ROOT}" ]]; then - echo "Using NDK installation from previous run (actions/cache)" -else - wget -q -O downloadfile https://dl.google.com/android/repository/android-ndk-${ANDROID_NDK_VERSION}-linux-x86_64.zip - unzip -q downloadfile - mv android-ndk-${ANDROID_NDK_VERSION} "${ANDROID_NDK_ROOT}" -fi - -# Install Android SDK -yes | "${ANDROID_SDKMANAGER}" --licenses -"${ANDROID_SDKMANAGER}" --update -"${ANDROID_SDKMANAGER}" "platforms;android-30" -"${ANDROID_SDKMANAGER}" "build-tools;30.0.2" - - -# Download / install Qt -QT_BASEDIR="/opt/Qt" -if [[ -d "${QT_BASEDIR}" ]]; then - echo "Using Qt installation from previous run (actions/cache)" -else - echo "Install dependencies..." - python3 -m pip install "aqtinstall==${AQTINSTALL_VERSION}" - python3 -m aqt install-qt --outputdir "${QT_BASEDIR}" linux android "${MY_QT_VERSION}" --archives qtbase qttools qttranslations qtandroidextras -fi - -# Set the QTDIR environment variable -export QTDIR="${QT_BASEDIR}/${MY_QT_VERSION}/android" - -#necessary -echo "::set-env name=QTDIR::${QTDIR}" -echo "::set-env name=ANDROID_NDK_ROOT::${ANDROID_NDK_ROOT}" -echo "::set-env name=ANDROID_NDK_HOST::${ANDROID_NDK_HOST}" -echo "::set-env name=JAVA_HOME::${JAVA_HOME}" - -#nice to have -echo "::set-env name=ANDROID_HOME::${ANDROID_HOME}" -echo "::set-env name=ANDROID_SDK_ROOT::${ANDROID_SDK_ROOT}" -echo "::set-env name=PATH::${PATH}" -echo "::set-env name=MY_QT_VERSION::${MY_QT_VERSION}" -echo "::set-env name=ANDROID_SDKMANAGER::${ANDROID_SDKMANAGER}" diff --git a/autobuild/android/autobuild_apk_2_build.sh b/autobuild/android/autobuild_apk_2_build.sh deleted file mode 100755 index 556348665d..0000000000 --- a/autobuild/android/autobuild_apk_2_build.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/bash -e - -# autobuild_2_build: actual build process - - -#################### -### PARAMETERS ### -#################### - -source $(dirname $(readlink -f "${BASH_SOURCE[0]}"))/../ensure_THIS_JAMULUS_PROJECT_PATH.sh - -################### -### PROCEDURE ### -################### - -cd "${THIS_JAMULUS_PROJECT_PATH}" - -"${QTDIR}"/bin/qmake -spec android-clang CONFIG+=release -echo . -echo . -echo . -echo . -/opt/android/android-ndk/prebuilt/linux-x86_64/bin/make -j "$(nproc)" -echo . -echo . -echo . -echo . -"${ANDROID_NDK_ROOT}"/prebuilt/"${ANDROID_NDK_HOST}"/bin/make INSTALL_ROOT=android-build -f Makefile install -echo . -echo . -echo . -echo . -"${QTDIR}"/bin/androiddeployqt --input $(ls *.json) --output android-build --android-platform android-30 --jdk "${JAVA_HOME}" --gradle diff --git a/autobuild/android/autobuild_apk_3_copy_files.sh b/autobuild/android/autobuild_apk_3_copy_files.sh deleted file mode 100755 index 43539dd4ea..0000000000 --- a/autobuild/android/autobuild_apk_3_copy_files.sh +++ /dev/null @@ -1,43 +0,0 @@ -#!/bin/bash - -# autobuild_3_copy_files: copy the built files to deploy folder - - -#################### -### PARAMETERS ### -#################### - -source $(dirname $(readlink -f "${BASH_SOURCE[0]}"))/../ensure_THIS_JAMULUS_PROJECT_PATH.sh - -################### -### PROCEDURE ### -################### - -mkdir "${THIS_JAMULUS_PROJECT_PATH}"/deploy - -echo "" -echo "" -echo "ls GITROOT/android-build/build/outputs/apk/debug/" -ls "${THIS_JAMULUS_PROJECT_PATH}"/android-build/build/outputs/apk/debug/ -echo "" - - -artifact_deploy_filename=jamulus_${jamulus_buildversionstring}_android.apk -echo "" -echo "" -echo "move to ${artifact_deploy_filename}" -mv "${THIS_JAMULUS_PROJECT_PATH}"/android-build/build/outputs/apk/debug/android-build-debug.apk "${THIS_JAMULUS_PROJECT_PATH}"/deploy/"${artifact_deploy_filename}" - -echo "" -echo "" -echo "ls GITROOT/deploy/" -ls "${THIS_JAMULUS_PROJECT_PATH}"/deploy/ -echo "" - -github_output_value() -{ - echo "github_output_value() ${1} = ${2}" - echo "::set-output name=${1}::${2}" -} - -github_output_value artifact_1 ${artifact_deploy_filename} diff --git a/autobuild/ensure_THIS_JAMULUS_PROJECT_PATH.sh b/autobuild/ensure_THIS_JAMULUS_PROJECT_PATH.sh deleted file mode 100755 index a1366340de..0000000000 --- a/autobuild/ensure_THIS_JAMULUS_PROJECT_PATH.sh +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/bash - -echo "ensuring env-variable THIS_JAMULUS_PROJECT_PATH" - -#################### -### PARAMETERS ### -#################### - -if [ ! -z "${1}" ]; then - echo "THIS_JAMULUS_PROJECT_PATH from parameter" - THIS_JAMULUS_PROJECT_PATH="${1}" -elif [ ! -z "${jamulus_project_path}" ]; then - echo "THIS_JAMULUS_PROJECT_PATH from env-variable jamulus_project_path" - THIS_JAMULUS_PROJECT_PATH="${jamulus_project_path}" -elif [ ! -z "${GITHUB_WORKSPACE}" ]; then - echo "THIS_JAMULUS_PROJECT_PATH from env-variable GITHUB_WORKSPACE" - THIS_JAMULUS_PROJECT_PATH="${GITHUB_WORKSPACE}" -else - echo "Please give the path to the repository root as environment variable 'jamulus_project_path' or parameter to this script!" - exit 1 -fi - -if [ -d "$THIS_JAMULUS_PROJECT_PATH" ]; then - echo "THIS_JAMULUS_PROJECT_PATH exists (relative): ${THIS_JAMULUS_PROJECT_PATH}" - ## THIS_JAMULUS_PROJECT_PATH=$(readlink -e "${THIS_JAMULUS_PROJECT_PATH}") # works for linux, but not mac - THIS_JAMULUS_PROJECT_PATH=$(python -c "import os; print(os.path.abspath(\"${THIS_JAMULUS_PROJECT_PATH}\"));") - #python -c "import os; print(os.path.abspath(\"${THIS_JAMULUS_PROJECT_PATH}\"));" - echo "THIS_JAMULUS_PROJECT_PATH exists (absolute): ${THIS_JAMULUS_PROJECT_PATH}" -else - echo "ERROR: THIS_JAMULUS_PROJECT_PATH must reference an existing directory: \"${THIS_JAMULUS_PROJECT_PATH}\"" - exit 1 -fi