name: 'Deploy workflow' on: push: branches: - '**' env: QT_MIRROR: https://mirrors.ocf.berkeley.edu/qt/ # https://download.qt.io/static/mirrorlist/ jobs: Build-Linux-Ubuntu: runs-on: android-runner env: QT_VERSION: 6.10.1 QIF_VERSION: 4.7 PROD_AGW_PUBLIC_KEY: ${{ secrets.PROD_AGW_PUBLIC_KEY }} PROD_S3_ENDPOINT: ${{ secrets.PROD_S3_ENDPOINT }} FALLBACK_S3_ENDPOINT: ${{ secrets.FALLBACK_S3_ENDPOINT }} DEV_AGW_PUBLIC_KEY: ${{ secrets.DEV_AGW_PUBLIC_KEY }} DEV_AGW_ENDPOINT: ${{ secrets.DEV_AGW_ENDPOINT }} DEV_S3_ENDPOINT: ${{ secrets.DEV_S3_ENDPOINT }} FREE_V2_ENDPOINT: ${{ secrets.FREE_V2_ENDPOINT }} PREM_V1_ENDPOINT: ${{ secrets.PREM_V1_ENDPOINT }} steps: - name: 'Install Qt' uses: jurplel/install-qt-action@v3 with: version: ${{ env.QT_VERSION }} host: 'linux' target: 'desktop' arch: 'linux_gcc_64' modules: 'qtremoteobjects qt5compat qtshadertools' dir: ${{ runner.temp }} setup-python: 'true' tools: 'tools_ifw' set-env: 'true' aqtversion: '==3.3.0' py7zrversion: '==0.22.*' extra: '--base ${{ env.QT_MIRROR }}' - name: 'Get sources' uses: actions/checkout@v4 with: submodules: 'true' fetch-depth: 10 - name: 'Get version from CMakeLists.txt' id: get_version run: | VERSION=$(grep 'set(AMNEZIAVPN_VERSION' CMakeLists.txt | sed -E 's/.*AMNEZIAVPN_VERSION ([0-9]+.[0-9]+.[0-9]+.[0-9]+)\)/\1/') echo "VERSION=$VERSION" >> $GITHUB_ENV echo "Version: $VERSION" # - name: 'Setup ccache' # uses: hendrikmuhs/ccache-action@v1.2 - name: 'Build project' run: | sudo apt-get install libxkbcommon-x11-0 libsecret-1-dev export QT_BIN_DIR=${{ runner.temp }}/Qt/${{ env.QT_VERSION }}/gcc_64/bin export QIF_BIN_DIR=${{ runner.temp }}/Qt/Tools/QtInstallerFramework/${{ env.QIF_VERSION }}/bin bash deploy/build_linux.sh - name: 'Pack installer' run: cd deploy && tar -cf AmneziaVPN_Linux_Installer.tar AmneziaVPN_Linux_Installer.bin && zip AmneziaVPN_${VERSION}_linux_x64.tar.zip AmneziaVPN_Linux_Installer.tar - name: 'Upload installer artifact' uses: actions/upload-artifact@v4 with: name: AmneziaVPN_${{ env.VERSION }}_linux_x64.tar.zip path: deploy/AmneziaVPN_${{ env.VERSION }}_linux_x64.tar.zip retention-days: 7 - name: 'Upload unpacked artifact' uses: actions/upload-artifact@v4 with: name: AmneziaVPN_Linux_unpacked path: deploy/AppDir retention-days: 7 - name: 'Upload translations artifact' uses: actions/upload-artifact@v4 with: name: AmneziaVPN_translations path: client/translations retention-days: 7 # ------------------------------------------------------ Build-Windows: runs-on: windows-latest env: QT_VERSION: 6.10.1 QIF_VERSION: 4.7 BUILD_ARCH: 64 PROD_AGW_PUBLIC_KEY: ${{ secrets.PROD_AGW_PUBLIC_KEY }} PROD_S3_ENDPOINT: ${{ secrets.PROD_S3_ENDPOINT }} FALLBACK_S3_ENDPOINT: ${{ secrets.FALLBACK_S3_ENDPOINT }} DEV_AGW_PUBLIC_KEY: ${{ secrets.DEV_AGW_PUBLIC_KEY }} DEV_AGW_ENDPOINT: ${{ secrets.DEV_AGW_ENDPOINT }} DEV_S3_ENDPOINT: ${{ secrets.DEV_S3_ENDPOINT }} FREE_V2_ENDPOINT: ${{ secrets.FREE_V2_ENDPOINT }} PREM_V1_ENDPOINT: ${{ secrets.PREM_V1_ENDPOINT }} steps: - name: 'Get sources' uses: actions/checkout@v4 with: submodules: 'true' fetch-depth: 10 - name: 'Get version from CMakeLists.txt' id: get_version shell: bash run: | VERSION=$(grep 'set(AMNEZIAVPN_VERSION' CMakeLists.txt | sed -E 's/.*AMNEZIAVPN_VERSION ([0-9]+.[0-9]+.[0-9]+.[0-9]+)\)/\1/') echo "VERSION=$VERSION" >> $GITHUB_ENV echo "Version: $VERSION" # - name: 'Setup ccache' # uses: hendrikmuhs/ccache-action@v1.2 - name: 'Install Qt' uses: jurplel/install-qt-action@v3 with: version: ${{ env.QT_VERSION }} host: 'windows' target: 'desktop' arch: 'win64_msvc2022_64' modules: 'qtremoteobjects qt5compat qtshadertools' dir: ${{ runner.temp }} setup-python: 'true' tools: 'tools_ifw' set-env: 'true' aqtversion: '==3.3.0' py7zrversion: '==0.22.*' extra: '--base ${{ env.QT_MIRROR }}' - name: 'Setup mvsc' uses: ilammy/msvc-dev-cmd@v1 with: arch: 'x64' - name: 'Setup .NET SDK' uses: actions/setup-dotnet@v4 with: dotnet-version: '8.0.x' - name: 'Install WiX Toolset' shell: powershell run: | dotnet tool install --global wix --version 4.0.6 wix extension add -g WixToolset.UI.wixext/4.0.6 wix extension add -g WixToolset.Util.wixext/4.0.6 wix extension list -g $wixBinDir = Join-Path $env:USERPROFILE ".dotnet\tools" echo "WIX_BIN_DIR=$wixBinDir" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append - name: 'Build project' shell: cmd run: | set BUILD_ARCH=${{ env.BUILD_ARCH }} set QT_BIN_DIR="${{ runner.temp }}\\Qt\\${{ env.QT_VERSION }}\\msvc2022_64\\bin" set QIF_BIN_DIR="${{ runner.temp }}\\Qt\\Tools\\QtInstallerFramework\\${{ env.QIF_VERSION }}\\bin" set WIX_BIN_DIR=%USERPROFILE%\.dotnet\tools call deploy\\build_windows.bat - name: 'Rename Windows installer' shell: cmd run: | copy AmneziaVPN_x${{ env.BUILD_ARCH }}.exe AmneziaVPN_%VERSION%_x64.exe - name: 'Upload installer artifact' uses: actions/upload-artifact@v4 with: name: AmneziaVPN_${{ env.VERSION }}_x64.exe path: AmneziaVPN_${{ env.VERSION }}_x64.exe retention-days: 7 - name: 'Upload MSI installer artifact' uses: actions/upload-artifact@v4 with: name: AmneziaVPN_Windows_MSI_installer path: AmneziaVPN_x${{ env.BUILD_ARCH }}.msi retention-days: 7 - name: 'Upload unpacked artifact' uses: actions/upload-artifact@v4 with: name: AmneziaVPN_Windows_unpacked path: deploy\\build_${{ env.BUILD_ARCH }}\\client\\Release retention-days: 7 # ------------------------------------------------------ Build-iOS: runs-on: macos-latest env: QT_VERSION: 6.10.1 CC: cc CXX: c++ PROD_AGW_PUBLIC_KEY: ${{ secrets.PROD_AGW_PUBLIC_KEY }} PROD_S3_ENDPOINT: ${{ secrets.PROD_S3_ENDPOINT }} FALLBACK_S3_ENDPOINT: ${{ secrets.FALLBACK_S3_ENDPOINT }} DEV_AGW_PUBLIC_KEY: ${{ secrets.DEV_AGW_PUBLIC_KEY }} DEV_AGW_ENDPOINT: ${{ secrets.DEV_AGW_ENDPOINT }} DEV_S3_ENDPOINT: ${{ secrets.DEV_S3_ENDPOINT }} FREE_V2_ENDPOINT: ${{ secrets.FREE_V2_ENDPOINT }} PREM_V1_ENDPOINT: ${{ secrets.PREM_V1_ENDPOINT }} steps: - name: 'Setup xcode' uses: maxim-lobanov/setup-xcode@v1 with: xcode-version: '26.1' - name: 'Install desktop Qt' uses: jurplel/install-qt-action@v3 with: version: ${{ env.QT_VERSION }} host: 'mac' target: 'desktop' modules: 'qtremoteobjects qt5compat qtshadertools qtmultimedia' arch: 'clang_64' dir: ${{ runner.temp }} set-env: 'true' extra: '--base ${{ env.QT_MIRROR }}' - name: 'Install iOS Qt' uses: jurplel/install-qt-action@v3 with: version: ${{ env.QT_VERSION }} host: 'mac' target: 'ios' modules: 'qtremoteobjects qt5compat qtshadertools qtmultimedia' dir: ${{ runner.temp }} setup-python: 'true' set-env: 'true' extra: '--external 7z --base ${{ env.QT_MIRROR }}' - name: 'Install go' uses: actions/setup-go@v5 with: go-version: '1.24' cache: false - name: 'Setup gomobile' run: | export PATH=$PATH:~/go/bin go install golang.org/x/mobile/cmd/gomobile@latest gomobile init - name: 'Get sources' uses: actions/checkout@v4 with: submodules: 'true' fetch-depth: 10 # - name: 'Setup ccache' # uses: hendrikmuhs/ccache-action@v1.2 - name: 'Install dependencies' run: pip install jsonschema jinja2 - name: 'Build project' run: | git submodule update --init --recursive export QT_BIN_DIR="${{ runner.temp }}/Qt/${{ env.QT_VERSION }}/ios/bin" export QT_MACOS_ROOT_DIR="${{ runner.temp }}/Qt/${{ env.QT_VERSION }}/macos" export PATH=$PATH:~/go/bin sh deploy/build_ios.sh | \ sed -e '/-Xcc -DPROD_AGW_PUBLIC_KEY/,/-Xcc/ { /-Xcc/!d; }' -e '/-Xcc -DPROD_AGW_PUBLIC_KEY/d' | \ sed -e '/-Xcc -DDEV_AGW_PUBLIC_KEY/,/-Xcc/ { /-Xcc/!d; }' -e '/-Xcc -DDEV_AGW_PUBLIC_KEY/d' | \ sed -e '/-DPROD_AGW_PUBLIC_KEY/,/-D/ { /-D/!d; }' -e '/-DPROD_AGW_PUBLIC_KEY/d' | \ sed -e '/-DDEV_AGW_PUBLIC_KEY/,/-D/ { /-D/!d; }' -e '/-DDEV_AGW_PUBLIC_KEY/d' env: IOS_TRUST_CERT_BASE64: ${{ secrets.IOS_TRUST_CERT_BASE64 }} IOS_SIGNING_CERT_BASE64: ${{ secrets.IOS_SIGNING_CERT_BASE64 }} IOS_SIGNING_CERT_PASSWORD: ${{ secrets.IOS_SIGNING_CERT_PASSWORD }} APPSTORE_CONNECT_KEY_ID: ${{ secrets.APPSTORE_CONNECT_KEY_ID }} APPSTORE_CONNECT_ISSUER_ID: ${{ secrets.APPSTORE_CONNECT_ISSUER_ID }} APPSTORE_CONNECT_PRIVATE_KEY: ${{ secrets.APPSTORE_CONNECT_PRIVATE_KEY }} IOS_APP_PROVISIONING_PROFILE: ${{ secrets.IOS_APP_PROVISIONING_PROFILE }} IOS_NE_PROVISIONING_PROFILE: ${{ secrets.IOS_NE_PROVISIONING_PROFILE }} # - name: 'Upload appstore .ipa and dSYMs to artifacts' # uses: actions/upload-artifact@v4 # with: # name: app-store ipa & dsyms # path: | # ${{ github.workspace }}/AmneziaVPN-iOS.ipa # ${{ github.workspace }}/*.app.dSYM.zip # retention-days: 7 # ------------------------------------------------------ Build-MacOS-old: runs-on: macos-latest env: # Keep compat with MacOS 10.15 aka Catalina by Qt 6.4 QT_VERSION: 6.4.3 MAC_TEAM_ID: ${{ secrets.MAC_TEAM_ID }} MAC_APP_CERT_CERT: ${{ secrets.MAC_APP_CERT_CERT }} MAC_SIGNER_ID: ${{ secrets.MAC_SIGNER_ID }} MAC_APP_CERT_PW: ${{ secrets.MAC_APP_CERT_PW }} MAC_INSTALLER_SIGNER_CERT: ${{ secrets.MAC_INSTALLER_SIGNER_CERT }} MAC_INSTALLER_SIGNER_ID: ${{ secrets.MAC_INSTALLER_SIGNER_ID }} MAC_INSTALL_CERT_PW: ${{ secrets.MAC_INSTALL_CERT_PW }} APPLE_DEV_EMAIL: ${{ secrets.APPLE_DEV_EMAIL }} APPLE_DEV_PASSWORD: ${{ secrets.APPLE_DEV_PASSWORD }} PROD_AGW_PUBLIC_KEY: ${{ secrets.PROD_AGW_PUBLIC_KEY }} PROD_S3_ENDPOINT: ${{ secrets.PROD_S3_ENDPOINT }} FALLBACK_S3_ENDPOINT: ${{ secrets.FALLBACK_S3_ENDPOINT }} DEV_AGW_PUBLIC_KEY: ${{ secrets.DEV_AGW_PUBLIC_KEY }} DEV_AGW_ENDPOINT: ${{ secrets.DEV_AGW_ENDPOINT }} DEV_S3_ENDPOINT: ${{ secrets.DEV_S3_ENDPOINT }} FREE_V2_ENDPOINT: ${{ secrets.FREE_V2_ENDPOINT }} PREM_V1_ENDPOINT: ${{ secrets.PREM_V1_ENDPOINT }} steps: - name: 'Setup xcode' uses: maxim-lobanov/setup-xcode@v1 with: xcode-version: '15.4.0' - name: 'Install Qt' uses: jurplel/install-qt-action@v3 with: version: ${{ env.QT_VERSION }} host: 'mac' target: 'desktop' arch: 'clang_64' modules: 'qtremoteobjects qt5compat qtshadertools' dir: ${{ runner.temp }} setup-python: 'true' set-env: 'true' extra: '--external 7z --base ${{ env.QT_MIRROR }}' - name: 'Get sources' uses: actions/checkout@v4 with: submodules: 'true' fetch-depth: 10 # - name: 'Setup ccache' # uses: hendrikmuhs/ccache-action@v1.2 - name: 'Build project' run: | export QT_BIN_DIR="${{ runner.temp }}/Qt/${{ env.QT_VERSION }}/macos/bin" bash deploy/build_macos.sh -n - name: 'Upload installer artifact' uses: actions/upload-artifact@v4 with: name: AmneziaVPN_MacOS_old_installer path: deploy/build/pkg/AmneziaVPN.pkg retention-days: 7 - name: 'Upload unpacked artifact' uses: actions/upload-artifact@v4 with: name: AmneziaVPN_MacOS_old_unpacked path: deploy/build/client/AmneziaVPN.app retention-days: 7 # ------------------------------------------------------ Build-MacOS: runs-on: macos-latest env: QT_VERSION: 6.10.1 MAC_TEAM_ID: ${{ secrets.MAC_TEAM_ID }} MAC_APP_CERT_CERT: ${{ secrets.MAC_APP_CERT_CERT }} MAC_SIGNER_ID: ${{ secrets.MAC_SIGNER_ID }} MAC_APP_CERT_PW: ${{ secrets.MAC_APP_CERT_PW }} MAC_INSTALLER_SIGNER_CERT: ${{ secrets.MAC_INSTALLER_SIGNER_CERT }} MAC_INSTALLER_SIGNER_ID: ${{ secrets.MAC_INSTALLER_SIGNER_ID }} MAC_INSTALL_CERT_PW: ${{ secrets.MAC_INSTALL_CERT_PW }} APPLE_DEV_EMAIL: ${{ secrets.APPLE_DEV_EMAIL }} APPLE_DEV_PASSWORD: ${{ secrets.APPLE_DEV_PASSWORD }} PROD_AGW_PUBLIC_KEY: ${{ secrets.PROD_AGW_PUBLIC_KEY }} PROD_S3_ENDPOINT: ${{ secrets.PROD_S3_ENDPOINT }} FALLBACK_S3_ENDPOINT: ${{ secrets.FALLBACK_S3_ENDPOINT }} DEV_AGW_PUBLIC_KEY: ${{ secrets.DEV_AGW_PUBLIC_KEY }} DEV_AGW_ENDPOINT: ${{ secrets.DEV_AGW_ENDPOINT }} DEV_S3_ENDPOINT: ${{ secrets.DEV_S3_ENDPOINT }} FREE_V2_ENDPOINT: ${{ secrets.FREE_V2_ENDPOINT }} PREM_V1_ENDPOINT: ${{ secrets.PREM_V1_ENDPOINT }} steps: - name: 'Setup xcode' uses: maxim-lobanov/setup-xcode@v1 with: xcode-version: '16.2.0' - name: 'Install Qt' uses: jurplel/install-qt-action@v4 with: version: ${{ env.QT_VERSION }} host: 'mac' target: 'desktop' arch: 'clang_64' modules: 'qtremoteobjects qt5compat qtshadertools' dir: ${{ runner.temp }} setup-python: 'true' set-env: 'true' aqtversion: '==3.3.0' py7zrversion: '==0.22.*' extra: '--base ${{ env.QT_MIRROR }}' - name: 'Get sources' uses: actions/checkout@v4 with: submodules: 'true' fetch-depth: 10 - name: 'Get version from CMakeLists.txt' id: get_version run: | VERSION=$(grep 'set(AMNEZIAVPN_VERSION' CMakeLists.txt | sed -E 's/.*AMNEZIAVPN_VERSION ([0-9]+.[0-9]+.[0-9]+.[0-9]+)\)/\1/') echo "VERSION=$VERSION" >> $GITHUB_ENV echo "Version: $VERSION" # - name: 'Setup ccache' # uses: hendrikmuhs/ccache-action@v1.2 - name: 'Build project' run: | export QT_BIN_DIR="${{ runner.temp }}/Qt/${{ env.QT_VERSION }}/macos/bin" bash deploy/build_macos.sh -n - name: 'Pack macOS installer' run: | cd deploy/build/pkg zip -r ../../AmneziaVPN_${VERSION}_macos.zip AmneziaVPN.pkg cd ../../.. - name: 'Upload installer artifact' uses: actions/upload-artifact@v4 with: name: AmneziaVPN_${{ env.VERSION }}_macos.zip path: deploy/AmneziaVPN_${{ env.VERSION }}_macos.zip retention-days: 7 - name: 'Upload unpacked artifact' uses: actions/upload-artifact@v4 with: name: AmneziaVPN_MacOS_unpacked path: deploy/build/client/AmneziaVPN.app retention-days: 7 Build-MacOS-NE: runs-on: macos-latest env: QT_VERSION: 6.10.1 MAC_TEAM_ID: ${{ secrets.MAC_TEAM_ID }} MAC_APP_CERT_CERT: ${{ secrets.MAC_APP_CERT_CERT }} MAC_SIGNER_ID: ${{ secrets.MAC_SIGNER_ID }} MAC_APP_CERT_PW: ${{ secrets.MAC_APP_CERT_PW }} PROD_AGW_PUBLIC_KEY: ${{ secrets.PROD_AGW_PUBLIC_KEY }} PROD_S3_ENDPOINT: ${{ secrets.PROD_S3_ENDPOINT }} FALLBACK_S3_ENDPOINT: ${{ secrets.FALLBACK_S3_ENDPOINT }} DEV_AGW_PUBLIC_KEY: ${{ secrets.DEV_AGW_PUBLIC_KEY }} DEV_AGW_ENDPOINT: ${{ secrets.DEV_AGW_ENDPOINT }} DEV_S3_ENDPOINT: ${{ secrets.DEV_S3_ENDPOINT }} FREE_V2_ENDPOINT: ${{ secrets.FREE_V2_ENDPOINT }} PREM_V1_ENDPOINT: ${{ secrets.PREM_V1_ENDPOINT }} steps: - name: 'Setup xcode' uses: maxim-lobanov/setup-xcode@v1 with: xcode-version: '26.1' - name: 'Install desktop Qt' uses: jurplel/install-qt-action@v3 with: version: ${{ env.QT_VERSION }} host: 'mac' target: 'desktop' modules: 'qtremoteobjects qt5compat qtshadertools qtmultimedia' arch: 'clang_64' dir: ${{ runner.temp }} set-env: 'true' extra: '--base ${{ env.QT_MIRROR }}' - name: 'Install go' uses: actions/setup-go@v5 with: go-version: '1.24' cache: false - name: 'Setup gomobile' run: | export PATH=$PATH:~/go/bin go install golang.org/x/mobile/cmd/gomobile@latest gomobile init - name: 'Get sources' uses: actions/checkout@v4 with: submodules: 'true' fetch-depth: 10 # - name: 'Setup ccache' # uses: hendrikmuhs/ccache-action@v1.2 - name: 'Build project' run: | export QT_BIN_DIR="${{ runner.temp }}/Qt/${{ env.QT_VERSION }}/macos/bin" bash deploy/build_macos_ne.sh - name: 'Upload unpacked artifact' uses: actions/upload-artifact@v4 with: name: AmneziaVPN_MacOS_unpacked path: deploy/build/client/AmneziaVPN.app retention-days: 7 # ------------------------------------------------------ Build-Android: runs-on: android-runner env: ANDROID_BUILD_PLATFORM: android-36 QT_VERSION: 6.10.1 QT_MODULES: 'qtremoteobjects qt5compat qtimageformats qtshadertools' PROD_AGW_PUBLIC_KEY: ${{ secrets.PROD_AGW_PUBLIC_KEY }} PROD_S3_ENDPOINT: ${{ secrets.PROD_S3_ENDPOINT }} FALLBACK_S3_ENDPOINT: ${{ secrets.FALLBACK_S3_ENDPOINT }} DEV_AGW_PUBLIC_KEY: ${{ secrets.DEV_AGW_PUBLIC_KEY }} DEV_AGW_ENDPOINT: ${{ secrets.DEV_AGW_ENDPOINT }} DEV_S3_ENDPOINT: ${{ secrets.DEV_S3_ENDPOINT }} FREE_V2_ENDPOINT: ${{ secrets.FREE_V2_ENDPOINT }} PREM_V1_ENDPOINT: ${{ secrets.PREM_V1_ENDPOINT }} steps: - name: 'Install desktop Qt' uses: jurplel/install-qt-action@v4 with: version: ${{ env.QT_VERSION }} host: 'linux' target: 'desktop' arch: 'linux_gcc_64' modules: ${{ env.QT_MODULES }} dir: ${{ runner.temp }} py7zrversion: '==0.22.*' extra: '--base ${{ env.QT_MIRROR }}' - name: 'Install android_x86_64 Qt' uses: jurplel/install-qt-action@v4 with: version: ${{ env.QT_VERSION }} host: 'linux' target: 'android' arch: 'android_x86_64' modules: ${{ env.QT_MODULES }} dir: ${{ runner.temp }} py7zrversion: '==0.22.*' extra: '--base ${{ env.QT_MIRROR }}' - name: 'Install android_x86 Qt' uses: jurplel/install-qt-action@v4 with: version: ${{ env.QT_VERSION }} host: 'linux' target: 'android' arch: 'android_x86' modules: ${{ env.QT_MODULES }} dir: ${{ runner.temp }} py7zrversion: '==0.22.*' extra: '--base ${{ env.QT_MIRROR }}' - name: 'Install android_armv7 Qt' uses: jurplel/install-qt-action@v4 with: version: ${{ env.QT_VERSION }} host: 'linux' target: 'android' arch: 'android_armv7' modules: ${{ env.QT_MODULES }} dir: ${{ runner.temp }} py7zrversion: '==0.22.*' extra: '--base ${{ env.QT_MIRROR }}' - name: 'Install android_arm64_v8a Qt' uses: jurplel/install-qt-action@v4 with: version: ${{ env.QT_VERSION }} host: 'linux' target: 'android' arch: 'android_arm64_v8a' modules: ${{ env.QT_MODULES }} dir: ${{ runner.temp }} py7zrversion: '==0.22.*' extra: '--base ${{ env.QT_MIRROR }}' - name: 'Grant execute permission for qt-cmake' shell: bash run: | chmod +x ${{ runner.temp }}/Qt/${{ env.QT_VERSION }}/android_x86_64/bin/qt-cmake - name: 'Get sources' uses: actions/checkout@v4 with: submodules: 'true' - name: 'Get version from CMakeLists.txt' id: get_version run: | VERSION=$(grep 'set(AMNEZIAVPN_VERSION' CMakeLists.txt | sed -E 's/.*AMNEZIAVPN_VERSION ([0-9]+.[0-9]+.[0-9]+.[0-9]+)\)/\1/') echo "VERSION=$VERSION" >> $GITHUB_ENV echo "Version: $VERSION" # - name: 'Setup ccache' # uses: hendrikmuhs/ccache-action@v1.2 - name: 'Setup Java' uses: actions/setup-java@v4 with: distribution: 'temurin' java-version: '17' # cache: 'gradle' - name: 'Setup Android NDK' id: setup-ndk uses: nttld/setup-ndk@v1 with: ndk-version: 'r26b' - name: 'Decode keystore secret to file' env: KEYSTORE_BASE64: ${{ secrets.ANDROID_RELEASE_KEYSTORE_BASE64 }} shell: bash run: | echo $KEYSTORE_BASE64 | base64 --decode > android.keystore - name: 'Build project' env: ANDROID_NDK_ROOT: ${{ steps.setup-ndk.outputs.ndk-path }} QT_HOST_PATH: ${{ runner.temp }}/Qt/${{ env.QT_VERSION }}/gcc_64 ANDROID_KEYSTORE_PATH: ${{ github.workspace }}/android.keystore ANDROID_KEYSTORE_KEY_ALIAS: ${{ secrets.ANDROID_RELEASE_KEYSTORE_KEY_ALIAS }} ANDROID_KEYSTORE_KEY_PASS: ${{ secrets.ANDROID_RELEASE_KEYSTORE_KEY_PASS }} shell: bash run: ./deploy/build_android.sh --aab --apk all --build-platform ${{ env.ANDROID_BUILD_PLATFORM }} - name: 'Rename Android APKs' run: | cd deploy/build mv AmneziaVPN-x86_64-release.apk AmneziaVPN_${VERSION}_android9+_x86_64.apk mv AmneziaVPN-x86-release.apk AmneziaVPN_${VERSION}_android9+_x86.apk mv AmneziaVPN-arm64-v8a-release.apk AmneziaVPN_${VERSION}_android9+_arm64-v8a.apk mv AmneziaVPN-armeabi-v7a-release.apk AmneziaVPN_${VERSION}_android9+_armeabi-v7a.apk cd ../.. - name: 'Upload x86_64 apk' uses: actions/upload-artifact@v4 with: name: AmneziaVPN_${{ env.VERSION }}_android9+_x86_64.apk path: deploy/build/AmneziaVPN_${{ env.VERSION }}_android9+_x86_64.apk compression-level: 0 retention-days: 7 - name: 'Upload x86 apk' uses: actions/upload-artifact@v4 with: name: AmneziaVPN_${{ env.VERSION }}_android9+_x86.apk path: deploy/build/AmneziaVPN_${{ env.VERSION }}_android9+_x86.apk compression-level: 0 retention-days: 7 - name: 'Upload arm64-v8a apk' uses: actions/upload-artifact@v4 with: name: AmneziaVPN_${{ env.VERSION }}_android9+_arm64-v8a.apk path: deploy/build/AmneziaVPN_${{ env.VERSION }}_android9+_arm64-v8a.apk compression-level: 0 retention-days: 7 - name: 'Upload armeabi-v7a apk' uses: actions/upload-artifact@v4 with: name: AmneziaVPN_${{ env.VERSION }}_android9+_armeabi-v7a.apk path: deploy/build/AmneziaVPN_${{ env.VERSION }}_android9+_armeabi-v7a.apk compression-level: 0 retention-days: 7 - name: 'Upload aab' uses: actions/upload-artifact@v4 with: name: AmneziaVPN-android path: deploy/build/AmneziaVPN-release.aab compression-level: 0 retention-days: 7 Extra: runs-on: ubuntu-latest steps: - name: Search a corresponding PR uses: octokit/request-action@v2.x id: pull_request with: route: GET /repos/${{ github.repository }}/pulls head: ${{ github.repository_owner }}:${{ github.ref_name }} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Add PR link to build summary if: ${{ fromJSON(steps.pull_request.outputs.data)[0].number != '' }} run: | echo "Pull request:" >> $GITHUB_STEP_SUMMARY echo "[[#${{ fromJSON(steps.pull_request.outputs.data)[0].number }}] ${{ fromJSON(steps.pull_request.outputs.data)[0].title }}](${{ fromJSON(steps.pull_request.outputs.data)[0].html_url }})" >> $GITHUB_STEP_SUMMARY # ------------------------------------------------------ Test-Linux: runs-on: ubuntu-latest env: QT_VERSION: 6.10.1 steps: - name: 'Get sources' uses: actions/checkout@v4 with: submodules: 'true' fetch-depth: 10 - name: 'Install Qt' uses: jurplel/install-qt-action@v3 with: version: ${{ env.QT_VERSION }} host: 'linux' target: 'desktop' arch: 'linux_gcc_64' modules: 'qtremoteobjects qt5compat qtshadertools' dir: ${{ runner.temp }} set-env: 'true' - name: 'Install dependencies' run: | sudo apt-get update sudo apt-get install -y cmake ninja-build libxkbcommon-x11-0 - name: 'Configure' run: | cmake -B build -G Ninja \ -DCMAKE_BUILD_TYPE=Release \ -DBUILD_TESTING=ON - name: 'Build' run: cmake --build build - name: 'Run QTest binaries' run: | ./build/client/tests/testSettingsSignals ./build/client/tests/testSignalOrder # ------------------------------------------------------ Test-Windows: runs-on: windows-latest env: QT_VERSION: 6.10.1 steps: - name: 'Get sources' uses: actions/checkout@v4 with: submodules: 'true' fetch-depth: 10 - name: 'Install Qt' uses: jurplel/install-qt-action@v3 with: version: ${{ env.QT_VERSION }} host: 'windows' target: 'desktop' arch: 'win64_msvc2022_64' modules: 'qtremoteobjects qt5compat qtshadertools' dir: ${{ runner.temp }} set-env: 'true' - name: 'Setup MSVC' uses: ilammy/msvc-dev-cmd@v1 with: arch: 'x64' - name: 'Install dependencies' shell: bash run: | choco install ninja -y - name: 'Configure' shell: cmd run: | cmake -B build -G Ninja ^ -DCMAKE_BUILD_TYPE=Release ^ -DBUILD_TESTING=ON - name: 'Build' shell: cmd run: cmake --build build --config Release - name: 'Deploy Qt dependencies' shell: cmd run: | for %%f in (build\client\test_*.exe) do (windeployqt %%f) - name: 'Run tests' run: | dir build\client\tests dir build\client cd build\client\tests ctest --output-on-failure