Custom Linux Client Generator #2420
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Custom Linux Client Generator | |
| run-name: Custom Linux Client Generator | |
| on: | |
| workflow_dispatch: | |
| inputs: | |
| version: | |
| description: 'version to buld' | |
| required: true | |
| default: '' | |
| type: string | |
| zip_url: | |
| description: 'url to zip of json' | |
| required: true | |
| default: '' | |
| type: string | |
| env: | |
| SCITER_RUST_VERSION: "1.75" # https://github.com/rustdesk/rustdesk/discussions/7503, also 1.78 has ABI change which causes our sciter version not working, https://blog.rust-lang.org/2024/03/30/i128-layout-update.html | |
| RUST_VERSION: "1.75" # sciter failed on m1 with 1.78 because of https://blog.rust-lang.org/2024/03/30/i128-layout-update.html | |
| CARGO_NDK_VERSION: "3.1.2" | |
| SCITER_ARMV7_CMAKE_VERSION: "3.29.7" | |
| SCITER_NASM_DEBVERSION: "2.14-1" | |
| LLVM_VERSION: "15.0.6" | |
| FLUTTER_VERSION: "3.24.5" | |
| ANDROID_FLUTTER_VERSION: "3.24.5" | |
| FLUTTER_RUST_BRIDGE_VERSION: "1.80.1" | |
| # for arm64 linux because official Dart SDK does not work | |
| FLUTTER_ELINUX_VERSION: "3.16.9" | |
| TAG_NAME: "${{ inputs.upload-tag }}" | |
| VCPKG_BINARY_SOURCES: "clear;x-gha,readwrite" | |
| # vcpkg version: 2024.07.12 | |
| VCPKG_COMMIT_ID: "120deac3062162151622ca4860575a33844ba10b" | |
| ARMV7_VCPKG_COMMIT_ID: "6f29f12e82a8293156836ad81cc9bf5af41fe836" | |
| VERSION: "${{ inputs.version }}" | |
| NDK_VERSION: "r28c" | |
| #signing keys env variable checks | |
| ANDROID_SIGNING_KEY: "${{ secrets.ANDROID_SIGNING_KEY }}" | |
| MACOS_P12_BASE64: "${{ secrets.MACOS_P12_BASE64 }}" | |
| UPLOAD_ARTIFACT: 'true' | |
| SIGN_BASE_URL: "${{ secrets.SIGN_BASE_URL }}" | |
| STATUS_URL: "${{ secrets.GENURL }}/updategh" | |
| jobs: | |
| setup: | |
| uses: ./.github/workflows/fetch-encrypted-secrets.yml | |
| with: | |
| zip_url_json: ${{ inputs.zip_url }} | |
| generate-bridge-linux: | |
| uses: ./.github/workflows/bridge.yml | |
| with: | |
| version: ${{ inputs.version }} | |
| build-rustdesk-linux: | |
| needs: [generate-bridge-linux, setup] | |
| name: build rustdesk linux ${{ matrix.job.target }} | |
| runs-on: ${{ matrix.job.on }} | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| # use a high level qemu-user-static | |
| job: | |
| - { | |
| arch: x86_64, | |
| target: x86_64-unknown-linux-gnu, | |
| distro: ubuntu18.04, | |
| on: ubuntu-22.04, | |
| deb_arch: amd64, | |
| vcpkg-triplet: x64-linux, | |
| } | |
| - { | |
| arch: aarch64, | |
| target: aarch64-unknown-linux-gnu, | |
| distro: ubuntu18.04, | |
| on: ubuntu-22.04-arm, | |
| deb_arch: arm64, | |
| vcpkg-triplet: arm64-linux, | |
| } | |
| steps: | |
| - name: Checkout Repository | |
| uses: actions/checkout@v4 | |
| - uses: actions/download-artifact@v4 | |
| with: | |
| name: encrypted-secrets-zip | |
| - name: Load Secrets | |
| uses: ./.github/actions/decrypt-secrets | |
| with: | |
| zip_password: ${{ secrets.ZIP_PASSWORD }} | |
| - name: Export GitHub Actions cache environment variables | |
| uses: actions/github-script@v6 | |
| with: | |
| script: | | |
| core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || ''); | |
| core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || ''); | |
| - name: Set rdgen value | |
| if: ${{ env.rdgen == 'true' }} | |
| run: | | |
| echo "STATUS_URL=${{ secrets.GENURL }}/updategh" >> $GITHUB_ENV | |
| - name: Set rdgen value | |
| if: ${{ env.rdgen == 'false' }} | |
| run: | | |
| echo "STATUS_URL=${{ env.apiServer }}/api/updategh" >> $GITHUB_ENV | |
| - name: Maximize build space | |
| run: | | |
| sudo rm -rf /opt/ghc | |
| sudo rm -rf /usr/local/lib/android | |
| sudo rm -rf /usr/share/dotnet | |
| sudo apt-get update -y | |
| sudo apt-get install -y nasm | |
| if [[ "${{ matrix.job.arch }}" == "x86_64" ]]; then | |
| sudo apt-get install -y qemu-user-static | |
| fi | |
| - name: Install dependencies | |
| run: | | |
| sudo apt-get update | |
| sudo apt-get install -y imagemagick | |
| - name: Checkout source code | |
| if: ${{ env.VERSION != 'master' }} | |
| uses: actions/checkout@v4 | |
| with: | |
| repository: rustdesk/rustdesk | |
| ref: refs/tags/${{ env.VERSION }} | |
| submodules: recursive | |
| - name: Checkout source code | |
| if: ${{ env.VERSION == 'master' }} | |
| uses: actions/checkout@v4 | |
| with: | |
| repository: rustdesk/rustdesk | |
| submodules: recursive | |
| - name: Set Swap Space | |
| if: ${{ matrix.job.arch == 'x86_64' }} | |
| uses: pierotofy/set-swap-space@master | |
| with: | |
| swap-size-gb: 12 | |
| - name: Free Space | |
| run: | | |
| df -h | |
| free -m | |
| - name: Install Rust toolchain | |
| uses: dtolnay/rust-toolchain@v1 | |
| if: matrix.job.arch == 'x86_64' || env.UPLOAD_ARTIFACT == 'true' | |
| with: | |
| toolchain: ${{ env.RUST_VERSION }} | |
| targets: ${{ matrix.job.target }} | |
| components: "rustfmt" | |
| - name: Save Rust toolchain version | |
| run: | | |
| RUST_TOOLCHAIN_VERSION=$(cargo --version | awk '{print $2}') | |
| echo "RUST_TOOLCHAIN_VERSION=$RUST_TOOLCHAIN_VERSION" >> $GITHUB_ENV | |
| - name: Disable rust bridge build | |
| run: | | |
| # only build cdylib | |
| sed -i "s/\[\"cdylib\", \"staticlib\", \"rlib\"\]/\[\"cdylib\"\]/g" Cargo.toml | |
| - name: Restore bridge files | |
| if: matrix.job.arch == 'x86_64' || env.UPLOAD_ARTIFACT == 'true' | |
| uses: actions/download-artifact@master | |
| with: | |
| name: bridge-artifact | |
| path: ./ | |
| - name: Setup vcpkg with Github Actions binary cache | |
| if: matrix.job.arch == 'x86_64' || env.UPLOAD_ARTIFACT == 'true' | |
| uses: lukka/run-vcpkg@v11 | |
| with: | |
| vcpkgDirectory: /opt/artifacts/vcpkg | |
| vcpkgGitCommitId: ${{ env.VCPKG_COMMIT_ID }} | |
| doNotCache: false | |
| - name: Install vcpkg dependencies | |
| if: matrix.job.arch == 'x86_64' || env.UPLOAD_ARTIFACT == 'true' | |
| run: | | |
| sudo apt install -y libva-dev && apt show libva-dev | |
| if ! $VCPKG_ROOT/vcpkg \ | |
| install \ | |
| --triplet ${{ matrix.job.vcpkg-triplet }} \ | |
| --x-install-root="$VCPKG_ROOT/installed"; then | |
| find "${VCPKG_ROOT}/" -name "*.log" | while read -r _1; do | |
| echo "$_1:" | |
| echo "======" | |
| cat "$_1" | |
| echo "======" | |
| echo "" | |
| done | |
| exit 1 | |
| fi | |
| head -n 100 "${VCPKG_ROOT}/buildtrees/ffmpeg/build-${{ matrix.job.vcpkg-triplet }}-rel-out.log" || true | |
| shell: bash | |
| - name: icon stuff | |
| if: ${{ env.iconlink_url != 'false' }} | |
| uses: nick-fields/retry@v3 | |
| with: | |
| timeout_minutes: 1 | |
| max_attempts: 3 | |
| shell: bash | |
| command: | | |
| mv ./res/icon.ico ./res/icon.ico.bak | |
| mv ./res/icon.png ./res/icon.png.bak | |
| mv ./res/tray-icon.ico ./res/tray-icon.ico.bak | |
| wget -O ./res/icon.png ${{ env.iconlink_url }}/get_png?filename=${{ env.iconlink_file }}"&"uuid=${{ env.iconlink_uuid }} | |
| mv ./res/32x32.png ./res/32x32.png.bak | |
| mv ./res/64x64.png ./res/64x64.png.bak | |
| mv ./res/128x128.png ./res/128x128.png.bak | |
| mv ./res/128x128@2x.png ./res/128x128@2x.png.bak | |
| convert ./res/icon.png -define icon:auto-resize=256,64,48,32,16 ./res/icon.ico | |
| convert ./res/icon.png -define icon:auto-resize=256,64,48,32,16 ./res/tray-icon.ico | |
| cp ./res/icon.ico ./res/tray-icon.ico | |
| convert ./res/icon.png -resize 32x32 ./res/32x32.png | |
| convert ./res/icon.png -resize 64x64 ./res/64x64.png | |
| convert ./res/icon.png -resize 128x128 ./res/128x128.png | |
| convert ./res/128x128.png -resize 200% ./res/128x128@2x.png | |
| cp ./src/ui.rs ./src/ui.rs.bak | |
| b64=$(base64 < ./res/icon.png) | |
| sed -i -e 's|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|$(echo "$b64")|' ./src/ui.rs | |
| b64="" | |
| - name: change appname to custom | |
| if: env.appname != 'rustdesk' | |
| continue-on-error: true | |
| shell: bash | |
| run: | | |
| sed -i -e 's|description = "RustDesk Remote Desktop"|description = "${{ env.appname }}"|' ./Cargo.toml | |
| sed -i -e 's|ProductName = "RustDesk"|ProductName = "${{ env.appname }}"|' ./Cargo.toml | |
| sed -i -e 's|FileDescription = "RustDesk Remote Desktop"|FileDescription = "${{ env.appname }}"|' ./Cargo.toml | |
| sed -i -e 's|OriginalFilename = "rustdesk.exe"|OriginalFilename = "${{ env.appname }}.exe"|' ./Cargo.toml | |
| sed -i -e 's|description = "RustDesk Remote Desktop"|description = "${{ env.appname }}"|' ./libs/portable/Cargo.toml | |
| sed -i -e 's|ProductName = "RustDesk"|ProductName = "${{ env.appname }}"|' ./libs/portable/Cargo.toml | |
| sed -i -e 's|FileDescription = "RustDesk Remote Desktop"|FileDescription = "${{ env.appname }}"|' ./libs/portable/Cargo.toml | |
| sed -i -e 's|OriginalFilename = "rustdesk.exe"|OriginalFilename = "${{ env.appname }}.exe"|' ./libs/portable/Cargo.toml | |
| sed -i -e 's|const APP_PREFIX: \&str = "rustdesk";|const APP_PREFIX: \&str = "${{ env.appname }}";|' ./libs/portable/src/main.rs | |
| find ./src/lang -name "*.rs" -exec sed -i -e 's|RustDesk|${{ env.appname }}|' {} \; | |
| sed -i -e '/-p tmpdeb\/usr\/lib\/rustdesk/d' ./build.py | |
| - name: change company name | |
| if: env.compname != 'Purslane Ltd' | |
| continue-on-error: true | |
| shell: bash | |
| run: | | |
| sed -i -e 's|Purslane Ltd|${{ env.compname }}|' ./flutter/lib/desktop/pages/desktop_setting_page.dart | |
| sed -i -e 's|Purslane Ltd|${{ env.compname }}|' ./Cargo.toml | |
| sed -i -e 's|Purslane Ltd|${{ env.compname }}|' ./libs/portable/Cargo.toml | |
| - name: allow custom.txt | |
| uses: nick-fields/retry@v3 | |
| with: | |
| timeout_minutes: 1 | |
| max_attempts: 3 | |
| shell: bash | |
| command: | | |
| sed -i -e 's|rs-ny.rustdesk.com|${{ env.server }}|' ./libs/hbb_common/src/config.rs | |
| sed -i -e 's|OeVuKk5nlHiXp+APNn0Y3pC1Iwpwn44JGqrQCsWqmBw=|${{ env.key }}|' ./libs/hbb_common/src/config.rs | |
| wget https://raw.githubusercontent.com/bryangerlach/rdgen/refs/heads/master/.github/patches/allowCustom.py | |
| python allowCustom.py | |
| wget https://raw.githubusercontent.com/bryangerlach/rdgen/refs/heads/master/.github/patches/removeSetupServerTip.diff | |
| git apply removeSetupServerTip.diff | |
| echo -n "${{ env.custom }}" | cat > ./custom_.txt | |
| # sed -i '/intl:/a \ \ archive: ^3.6.1' ./flutter/pubspec.yaml | |
| sed -i -e 's|https://admin.rustdesk.com|${{ env.apiServer }}|' ./src/common.rs | |
| - name: change url to custom | |
| if: env.urlLink != 'https://rustdesk.com' | |
| continue-on-error: true | |
| shell: bash | |
| run: | | |
| sed -i -e 's|Homepage: https://rustdesk.com|Homepage: ${{ env.urlLink }}|' ./build.py | |
| sed -i -e "s|launchUrl(Uri.parse('https://rustdesk.com'));|launchUrl(Uri.parse('${{ env.urlLink }}'));|" ./flutter/lib/common.dart | |
| sed -i -e "s|launchUrlString('https://rustdesk.com');|launchUrlString('${{ env.urlLink }}');|" ./flutter/lib/desktop/pages/desktop_setting_page.dart | |
| sed -i -e "s|launchUrlString('https://rustdesk.com/privacy.html')|launchUrlString('${{ env.urlLink }}/privacy.html')|" ./flutter/lib/desktop/pages/desktop_setting_page.dart | |
| sed -i -e "s|const url = 'https://rustdesk.com/';|const url = '${{ env.urlLink }}';|" ./flutter/lib/mobile/pages/settings_page.dart | |
| sed -i -e "s|launchUrlString('https://rustdesk.com/privacy.html')|launchUrlString('${{ env.urlLink }}/privacy.html')|" ./flutter/lib/mobile/pages/settings_page.dart | |
| sed -i -e "s|https://rustdesk.com/privacy.html|${{ env.urlLink }}/privacy.html|" ./flutter/lib/desktop/pages/install_page.dart | |
| - name: change download link to custom | |
| if: env.downloadLink != 'https://rustdesk.com/download' | |
| continue-on-error: true | |
| shell: bash | |
| run: | | |
| sed -i -e 's|https://rustdesk.com/download|${{ env.downloadLink }}|' ./flutter/lib/desktop/pages/desktop_home_page.dart | |
| sed -i -e 's|https://rustdesk.com/download|${{ env.downloadLink }}|' ./flutter/lib/mobile/pages/connection_page.dart | |
| sed -i -e 's|https://rustdesk.com/download|${{ env.downloadLink }}|' ./src/ui/index.tis | |
| - name: fix connection delay | |
| continue-on-error: true | |
| if: ${{ env.delayFix == 'true' }} | |
| shell: bash | |
| run: | | |
| sed -i -e 's|!key.is_empty()|false|' ./src/client.rs | |
| - name: add cycle monitors to toolbar | |
| if: env.cycleMonitor == 'true' | |
| uses: nick-fields/retry@v3 | |
| with: | |
| timeout_minutes: 1 | |
| max_attempts: 3 | |
| shell: bash | |
| command: | | |
| wget https://raw.githubusercontent.com/bryangerlach/rdgen/refs/heads/master/.github/patches/cycle_monitor.diff | |
| git apply cycle_monitor.diff | |
| - name: use X for offline display instead of orange circle | |
| if: env.xOffline == 'true' | |
| uses: nick-fields/retry@v3 | |
| with: | |
| timeout_minutes: 1 | |
| max_attempts: 3 | |
| shell: bash | |
| command: | | |
| wget https://raw.githubusercontent.com/bryangerlach/rdgen/refs/heads/master/.github/patches/xoffline.diff | |
| git apply xoffline.diff | |
| - name: hide-cm | |
| if: env.hidecm == 'true' | |
| uses: nick-fields/retry@v3 | |
| with: | |
| timeout_minutes: 1 | |
| max_attempts: 3 | |
| shell: bash | |
| command: | | |
| wget https://raw.githubusercontent.com/bryangerlach/rdgen/refs/heads/master/.github/patches/hidecm.diff | |
| git apply hidecm.diff | |
| - name: removeNewVersionNotif | |
| continue-on-error: true | |
| if: env.removeNewVersionNotif == 'true' | |
| run: | | |
| sed -i -e 's|updateUrl.isNotEmpty|false|' ./flutter/lib/desktop/pages/desktop_home_page.dart | |
| sed -i '/let (request, url) =/,/Ok(())/{/Ok(())/!d}' ./src/common.rs | |
| - name: Restore bridge files | |
| if: matrix.job.arch == 'x86_64' || env.UPLOAD_ARTIFACT == 'true' | |
| uses: actions/download-artifact@master | |
| with: | |
| name: bridge-artifact | |
| path: ./ | |
| - uses: rustdesk-org/run-on-arch-action@amd64-support | |
| name: Build rustdesk | |
| id: vcpkg | |
| if: matrix.job.arch == 'x86_64' || env.UPLOAD_ARTIFACT == 'true' | |
| with: | |
| arch: ${{ matrix.job.arch }} | |
| distro: ${{ matrix.job.distro }} | |
| githubToken: ${{ github.token }} | |
| setup: | | |
| ls -l "${PWD}" | |
| ls -l /opt/artifacts/vcpkg/installed | |
| dockerRunArgs: | | |
| --volume "${PWD}:/workspace" | |
| --volume "/opt/artifacts:/opt/artifacts" | |
| shell: /bin/bash | |
| install: | | |
| apt-get update -y | |
| echo -e "installing deps" | |
| apt-get install -y \ | |
| build-essential \ | |
| clang \ | |
| cmake \ | |
| curl \ | |
| gcc \ | |
| git \ | |
| g++ \ | |
| imagemagick \ | |
| libayatana-appindicator3-dev \ | |
| libasound2-dev \ | |
| libclang-10-dev \ | |
| libgstreamer1.0-dev \ | |
| libgstreamer-plugins-base1.0-dev \ | |
| libgtk-3-dev \ | |
| libpam0g-dev \ | |
| libpulse-dev \ | |
| libva-dev \ | |
| libxcb-randr0-dev \ | |
| libxcb-shape0-dev \ | |
| libxcb-xfixes0-dev \ | |
| libxdo-dev \ | |
| libxfixes-dev \ | |
| llvm-10-dev \ | |
| nasm \ | |
| ninja-build \ | |
| pkg-config \ | |
| tree \ | |
| python3 \ | |
| rpm \ | |
| unzip \ | |
| wget \ | |
| xz-utils \ | |
| libssl-dev | |
| # we have libopus compiled by us. | |
| apt-get remove -y libopus-dev || true | |
| # output devs | |
| ls -l ./ | |
| tree -L 3 /opt/artifacts/vcpkg/installed | |
| run: | | |
| # disable git safe.directory | |
| git config --global --add safe.directory "*" | |
| # rust | |
| pushd /opt | |
| # do not use rustup, because memory overflow in qemu | |
| wget -O rust.tar.gz https://static.rust-lang.org/dist/rust-${{env.RUST_TOOLCHAIN_VERSION}}-${{ matrix.job.target }}.tar.gz | |
| tar -zxvf rust.tar.gz > /dev/null && rm rust.tar.gz | |
| cd rust-${{env.RUST_TOOLCHAIN_VERSION}}-${{ matrix.job.target }} && ./install.sh | |
| rm -rf rust-${{env.RUST_TOOLCHAIN_VERSION}}-${{ matrix.job.target }} | |
| # edit config | |
| mkdir -p ~/.cargo/ | |
| echo """ | |
| [source.crates-io] | |
| registry = 'https://github.com/rust-lang/crates.io-index' | |
| """ > ~/.cargo/config | |
| cat ~/.cargo/config | |
| # start build | |
| pushd /workspace | |
| export VCPKG_ROOT=/opt/artifacts/vcpkg | |
| if [[ "${{ matrix.job.arch }}" == "aarch64" ]]; then | |
| export JOBS="--jobs 3" | |
| else | |
| export JOBS="" | |
| fi | |
| echo $JOBS | |
| # Make the right unit stop when the services is stopped by tray | |
| sed -ie "s|\(systemctl\s\+\S\+\s\){app_name}|\1${{ env.filename }}|g" src/platform/linux.rs | |
| sed -ie 's|\({home}/{p}/{app_name0}2\?.toml\)|\\"\1\\"|g' src/platform/linux.rs | |
| sed -ie 's|\(/root/{p}/\)|\\"\1\\"|g' src/platform/linux.rs | |
| cargo build --lib $JOBS --features hwcodec,flutter,unix-file-copy-paste --release | |
| rm -rf target/release/deps target/release/build | |
| rm -rf ~/.cargo | |
| # Setup Flutter | |
| # disable git safe.directory | |
| git config --global --add safe.directory "*" | |
| pushd /workspace | |
| case ${{ matrix.job.arch }} in | |
| aarch64) | |
| export PATH=/opt/flutter-elinux/bin:$PATH | |
| sed -i "s/flutter build linux --release/flutter-elinux build linux --verbose/g" ./build.py | |
| sed -i "s/x64\/release/arm64\/release/g" ./build.py | |
| ;; | |
| x86_64) | |
| export PATH=/opt/flutter/bin:$PATH | |
| ;; | |
| esac | |
| popd | |
| pushd /opt | |
| wget https://storage.googleapis.com/flutter_infra_release/releases/stable/linux/flutter_linux_${{ env.FLUTTER_VERSION }}-stable.tar.xz | |
| tar xf flutter_linux_${{ env.FLUTTER_VERSION }}-stable.tar.xz | |
| case ${{ matrix.job.arch }} in | |
| aarch64) | |
| # clone repo and reset to flutter ${{ env.FLUTTER_VERSION }} | |
| git clone https://github.com/sony/flutter-elinux.git || true | |
| pushd flutter-elinux | |
| git fetch | |
| git reset --hard ${{ env.FLUTTER_VERSION }} | |
| bin/flutter-elinux doctor -v | |
| bin/flutter-elinux precache --linux | |
| popd | |
| cp -R flutter/bin/cache/artifacts/engine/linux-x64/shader_lib flutter-elinux/flutter/bin/cache/artifacts/engine/linux-arm64 | |
| rm -rf flutter | |
| ;; | |
| x86_64) | |
| flutter doctor -v | |
| ;; | |
| esac | |
| if [[ "3.24.5" == ${{ env.FLUTTER_VERSION }} ]]; then | |
| case ${{ matrix.job.arch }} in | |
| aarch64) | |
| pushd /opt/flutter-elinux/flutter | |
| ;; | |
| x86_64) | |
| pushd /opt/flutter | |
| ;; | |
| esac | |
| git apply ${{ github.workspace }}/.github/patches/flutter_3.24.4_dropdown_menu_enableFilter.diff | |
| popd | |
| fi | |
| # build flutter | |
| pushd /workspace | |
| mkdir output | |
| chmod 777 output -R | |
| export CARGO_INCREMENTAL=0 | |
| export DEB_ARCH=${{ matrix.job.deb_arch }} | |
| mkdir -p flutter/tmpdeb/usr/share/rustdesk | |
| cp ./custom_.txt ./flutter/tmpdeb/usr/share/rustdesk/custom_.txt | |
| if [[ "${{ env.logolink_url }}" != "false" ]]; then | |
| wget -O ./flutter/assets/logo.png ${{ env.logolink_url }}/get_png?filename=${{ env.logolink_file }}"&"uuid=${{ env.logolink_uuid }} | |
| fi | |
| if [[ "${{ env.iconlink_url }}" != "false" ]]; then | |
| mv ./flutter/assets/icon.svg ./flutter/assets/icon.svg.bak | |
| convert ./res/icon.png ./flutter/assets/icon.svg | |
| convert ./res/128x128.png -resize 200% ./flutter/assets/128x128@2x.png || true | |
| cp ./flutter/assets/icon.svg ./res/scalable.svg | |
| pushd ./flutter | |
| if [[ "${{ matrix.job.arch }}" == "aarch64" ]]; then | |
| export PATH="/opt/flutter-elinux/flutter/bin:$PATH" | |
| fi | |
| flutter pub get | |
| dart run flutter_launcher_icons | |
| popd | |
| fi | |
| # Change files names in the output .deb | |
| # sed -ie "s|\(cp .* \)tmpdeb/usr/share/rustdesk/files/systemd/|\1tmpdeb/usr/share/rustdesk/files/systemd/${{ env.filename }}.service|g" build.py | |
| # sed -ie "s|cp -r \(.\+\)\* \([^ ]\+\)/rustdesk|mv \1rustdesk \1${{ env.filename }}; cp -r \1\* \2/${{ env.filename }}|g" build.py | |
| # sed -ie "s|\(tmpdeb/[^ ]*\)rustdesk|\1${{ env.filename }}|g" build.py | |
| # sed -ie "s|Package: rustdesk|Package: ${{ env.filename }}|g" build.py | |
| # sed -ie "s|RustDesk|${{ env.appname }}|g" res/rustdesk.desktop | |
| # FILES=$(sed -ne "s~.*cp\s\(../\)\?\+\(.\+\.\(desktop\|service\)\)\s\+tmpdeb/.*~\2~p" build.py | sort | uniq) | |
| # FILES=$(echo -e "$FILES\n$(ls --color=never res/DEBIAN/*)") | |
| # for FILE in $(echo $FILES | sed "s/\n/ /g"); do | |
| # sed -ie "s|rustdesk|${{ env.filename }}|g" $FILE | |
| # done | |
| # for file in "./res/rpm-flutter.spec" "./res/rpm-flutter-suse.spec"; do | |
| # sed -ie "s|^\(URL:\s*\).*|\1${{ env.downloadLink }}|g" "$file" | |
| # sed -ie "s|^\(Vendor:\s*\).*|\1${{ env.compname }}|g" "$file" | |
| # sed -ie '/\${\?HBB}\?/!{/\(^Name:\|\/usr\|\/etc\|systemctl\)/s|rustdesk|${{ env.filename }}|g}' "$file" | |
| # sed -ie '/\${\?HBB}\?/{/^install/s|\(\/usr\/.*\/\)rustdesk|\1${{ env.filename }}|g}' "$file" | |
| # sed -ie '/\${\?HBB}\?/{/^mkdir/s|rustdesk|${{ env.filename }}|g}' "$file" | |
| # for extension in ".desktop" "-link.desktop" ".service"; do | |
| # sed -ie "/^%files$/i\mv %{buildroot}/usr/share/${{ env.filename }}/files/rustdesk$extension %{buildroot}/usr/share/${{ env.filename }}/files/${{ env.filename }}$extension" "$file" | |
| # sed -ie "/^%files$/i\sed -ie 's|RustDesk|${{ env.filename }}|g' %{buildroot}/usr/share/${{ env.filename }}/files/${{ env.filename }}$extension" "$file" | |
| # sed -ie "/^%files$/i\sed -ie 's|rustdesk|${{ env.filename }}|g' %{buildroot}/usr/share/${{ env.filename }}/files/${{ env.filename }}$extension" "$file" | |
| # done | |
| # sed -ie '/^%files$/i\\n' "$file" | |
| # done | |
| python3 ./build.py --flutter --skip-cargo | |
| for name in *.deb; do | |
| mv "$name" /workspace/output/"${{ env.filename }}-${{ matrix.job.arch }}.deb" | |
| done | |
| # rpm package | |
| echo -e "start packaging fedora package" | |
| pushd /workspace | |
| case ${{ matrix.job.arch }} in | |
| aarch64) | |
| sed -i "s/linux\/x64/linux\/arm64/g" ./res/rpm-flutter.spec | |
| ;; | |
| esac | |
| HBB=`pwd` rpmbuild ./res/rpm-flutter.spec -bb | |
| pushd ~/rpmbuild/RPMS/${{ matrix.job.arch }} | |
| for name in *.rpm; do | |
| mv "$name" /workspace/output/"${{ env.filename }}-${{ matrix.job.arch }}.rpm" | |
| done | |
| # rpm suse package | |
| echo -e "start packaging suse package" | |
| pushd /workspace | |
| case ${{ matrix.job.arch }} in | |
| aarch64) | |
| sed -i "s/linux\/x64/linux\/arm64/g" ./res/rpm-flutter-suse.spec | |
| ;; | |
| esac | |
| HBB=`pwd` rpmbuild ./res/rpm-flutter-suse.spec -bb | |
| pushd ~/rpmbuild/RPMS/${{ matrix.job.arch }} | |
| for name in *.rpm; do | |
| mv "$name" /workspace/output/"${{ env.filename }}-suse-${{ matrix.job.arch }}.rpm" | |
| done | |
| # only x86_64 for arch since we can not find newest arm64 docker image to build | |
| # old arch image does not make sense for arch since it is "arch" which always update to date | |
| # and failed to makepkg arm64 on x86_64 | |
| - name: Patch archlinux PKGBUILD | |
| continue-on-error: true | |
| if: matrix.job.arch == 'x86_64' && env.UPLOAD_ARTIFACT == 'true' && env.VERSION != 'master' | |
| run: | | |
| sed -i "s/x86_64/${{ matrix.job.arch }}/g" res/PKGBUILD | |
| if [[ "${{ matrix.job.arch }}" == "aarch64" ]]; then | |
| sed -i "s/x86_64/aarch64/g" ./res/PKGBUILD | |
| fi | |
| - name: Build archlinux package | |
| continue-on-error: true | |
| if: matrix.job.arch == 'x86_64' && env.UPLOAD_ARTIFACT == 'true' && env.VERSION != 'master' | |
| uses: rustdesk-org/arch-makepkg-action@master | |
| with: | |
| packages: | |
| scripts: | | |
| cd res && HBB=`pwd`/.. FLUTTER=1 makepkg -f | |
| - name: Rename archlinux package | |
| continue-on-error: true | |
| if: matrix.job.arch == 'x86_64' && env.UPLOAD_ARTIFACT == 'true' && env.VERSION != 'master' | |
| run: | | |
| cp ./res/rustdesk-${{ env.VERSION }}-0-x86_64.pkg.tar.zst ./output/${{ env.filename }}-${{ matrix.job.arch }}.pkg.tar.zst | |
| - name: send file to rdgen server | |
| if: ${{ env.rdgen == 'true' }} | |
| uses: nick-fields/retry@v3 | |
| with: | |
| timeout_minutes: 1 | |
| max_attempts: 3 | |
| shell: bash | |
| command: | | |
| curl -i -X POST -H "Content-Type: multipart/form-data" -H "Authorization: Bearer ${{ env.token }}" -F "file=@./output/${{ env.filename }}-${{ matrix.job.arch }}.deb" -F "uuid=${{ env.uuid }}" ${{ secrets.GENURL }}/save_custom_client | |
| curl -i -X POST -H "Content-Type: multipart/form-data" -H "Authorization: Bearer ${{ env.token }}" -F "file=@./output/${{ env.filename }}-${{ matrix.job.arch }}.rpm" -F "uuid=${{ env.uuid }}" ${{ secrets.GENURL }}/save_custom_client | |
| curl -i -X POST -H "Content-Type: multipart/form-data" -H "Authorization: Bearer ${{ env.token }}" -F "file=@./output/${{ env.filename }}-suse-${{ matrix.job.arch }}.rpm" -F "uuid=${{ env.uuid }}" ${{ secrets.GENURL }}/save_custom_client | |
| curl -i -X POST -H "Content-Type: multipart/form-data" -H "Authorization: Bearer ${{ env.token }}" -F "file=@./output/${{ env.filename }}-${{ matrix.job.arch }}.pkg.tar.zst" -F "uuid=${{ env.uuid }}" ${{ secrets.GENURL }}/save_custom_client || true | |
| - name: send file to api server | |
| if: ${{ env.rdgen == 'false' }} | |
| uses: nick-fields/retry@v3 | |
| with: | |
| timeout_minutes: 1 | |
| max_attempts: 3 | |
| shell: bash | |
| command: | | |
| curl -i -X POST -H "Content-Type: multipart/form-data" -H "Authorization: Bearer ${{ env.token }}" -F "file=@./output/${{ env.filename }}-${{ matrix.job.arch }}.deb" ${{ env.apiServer }}/api/save_custom_client | |
| curl -i -X POST -H "Content-Type: multipart/form-data" -H "Authorization: Bearer ${{ env.token }}" -F "file=@./output/${{ env.filename }}-${{ matrix.job.arch }}.rpm" ${{ env.apiServer }}/api/save_custom_client | |
| curl -i -X POST -H "Content-Type: multipart/form-data" -H "Authorization: Bearer ${{ env.token }}" -F "file=@./output/${{ env.filename }}-suse-${{ matrix.job.arch }}.rpm" ${{ env.apiServer }}/api/save_custom_client | |
| curl -i -X POST -H "Content-Type: multipart/form-data" -H "Authorization: Bearer ${{ env.token }}" -F "file=@./output/${{ env.filename }}-${{ matrix.job.arch }}.pkg.tar.zst" ${{ env.apiServer }}/api/save_custom_client || true | |
| - name: Upload deb | |
| uses: actions/upload-artifact@master | |
| if: env.UPLOAD_ARTIFACT == 'true' | |
| with: | |
| name: ${{ env.filename }}-${{ matrix.job.arch }}.deb | |
| path: ./output/${{ env.filename }}-${{ matrix.job.arch }}.deb | |
| build-appimage: | |
| name: Build appimage ${{ matrix.job.target }} | |
| needs: [build-rustdesk-linux] | |
| runs-on: ubuntu-22.04 | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| job: | |
| - { target: x86_64-unknown-linux-gnu, arch: x86_64 } | |
| - { target: aarch64-unknown-linux-gnu, arch: aarch64 } | |
| steps: | |
| - name: Checkout Repository | |
| uses: actions/checkout@v4 | |
| - uses: actions/download-artifact@v4 | |
| with: | |
| name: encrypted-secrets-zip | |
| - name: Load Secrets | |
| uses: ./.github/actions/decrypt-secrets | |
| with: | |
| zip_password: ${{ secrets.ZIP_PASSWORD }} | |
| - name: Checkout source code | |
| if: ${{ env.VERSION != 'master' }} | |
| uses: actions/checkout@v4 | |
| with: | |
| repository: rustdesk/rustdesk | |
| ref: refs/tags/${{ env.VERSION }} | |
| submodules: recursive | |
| - name: Checkout source code | |
| if: ${{ env.VERSION == 'master' }} | |
| uses: actions/checkout@v4 | |
| with: | |
| repository: rustdesk/rustdesk | |
| submodules: recursive | |
| - name: Download Binary | |
| uses: actions/download-artifact@master | |
| with: | |
| name: ${{ env.filename }}-${{ matrix.job.arch }}.deb | |
| path: . | |
| - name: Rename Binary | |
| run: | | |
| mv ${{ env.filename }}-${{ matrix.job.arch }}.deb appimage/rustdesk.deb | |
| - name: icon stuff | |
| if: ${{ env.iconlink_url != 'false' }} | |
| uses: nick-fields/retry@v3 | |
| with: | |
| timeout_minutes: 1 | |
| max_attempts: 3 | |
| shell: bash | |
| command: | | |
| mv ./res/icon.ico ./res/icon.ico.bak | |
| mv ./res/icon.png ./res/icon.png.bak | |
| mv ./res/tray-icon.ico ./res/tray-icon.ico.bak | |
| wget -O ./res/icon.png ${{ env.iconlink_url }}/get_png?filename=${{ env.iconlink_file }}"&"uuid=${{ env.iconlink_uuid }} | |
| mv ./res/32x32.png ./res/32x32.png.bak | |
| mv ./res/64x64.png ./res/64x64.png.bak | |
| mv ./res/128x128.png ./res/128x128.png.bak | |
| mv ./res/128x128@2x.png ./res/128x128@2x.png.bak | |
| convert ./res/icon.png -define icon:auto-resize=256,64,48,32,16 ./res/icon.ico | |
| convert ./res/icon.png -define icon:auto-resize=256,64,48,32,16 ./res/tray-icon.ico | |
| cp ./res/icon.ico ./res/tray-icon.ico | |
| convert ./res/icon.png -resize 32x32 ./res/32x32.png | |
| convert ./res/icon.png -resize 64x64 ./res/64x64.png | |
| convert ./res/icon.png -resize 128x128 ./res/128x128.png | |
| convert ./res/128x128.png -resize 200% ./res/128x128@2x.png | |
| cp ./src/ui.rs ./src/ui.rs.bak | |
| b64=$(base64 < ./res/icon.png) | |
| sed -i -e 's|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|$(echo "$b64")|' ./src/ui.rs | |
| b64="" | |
| # Embed the PNG into the SVG | |
| cat <<EOF > ./res/scalable.svg | |
| <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="$(identify -format "%w" "./res/icon.png")" height="$(identify -format "%h" "./res/icon.png")"> | |
| <image width="$(identify -format "%w" "./res/icon.png")" height="$(identify -format "%h" "./res/icon.png")" xlink:href="data:image/png;base64,$(base64 -w 0 "./res/icon.png")"/> | |
| </svg> | |
| EOF | |
| - name: Build appimage package | |
| shell: bash | |
| run: | | |
| sed -ie "s|rustdesk|${{ env.filename }}|g" appimage/* | |
| mv appimage/rustdesk.deb "appimage/${{ env.filename }}.deb" | |
| # install libarchive-tools for bsdtar command used in AppImageBuilder.yml | |
| sudo apt-get update -y | |
| sudo apt-get install -y libarchive-tools libfuse2 | |
| # set-up appimage-builder | |
| sudo pip3 install git+https://github.com/rustdesk-org/appimage-builder.git | |
| # run appimage-builder | |
| pushd appimage | |
| sudo appimage-builder --skip-tests --recipe ./AppImageBuilder-${{ matrix.job.arch }}.yml | |
| sudo mv ./${{ env.filename }}-${{ env.VERSION }}-${{ matrix.job.arch }}.AppImage ./${{ env.filename }}-${{ matrix.job.arch }}.AppImage | |
| - name: send file to rdgen server | |
| if: ${{ env.rdgen == 'true' }} | |
| uses: nick-fields/retry@v3 | |
| with: | |
| timeout_minutes: 1 | |
| max_attempts: 3 | |
| shell: bash | |
| command: | | |
| curl -i -X POST -H "Content-Type: multipart/form-data" -H "Authorization: Bearer ${{ env.token }}" -F "file=@./appimage/${{ env.filename }}-${{ matrix.job.arch }}.AppImage" -F "uuid=${{ env.uuid }}" ${{ secrets.GENURL }}/save_custom_client | |
| - name: send file to api server | |
| if: ${{ env.rdgen == 'false' }} | |
| uses: nick-fields/retry@v3 | |
| with: | |
| timeout_minutes: 1 | |
| max_attempts: 3 | |
| shell: bash | |
| command: | | |
| curl -i -X POST -H "Content-Type: multipart/form-data" -H "Authorization: Bearer ${{ env.token }}" -F "file=@./appimage/${{ env.filename }}-${{ matrix.job.arch }}.AppImage" ${{ env.apiServer }}/api/save_custom_client | |
| build-flatpak: | |
| name: Build flatpak ${{ matrix.job.target }}${{ matrix.job.suffix }} | |
| needs: | |
| - build-rustdesk-linux | |
| runs-on: ${{ matrix.job.on }} | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| job: | |
| - { | |
| target: x86_64-unknown-linux-gnu, | |
| distro: ubuntu18.04, | |
| on: ubuntu-22.04, | |
| arch: x86_64, | |
| suffix: "", | |
| } | |
| - { | |
| target: aarch64-unknown-linux-gnu, | |
| # try out newer flatpak since error of "error: Nothing matches org.freedesktop.Platform in remote flathub" | |
| distro: ubuntu22.04, | |
| on: ubuntu-22.04-arm, | |
| arch: aarch64, | |
| suffix: "", | |
| } | |
| steps: | |
| - name: Checkout Repository | |
| uses: actions/checkout@v4 | |
| - uses: actions/download-artifact@v4 | |
| with: | |
| name: encrypted-secrets-zip | |
| - name: Load Secrets | |
| uses: ./.github/actions/decrypt-secrets | |
| with: | |
| zip_password: ${{ secrets.ZIP_PASSWORD }} | |
| - name: Checkout source code | |
| if: ${{ env.VERSION != 'master' }} | |
| uses: actions/checkout@v4 | |
| with: | |
| repository: rustdesk/rustdesk | |
| ref: refs/tags/${{ env.VERSION }} | |
| submodules: recursive | |
| - name: Checkout source code | |
| if: ${{ env.VERSION == 'master' }} | |
| uses: actions/checkout@v4 | |
| with: | |
| repository: rustdesk/rustdesk | |
| submodules: recursive | |
| - name: Download Binary | |
| uses: actions/download-artifact@master | |
| with: | |
| name: ${{ env.filename }}-${{ matrix.job.arch }}.deb | |
| path: . | |
| - name: Rename Binary | |
| run: | | |
| mv ${{ env.filename }}-${{ matrix.job.arch }}.deb flatpak/rustdesk.deb | |
| - uses: rustdesk-org/run-on-arch-action@amd64-support | |
| name: Build rustdesk flatpak package for ${{ matrix.job.arch }} | |
| continue-on-error: true | |
| timeout-minutes: 30 | |
| id: flatpak | |
| with: | |
| arch: ${{ matrix.job.arch }} | |
| distro: ${{ matrix.job.distro }} | |
| githubToken: ${{ github.token }} | |
| setup: | | |
| ls -l "${PWD}" | |
| dockerRunArgs: | | |
| --volume "${PWD}:/workspace" | |
| shell: /bin/bash | |
| install: | | |
| apt-get update -y | |
| apt-get install -y git flatpak flatpak-builder | |
| run: | | |
| # disable git safe.directory | |
| git config --global --add safe.directory "*" | |
| pushd /workspace | |
| # flatpak deps | |
| flatpak --user remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo | |
| # package | |
| pushd flatpak | |
| git clone https://github.com/flathub/shared-modules.git --depth=1 | |
| flatpak-builder --user --install-deps-from=flathub -y --force-clean --repo=repo ./build ./rustdesk.json | |
| flatpak build-bundle ./repo ${{ env.filename }}-${{ matrix.job.arch }}.flatpak com.rustdesk.RustDesk | |
| - name: send file to rdgen server | |
| if: ${{ env.rdgen == 'true' }} | |
| uses: nick-fields/retry@v3 | |
| with: | |
| timeout_minutes: 1 | |
| max_attempts: 3 | |
| shell: bash | |
| command: | | |
| curl -i -X POST -H "Content-Type: multipart/form-data" -H "Authorization: Bearer ${{ env.token }}" -F "file=@./flatpak/${{ env.filename }}-${{ matrix.job.arch }}.flatpak" -F "uuid=${{ env.uuid }}" ${{ secrets.GENURL }}/save_custom_client | |
| - name: send file to api server | |
| if: ${{ env.rdgen == 'false' }} | |
| uses: nick-fields/retry@v3 | |
| with: | |
| timeout_minutes: 1 | |
| max_attempts: 3 | |
| shell: bash | |
| command: | | |
| curl -i -X POST -H "Content-Type: multipart/form-data" -H "Authorization: Bearer ${{ env.token }}" -F "file=@./flatpak/${{ env.filename }}-${{ matrix.job.arch }}.flatpak" ${{ env.apiServer }}/api/save_custom_client | |
| deploy: | |
| needs: [build-rustdesk-linux,build-flatpak,build-appimage] | |
| if: always() | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout Repository | |
| uses: actions/checkout@v4 | |
| - uses: actions/download-artifact@v4 | |
| with: | |
| name: encrypted-secrets-zip | |
| - name: Load Secrets | |
| uses: ./.github/actions/decrypt-secrets | |
| with: | |
| zip_password: ${{ secrets.ZIP_PASSWORD }} | |
| - name: Finalize and Cleanup zip/json | |
| if: always() # Run even if previous steps fail | |
| continue-on-error: true | |
| uses: fjogeleit/http-request-action@v1 | |
| with: | |
| url: "${{ secrets.GENURL }}/cleanzip" | |
| method: 'POST' | |
| customHeaders: '{"Content-Type": "application/json"}' | |
| data: '{"uuid": "${{ env.uuid }}"}' | |
| - name: Set rdgen value | |
| if: ${{ env.rdgen == 'true' }} | |
| run: | | |
| echo "STATUS_URL=${{ secrets.GENURL }}/updategh" >> $GITHUB_ENV | |
| - name: Set rdgen value | |
| if: ${{ env.rdgen == 'false' }} | |
| run: | | |
| echo "STATUS_URL=${{ env.apiServer }}/api/updategh" >> $GITHUB_ENV | |
| - uses: geekyeggo/delete-artifact@v5 | |
| continue-on-error: true | |
| with: | |
| name: ${{ env.filename }}-*.deb | |
| cleanup: | |
| needs: [build-rustdesk-linux,build-flatpak,build-appimage,deploy] | |
| runs-on: ubuntu-latest | |
| continue-on-error: true | |
| if: always() | |
| steps: | |
| - name: Delete secrets artifact | |
| uses: geekyeggo/delete-artifact@v5 | |
| with: | |
| name: encrypted-secrets-zip |