diff options
author | Henning Gruendl <henning.gruendl@qt.io> | 2021-12-01 11:10:58 +0100 |
---|---|---|
committer | Henning Gründl <henning.gruendl@qt.io> | 2021-12-01 11:12:23 +0000 |
commit | b8634bfb213c0d87cb94e7fbb9c64b16b91233a6 (patch) | |
tree | 822c40969e8865f42c559f76dc1691c67ff5d3d4 | |
parent | 2a83f190d44931ade66534013080c5eedaff2131 (diff) |
Add github workflow building apks on dev branch
Change-Id: I431e4f3316e6fc2468eb42d2b14e53528ba2a040
Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
-rw-r--r-- | .github/workflows/build-apks.yml | 268 |
1 files changed, 268 insertions, 0 deletions
diff --git a/.github/workflows/build-apks.yml b/.github/workflows/build-apks.yml new file mode 100644 index 0000000..ae2d8ba --- /dev/null +++ b/.github/workflows/build-apks.yml @@ -0,0 +1,268 @@ +name: Build Android Packages +on: + push: + branches: + - dev + +env: + QT_VERSION: 6.2.1 + APP_PRO: qtdesignviewer.pro + APP_DIR: qtdesignviewer + APP_NAME: qtdesignviewer + +jobs: + build: + name: Ubuntu Latest + runs-on: ubuntu-latest + strategy: + matrix: + abi: + - { arch: "x86_64", suffix: "X86_64", name: "x86_64" } + - { arch: "x86", suffix: "X86", name: "x86" } + - { arch: "armv7", suffix: "ARMv7", name: "armeabi-v7a" } + - { arch: "arm64_v8a", suffix: "ARM64", name: "arm64-v8a" } + + steps: + - uses: actions/checkout@v2 + with: + ref: dev + path: ${{ env.APP_DIR }} + + - name: Download Qt + id: qt + shell: cmake -P {0} + run: | + set(qt_version "$ENV{QT_VERSION}") + string(REPLACE "." "" qt_version_dotless "${qt_version}") + + set(qt_package_arch_suffix "gcc_64") + set(qt_package_suffix_desktop "-Linux-RHEL_8_2-GCC-Linux-RHEL_8_2-X86_64") + + set(abi ${{ matrix.abi.arch }}) + set(qt_package_suffix_android "-Linux-RHEL_8_2-Clang-Android-Android_ANY-${{ matrix.abi.suffix }}") + + set(qt_base_url "https://download.qt.io/online/qtsdkrepository/linux_x64") + + # Prepare directories + set(working_dir $ENV{GITHUB_WORKSPACE}/Qt) + file(MAKE_DIRECTORY ${working_dir}) + + function(downloadAndExtract url download_dir archive) + message("Downloading ${url}") + file(DOWNLOAD "${url}" ./${download_dir}/${archive} SHOW_PROGRESS) + execute_process(COMMAND ${CMAKE_COMMAND} -E tar xvf ../${download_dir}/${archive} WORKING_DIRECTORY ${working_dir}) + endfunction() + + # Download Desktop Qt + set(qt_base_url_desktop "${qt_base_url}/desktop/qt6_${qt_version_dotless}") + message("Downloading ${qt_base_url_desktop}/Updates.xml") + + file(DOWNLOAD "${qt_base_url_desktop}/Updates.xml" ./Updates.xml SHOW_PROGRESS) + file(READ ./Updates.xml updates_xml) + string(REGEX MATCH "<Name>qt.qt6.*<Version>([0-9+-.]+)</Version>" updates_xml_output "${updates_xml}") + set(qt_package_version ${CMAKE_MATCH_1}) + + set(download_dir $ENV{GITHUB_WORKSPACE}/qt6-download-desktop-${qt_package_version}) + file(MAKE_DIRECTORY ${download_dir}) + + file(RENAME ./Updates.xml ${download_dir}/Updates.xml) + + # Needs qtdeclarative for qmlimportscanner + foreach(package qtbase qtdeclarative) + downloadAndExtract( + "${qt_base_url_desktop}/qt.qt6.${qt_version_dotless}.${qt_package_arch_suffix}/${qt_package_version}${package}${qt_package_suffix_desktop}.7z" + ${download_dir} + ${package}.7z + ) + endforeach() + + # uic depends on libicu56.so + if (NOT WIN32 AND NOT APPLE) + downloadAndExtract( + "${qt_base_url_desktop}/qt.qt6.${qt_version_dotless}.${qt_package_arch_suffix}/${qt_package_version}icu-linux-Rhel7.2-x64.7z" + ${download_dir} + icu.7z + ) + endif() + + set(qt_dir_desktop ${working_dir}/${qt_version}/gcc_64) + + file(READ "${qt_dir_desktop}/mkspecs/qconfig.pri" qtconfig) + string(REPLACE "Enterprise" "OpenSource" qtconfig "${qtconfig}") + string(REPLACE "licheck.exe" "" qtconfig "${qtconfig}") + string(REPLACE "licheck64" "" qtconfig "${qtconfig}") + string(REPLACE "licheck_mac" "" qtconfig "${qtconfig}") + file(WRITE "${qt_dir_desktop}/mkspecs/qconfig.pri" "${qtconfig}") + + # Save the path for other steps + message("::set-output name=qt_dir_desktop::${qt_dir_desktop}") + + # Download Android Qt + set(qt_base_url_android "${qt_base_url}/android/qt6_${qt_version_dotless}_${abi}") + message("Downloading ${qt_base_url_android}/Updates.xml") + + file(DOWNLOAD "${qt_base_url_android}/Updates.xml" ./Updates.xml SHOW_PROGRESS) + file(READ ./Updates.xml updates_xml) + string(REGEX MATCH "<Name>qt.qt6.*<Version>([0-9+-.]+)</Version>" updates_xml_output "${updates_xml}") + set(qt_package_version ${CMAKE_MATCH_1}) + + set(download_dir $ENV{GITHUB_WORKSPACE}/qt6-download-android-${qt_package_version}) + file(MAKE_DIRECTORY ${download_dir}) + + file(RENAME ./Updates.xml ${download_dir}/Updates.xml) + + foreach(package qttranslations qttools qtsvg qtdeclarative qtbase) + downloadAndExtract( + "${qt_base_url_android}/qt.qt6.${qt_version_dotless}.android_${abi}/${qt_package_version}${package}${qt_package_suffix_android}.7z" + ${download_dir} + ${package}.7z + ) + endforeach() + + foreach(package qtwebview qtwebsockets qtwebchannel qtvirtualkeyboard qtsensors qtscxml qtmultimedia qtimageformats qtdatavis3d qtconnectivity qtcharts qt3d) + downloadAndExtract( + "${qt_base_url_android}/qt.qt6.${qt_version_dotless}.addons.${package}.android_${abi}/${qt_package_version}${package}${qt_package_suffix_android}.7z" + ${download_dir} + ${package}.7z + ) + endforeach() + + # Special case for qtpositioning as the package is called qtlocation + set(url "${qt_base_url_android}/qt.qt6.${qt_version_dotless}.addons.qtpositioning.android_${abi}/${qt_package_version}qtlocation${qt_package_suffix_android}.7z") + message("Downloading ${url}") + file(DOWNLOAD "${url}" ./${download_dir}/qtpositioning.7z SHOW_PROGRESS) + execute_process(COMMAND ${CMAKE_COMMAND} -E tar xvf ../${download_dir}/qtpositioning.7z WORKING_DIRECTORY ${working_dir}) + + foreach(package qtshadertools qtquicktimeline qtquick3d qt5compat) + downloadAndExtract( + "${qt_base_url_android}/qt.qt6.${qt_version_dotless}.${package}.android_${abi}/${qt_package_version}${package}${qt_package_suffix_android}.7z" + ${download_dir} + ${package}.7z + ) + endforeach() + + set(qt_dir_android ${working_dir}/${qt_version}/android_${abi}) + + # Save the path for other steps + message("::set-output name=qt_dir_android::${qt_dir_android}") + + # Modify target_qt.conf + set(conf_content "\ + [Paths] + Prefix=../ + HostPrefix=../../${qt_package_arch_suffix} + HostData=../android_${abi} + Sysroot= + SysrootifyPrefix=false + TargetSpec=android-clang + HostSpec=linux-g++ + ") + + file(WRITE ${qt_dir_android}/bin/target_qt.conf ${conf_content}) + + - name: Checkout qtquickdesigner-components + uses: actions/checkout@v2 + with: + repository: qt-labs/qtquickdesigner-components + ref: dev + path: qtquickdesigner-components + + - name: Configure, build and install qtquickdesigner-components + run: | + cd qtquickdesigner-components + ${{ steps.qt.outputs.qt_dir_desktop }}/bin/qmake -qtconf ${{ steps.qt.outputs.qt_dir_android }}/bin/target_qt.conf && make && make install + + - name: Configure + shell: cmake -P {0} + run: | + execute_process( + COMMAND ${{ steps.qt.outputs.qt_dir_desktop }}/bin/qmake + -qtconf ${{ steps.qt.outputs.qt_dir_android }}/bin/target_qt.conf + $ENV{APP_PRO} + -spec android-clang + CONFIG+=debug + CONFIG+=qml_debug + WORKING_DIRECTORY $ENV{APP_DIR} + RESULT_VARIABLE result + ) + if (NOT result EQUAL 0) + message(FATAL_ERROR "Bad exit status") + endif() + + # https://github.com/actions/virtual-environments/issues/3757 + - name: Fix Android Build Tools + run: | + ln -s ${ANDROID_HOME}/build-tools/31.0.0/d8 ${ANDROID_HOME}/build-tools/31.0.0/dx + ln -s ${ANDROID_HOME}/build-tools/31.0.0/lib/d8.jar ${ANDROID_HOME}/build-tools/31.0.0/lib/dx.jar + + - name: Build + id: build + shell: cmake -P {0} + run: | + include(ProcessorCount) + ProcessorCount(N) + + execute_process( + COMMAND $ENV{ANDROID_NDK_HOME}/prebuilt/linux-x86_64/bin/make + -f Makefile + qmake_all + WORKING_DIRECTORY $ENV{APP_DIR} + RESULT_VARIABLE result + ) + if (NOT result EQUAL 0) + message(FATAL_ERROR "Bad exit status") + endif() + + execute_process( + COMMAND $ENV{ANDROID_NDK_HOME}/prebuilt/linux-x86_64/bin/make + -j ${N} + WORKING_DIRECTORY $ENV{APP_DIR} + RESULT_VARIABLE result + ) + if (NOT result EQUAL 0) + message(FATAL_ERROR "Bad exit status") + endif() + + execute_process( + COMMAND $ENV{ANDROID_NDK_HOME}/prebuilt/linux-x86_64/bin/make + INSTALL_ROOT=android-build install + WORKING_DIRECTORY $ENV{APP_DIR} + RESULT_VARIABLE result + ) + if (NOT result EQUAL 0) + message(FATAL_ERROR "Bad exit status") + endif() + + execute_process( + COMMAND ${{ steps.qt.outputs.qt_dir_desktop }}/bin/androiddeployqt + --input android-qtdesignviewer-deployment-settings.json + --output android-build + --android-platform android-31 + --jdk $ENV{JAVA_HOME_11_X64} + --gradle + WORKING_DIRECTORY $ENV{APP_DIR} + RESULT_VARIABLE result + ) + if (NOT result EQUAL 0) + message(FATAL_ERROR "Bad exit status") + endif() + + # Rename APK + set(apk_dir $ENV{APP_DIR}/android-build/build/outputs/apk/debug) + set(apk_path ${apk_dir}/$ENV{APP_NAME}_${{ matrix.abi.name }}.apk) + + file( + RENAME ${apk_dir}/android-build-debug.apk ${apk_path} + RESULT result + ) + if (NOT result EQUAL 0) + message(FATAL_ERROR "Bad exit status") + endif() + + message("::set-output name=apk_path::${apk_path}") + + - uses: actions/upload-artifact@v2 + with: + name: ${{ env.APP_NAME }}_${{ matrix.abi.name }} + path: ${{ steps.build.outputs.apk_path }} + |