diff --git a/.github/workflows/flutter-build.yml b/.github/workflows/flutter-build.yml index 0cab18c0d4..5d4cb942b7 100644 --- a/.github/workflows/flutter-build.yml +++ b/.github/workflows/flutter-build.yml @@ -46,38 +46,35 @@ env: SIGN_BASE_URL: "${{ secrets.SIGN_BASE_URL }}" jobs: - generate-bridge-linux: - uses: ./.github/workflows/bridge.yml - - - build-rustdesk-android: - needs: [generate-bridge-linux] - name: build rustdesk android apk ${{ matrix.job.target }} + build-RustDeskTempTopMostWindow: + uses: ./.github/workflows/third-party-RustDeskTempTopMostWindow.yml + with: + upload-artifact: ${{ inputs.upload-artifact }} + target: windows-2022 + configuration: Release + platform: x64 + target_version: Windows10 + strategy: + fail-fast: false + + build-for-windows-flutter: + name: ${{ matrix.job.target }} + needs: [build-RustDeskTempTopMostWindow] runs-on: ${{ matrix.job.os }} strategy: fail-fast: false matrix: job: + # - { target: i686-pc-windows-msvc , os: windows-2022 } + # - { target: x86_64-pc-windows-gnu , os: windows-2022 } - { - arch: aarch64, - target: aarch64-linux-android, - os: ubuntu-20.04, - reltype: release, - suffix: "", + target: x86_64-pc-windows-msvc, + os: windows-2022, + arch: x86_64, + vcpkg-triplet: x64-windows-static, } - + # - { target: aarch64-pc-windows-msvc, os: windows-2022, arch: aarch64 } steps: - - name: Free Disk Space (Ubuntu) - uses: jlumbroso/free-disk-space@main - with: - tool-cache: false - android: false - dotnet: true - haskell: true - large-packages: false - docker-images: true - swap-storage: false - - name: Export GitHub Actions cache environment variables uses: actions/github-script@v6 with: @@ -85,69 +82,54 @@ jobs: core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || ''); core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || ''); - - name: Install dependencies - run: | - sudo apt-get update - sudo apt-get install -y \ - clang \ - cmake \ - curl \ - gcc-multilib \ - git \ - g++ \ - g++-multilib \ - libappindicator3-dev \ - libasound2-dev \ - libc6-dev \ - libclang-10-dev \ - libgstreamer1.0-dev \ - libgstreamer-plugins-base1.0-dev \ - libgtk-3-dev \ - libpam0g-dev \ - libpulse-dev \ - libva-dev \ - libvdpau-dev \ - libxcb-randr0-dev \ - libxcb-shape0-dev \ - libxcb-xfixes0-dev \ - libxdo-dev \ - libxfixes-dev \ - llvm-10-dev \ - nasm \ - ninja-build \ - openjdk-11-jdk-headless \ - pkg-config \ - tree \ - wget - - name: Checkout source code uses: actions/checkout@v4 + + - name: Install LLVM and Clang + uses: KyleMayes/install-llvm-action@v1 + with: + version: ${{ env.LLVM_VERSION }} + - name: Install flutter - uses: subosito/flutter-action@v2 + uses: subosito/flutter-action@v2.12.0 #https://github.com/subosito/flutter-action/issues/277 with: channel: "stable" - flutter-version: ${{ env.ANDROID_FLUTTER_VERSION }} - - uses: nttld/setup-ndk@v1 - id: setup-ndk + flutter-version: ${{ env.FLUTTER_VERSION }} + cache: true + + - name: Install Rust toolchain + uses: dtolnay/rust-toolchain@v1 with: - ndk-version: ${{ env.NDK_VERSION }} - add-to-path: true + toolchain: ${{ env.SCITER_RUST_VERSION }} + targets: ${{ matrix.job.target }} + components: "rustfmt" + + - uses: Swatinem/rust-cache@v2 + with: + prefix-key: ${{ matrix.job.os }} + + - name: Install flutter rust bridge deps + run: | + git config --global core.longpaths true + cargo install flutter_rust_bridge_codegen --version ${{ env.FLUTTER_RUST_BRIDGE_VERSION }} --features "uuid" + Push-Location flutter ; flutter pub get ; Pop-Location + ~/.cargo/bin/flutter_rust_bridge_codegen --rust-input ./src/flutter_ffi.rs --dart-output ./flutter/lib/generated_bridge.dart - name: Setup vcpkg with Github Actions binary cache uses: lukka/run-vcpkg@v11 with: - vcpkgDirectory: /opt/artifacts/vcpkg + vcpkgDirectory: C:\vcpkg vcpkgGitCommitId: ${{ env.VCPKG_COMMIT_ID }} doNotCache: false - name: Install vcpkg dependencies + env: + VCPKG_DEFAULT_HOST_TRIPLET: ${{ matrix.job.vcpkg-triplet }} run: | - case ${{ matrix.job.target }} in - aarch64-linux-android) - ANDROID_TARGET=arm64-v8a - ;; - esac - if ! ./flutter/build_android_deps.sh "${ANDROID_TARGET}"; then + 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 "======" @@ -159,112 +141,152 @@ jobs: fi shell: bash - - name: Restore bridge files - uses: actions/download-artifact@master - with: - name: bridge-artifact - path: ./ - - - name: Install Rust toolchain - uses: dtolnay/rust-toolchain@v1 - with: - toolchain: ${{ env.RUST_VERSION }} - components: "rustfmt" - - - uses: Swatinem/rust-cache@v2 - with: - prefix-key: rustdesk-lib-cache-android # TODO: drop '-android' part after caches are invalidated - key: ${{ matrix.job.target }} - - - name: fix android for flutter 3.13 - if: $${{ env.ANDROID_FLUTTER_VERSION == '3.13.9' }} + - name: Build rustdesk run: | - sed -i 's/uni_links_desktop/#uni_links_desktop/g' flutter/pubspec.yaml - cd flutter/lib - find . | grep dart | xargs sed -i 's/textScaler: TextScaler.linear(\(.*\)),/textScaleFactor: \1,/g' + Invoke-WebRequest -Uri https://github.com/rustdesk-org/rdev/releases/download/usbmmidd_v2/usbmmidd_v2.zip -OutFile usbmmidd_v2.zip + Expand-Archive usbmmidd_v2.zip -DestinationPath . + python3 .\build.py --portable --hwcodec --flutter --vram --skip-portable-pack + Remove-Item -Path usbmmidd_v2\Win32 -Recurse + Remove-Item -Path "usbmmidd_v2\deviceinstaller64.exe", "usbmmidd_v2\deviceinstaller.exe", "usbmmidd_v2\usbmmidd.bat" + mv ./flutter/build/windows/x64/runner/Release ./rustdesk + mv -Force .\usbmmidd_v2 ./rustdesk - - name: Build rustdesk lib - env: - ANDROID_NDK_HOME: ${{ steps.setup-ndk.outputs.ndk-path }} - ANDROID_NDK_ROOT: ${{ steps.setup-ndk.outputs.ndk-path }} + - name: find Runner.res + # Windows: find Runner.res (compiled from ./flutter/windows/runner/Runner.rc), copy to ./Runner.res + # Runner.rc does not contain actual version, but Runner.res does + continue-on-error: true + shell: bash run: | - rustup target add ${{ matrix.job.target }} - cargo install cargo-ndk --version ${{ env.CARGO_NDK_VERSION }} - case ${{ matrix.job.target }} in - aarch64-linux-android) - ./flutter/ndk_arm64.sh - mkdir -p ./flutter/android/app/src/main/jniLibs/arm64-v8a - cp ./target/${{ matrix.job.target }}/release/liblibrustdesk.so ./flutter/android/app/src/main/jniLibs/arm64-v8a/librustdesk.so - ;; - esac + runner_res=$(find . -name "Runner.res"); + if [ "$runner_res" == "" ]; then + echo "Runner.res: not found"; + else + echo "Runner.res: $runner_res"; + cp $runner_res ./libs/portable/Runner.res; + echo "list ./libs/portable/Runner.res"; + ls -l ./libs/portable/Runner.res; + fi - - name: Upload Rustdesk library to Artifacts + - name: Download RustDeskTempTopMostWindow artifacts + uses: actions/download-artifact@master + if: ${{ inputs.upload-artifact }} + with: + name: topmostwindow-artifacts + path: "./rustdesk" + + - name: Upload unsigned + if: env.UPLOAD_ARTIFACT == 'true' uses: actions/upload-artifact@master with: - name: librustdesk.so.${{ matrix.job.target }} - path: ./target/${{ matrix.job.target }}/release/liblibrustdesk.so + name: rustdesk-unsigned-windows-${{ matrix.job.arch }} + path: rustdesk - - name: Build rustdesk + - name: Sign rustdesk files + if: env.UPLOAD_ARTIFACT == 'true' && env.SIGN_BASE_URL != '' shell: bash - env: - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64 run: | - export PATH=/usr/lib/jvm/java-11-openjdk-amd64/bin:$PATH - # temporary use debug sign config - sed -i "s/signingConfigs.release/signingConfigs.debug/g" ./flutter/android/app/build.gradle - case ${{ matrix.job.target }} in - aarch64-linux-android) - mkdir -p ./flutter/android/app/src/main/jniLibs/arm64-v8a - cp ${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/libc++_shared.so ./flutter/android/app/src/main/jniLibs/arm64-v8a/ - cp ./target/${{ matrix.job.target }}/release/liblibrustdesk.so ./flutter/android/app/src/main/jniLibs/arm64-v8a/librustdesk.so - # build flutter - pushd flutter - flutter build apk "--${{ matrix.job.reltype }}" --target-platform android-arm64 --split-per-abi - mv build/app/outputs/flutter-apk/app-arm64-v8a-${{ matrix.job.reltype }}.apk ../rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}${{ matrix.job.suffix }}.apk - ;; - - esac + pip3 install requests argparse + BASE_URL=${{ secrets.SIGN_BASE_URL }} SECRET_KEY=${{ secrets.SIGN_SECRET_KEY }} python3 res/job.py sign_files ./rustdesk/ + + - name: Build self-extracted executable + shell: bash + if: env.UPLOAD_ARTIFACT == 'true' + run: | + sed -i '/dpiAware/d' res/manifest.xml + pushd ./libs/portable + pip3 install -r requirements.txt + python3 ./generate.py -f ../../rustdesk/ -o . -e ../../rustdesk/rustdesk.exe popd - mkdir -p signed-apk; pushd signed-apk - mv ../rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}${{ matrix.job.suffix }}.apk . + mkdir -p ./SignOutput + mv ./target/release/rustdesk-portable-packer.exe ./SignOutput/rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.exe - - uses: r0adkll/sign-android-release@v1 - name: Sign app APK - if: env.ANDROID_SIGNING_KEY != null - id: sign-rustdesk - with: - releaseDirectory: ./signed-apk - signingKeyBase64: ${{ secrets.ANDROID_SIGNING_KEY }} - alias: ${{ secrets.ANDROID_ALIAS }} - keyStorePassword: ${{ secrets.ANDROID_KEY_STORE_PASSWORD }} - keyPassword: ${{ secrets.ANDROID_KEY_PASSWORD }} - env: - # override default build-tools version (29.0.3) -- optional - BUILD_TOOLS_VERSION: "30.0.2" + - name: Add MSBuild to PATH + uses: microsoft/setup-msbuild@v2 - - name: Upload Artifacts - if: env.ANDROID_SIGNING_KEY != null && env.UPLOAD_ARTIFACT == 'true' - uses: actions/upload-artifact@master - with: - name: rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.apk - path: ${{steps.sign-rustdesk.outputs.signedReleaseFile}} + - name: Build msi + if: env.UPLOAD_ARTIFACT == 'true' + run: | + pushd ./res/msi + python preprocess.py --arp -d ../../rustdesk + nuget restore msi.sln + msbuild msi.sln -p:Configuration=Release -p:Platform=x64 /p:TargetVersion=Windows10 + mv ./Package/bin/x64/Release/en-us/Package.msi ../../SignOutput/rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.msi + sha256sum ../../SignOutput/rustdesk-*.msi - - name: Publish signed apk package - if: env.ANDROID_SIGNING_KEY != null && env.UPLOAD_ARTIFACT == 'true' + - name: Sign rustdesk self-extracted file + if: env.UPLOAD_ARTIFACT == 'true' && env.SIGN_BASE_URL != '' + shell: bash + run: | + BASE_URL=${{ secrets.SIGN_BASE_URL }} SECRET_KEY=${{ secrets.SIGN_SECRET_KEY }} python3 res/job.py sign_files ./SignOutput + + - name: Publish Release uses: softprops/action-gh-release@v1 + if: env.UPLOAD_ARTIFACT == 'true' with: prerelease: true tag_name: ${{ env.TAG_NAME }} files: | - ${{steps.sign-rustdesk.outputs.signedReleaseFile}} + ./SignOutput/rustdesk-*.msi + ./SignOutput/rustdesk-*.exe + if: False + name: build-rustdesk-web + runs-on: ubuntu-20.04 + strategy: + fail-fast: false + env: + RELEASE_NAME: web-basic + steps: + - name: Checkout source code + uses: actions/checkout@v4 - - name: Publish unsigned apk package - if: env.ANDROID_SIGNING_KEY == null && env.UPLOAD_ARTIFACT == 'true' + - name: Prepare env + run: | + sudo apt-get update -y + sudo apt-get install -y wget npm + + - name: Install flutter + uses: subosito/flutter-action@v2.12.0 #https://github.com/subosito/flutter-action/issues/277 + with: + channel: "stable" + flutter-version: ${{ env.FLUTTER_VERSION }} + cache: true + + # https://rustdesk.com/docs/en/dev/build/web/ + - name: Build web + shell: bash + run: | + pushd flutter/web/js + npm install yarn -g + npm install typescript -g + npm install protoc -g + # Install protoc first, see: https://google.github.io/proto-lens/installing-protoc.html + npm install ts-proto + # Only works with vite <= 2.8, see: https://github.com/vitejs/vite/blob/main/docs/guide/build.md#chunking-strategy + npm install vite@2.8 + yarn install && yarn build + popd + + pushd flutter/web + wget https://github.com/rustdesk/doc.rustdesk.com/releases/download/console/web_deps.tar.gz + tar xzf web_deps.tar.gz + popd + + pushd flutter + flutter build web --release + cd build + cp ../web/README.md web + # TODO: Remove the following line when the web is almost complete. + echo -e "\n\nThis build is for preview and not full functionality." >> web/README.md + dir_name="rustdesk-${{ env.VERSION }}-${{ env.RELEASE_NAME }}" + mv web "${dir_name}" && tar czf "${dir_name}".tar.gz "${dir_name}" + sha256sum "${dir_name}".tar.gz + popd + + - name: Publish web + if: env.UPLOAD_ARTIFACT == 'true' uses: softprops/action-gh-release@v1 with: prerelease: true tag_name: ${{ env.TAG_NAME }} files: | - signed-apk/rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.apk - - + flutter/build/rustdesk-${{ env.VERSION }}-${{ env.RELEASE_NAME }}.tar.gz