From 130deb8e2217b7308b6ce672fbf3bf5fc3ac0125 Mon Sep 17 00:00:00 2001 From: rustdesk Date: Sun, 17 Mar 2024 11:17:23 +0800 Subject: [PATCH] add build arm64 macos --- .github/workflows/build-macos-arm64.yml | 93 +++++++++++++++++++++++++ .github/workflows/flutter-build.yml | 57 +++++++++++++++ 2 files changed, 150 insertions(+) create mode 100644 .github/workflows/build-macos-arm64.yml diff --git a/.github/workflows/build-macos-arm64.yml b/.github/workflows/build-macos-arm64.yml new file mode 100644 index 000000000..a593ba365 --- /dev/null +++ b/.github/workflows/build-macos-arm64.yml @@ -0,0 +1,93 @@ +on: + workflow_call: + inputs: + upload-artifact: + type: boolean + default: true + upload-tag: + type: string + default: "nightly" + +env: + CARGO_NDK_VERSION: "3.1.2" + LLVM_VERSION: "15.0.6" + FLUTTER_VERSION: "3.16.9" + FLUTTER_RUST_BRIDGE_VERSION: "1.80.1" + # for arm64 linux because official Dart SDK does not work + FLUTTER_ELINUX_VERSION: "3.16.9" + FLUTTER_ELINUX_COMMIT_ID: "c02bd16e1630f5bd690b85c5c2456ac1920e25af" + TAG_NAME: "${{ inputs.upload-tag }}" + VCPKG_BINARY_SOURCES: "clear;x-gha,readwrite" + # vcpkg version: 2023.10.19 + # for multiarch gcc compatibility + VCPKG_COMMIT_ID: "8eb57355a4ffb410a2e94c07b4dca2dffbee8e50" + VERSION: "1.2.4" + NDK_VERSION: "r26b" + #signing keys env variable checks + ANDROID_SIGNING_KEY: '${{ secrets.ANDROID_SIGNING_KEY }}' + MACOS_P12_BASE64: '${{ secrets.MACOS_P12_BASE64 }}' + # To make a custom build with your own servers set the below secret values + RS_PUB_KEY: '${{ secrets.RS_PUB_KEY }}' + RENDEZVOUS_SERVER: '${{ secrets.RENDEZVOUS_SERVER }}' + API_SERVER: '${{ secrets.API_SERVER }}' + UPLOAD_ARTIFACT: "${{ inputs.upload-artifact }}" + SIGN_BASE_URL: "${{ secrets.SIGN_BASE_URL }}" + +jobs: + build-for-macOS-arm64: + name: build-for-macOS-arm64 + runs-on: [self-hosted, macOS, ARM64] + steps: + - 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: Checkout source code + uses: actions/checkout@v3 + + - name: Install flutter rust bridge deps + shell: bash + run: | + cargo install flutter_rust_bridge_codegen --version ${{ env.FLUTTER_RUST_BRIDGE_VERSION }} --features "uuid" + pushd flutter && flutter pub get && popd + ~/.cargo/bin/flutter_rust_bridge_codegen --rust-input ./src/flutter_ffi.rs --dart-output ./flutter/lib/generated_bridge.dart --c-output ./flutter/macos/Runner/bridge_generated.h + + - name: Build rustdesk + run: | + # --hwcodec not supported on macos yet + ./build.py --flutter + + - name: Codesign app and create signed dmg + if: env.MACOS_P12_BASE64 != null && env.UPLOAD_ARTIFACT == 'true' + run: | + # Patch create-dmg to give more attempts to unmount image + CREATE_DMG="$(command -v create-dmg)" + CREATE_DMG="$(readlink -f "$CREATE_DMG")" + sed -i -e 's/MAXIMUM_UNMOUNTING_ATTEMPTS=3/MAXIMUM_UNMOUNTING_ATTEMPTS=7/' "$CREATE_DMG" + # start sign the rustdesk.app and dmg + rm rustdesk-${{ env.VERSION }}.dmg || true + codesign --force --options runtime -s ${{ secrets.MACOS_CODESIGN_IDENTITY }} --deep --strict ./flutter/build/macos/Build/Products/Release/RustDesk.app -vvv + create-dmg --icon "RustDesk.app" 200 190 --hide-extension "RustDesk.app" --window-size 800 400 --app-drop-link 600 185 rustdesk-${{ env.VERSION }}.dmg ./flutter/build/macos/Build/Products/Release/RustDesk.app + codesign --force --options runtime -s ${{ secrets.MACOS_CODESIGN_IDENTITY }} --deep --strict rustdesk-${{ env.VERSION }}.dmg -vvv + # notarize the rustdesk-${{ env.VERSION }}.dmg + rcodesign notary-submit --api-key-path ~/.p12/api-key.json --staple rustdesk-${{ env.VERSION }}.dmg + + - name: Rename rustdesk + if: env.UPLOAD_ARTIFACT == 'true' + run: | + for name in rustdesk*??.dmg; do + mv "$name" "${name%%.dmg}-aarch64.dmg" + done + + - name: Publish DMG package + if: env.UPLOAD_ARTIFACT == 'true' + uses: softprops/action-gh-release@v1 + with: + prerelease: true + tag_name: ${{ env.TAG_NAME }} + files: | + rustdesk*-aarch64.dmg + diff --git a/.github/workflows/flutter-build.yml b/.github/workflows/flutter-build.yml index c1e5ed89f..5676b6ccd 100644 --- a/.github/workflows/flutter-build.yml +++ b/.github/workflows/flutter-build.yml @@ -301,6 +301,63 @@ jobs: ./SignOutput/rustdesk-*.exe ./rustdesk-*.tar.gz + build-for-macOS-arm64: + name: build-for-macOS-arm64 + runs-on: [self-hosted, macOS, ARM64] + steps: + - 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: Checkout source code + uses: actions/checkout@v3 + + - name: Install flutter rust bridge deps + shell: bash + run: | + cargo install flutter_rust_bridge_codegen --version ${{ env.FLUTTER_RUST_BRIDGE_VERSION }} --features "uuid" + pushd flutter && flutter pub get && popd + ~/.cargo/bin/flutter_rust_bridge_codegen --rust-input ./src/flutter_ffi.rs --dart-output ./flutter/lib/generated_bridge.dart --c-output ./flutter/macos/Runner/bridge_generated.h + + - name: Build rustdesk + run: | + # --hwcodec not supported on macos yet + ./build.py --flutter + + - name: Codesign app and create signed dmg + if: env.MACOS_P12_BASE64 != null && env.UPLOAD_ARTIFACT == 'true' + run: | + # Patch create-dmg to give more attempts to unmount image + CREATE_DMG="$(command -v create-dmg)" + CREATE_DMG="$(readlink -f "$CREATE_DMG")" + sed -i -e 's/MAXIMUM_UNMOUNTING_ATTEMPTS=3/MAXIMUM_UNMOUNTING_ATTEMPTS=7/' "$CREATE_DMG" + # start sign the rustdesk.app and dmg + rm rustdesk-${{ env.VERSION }}.dmg || true + codesign --force --options runtime -s ${{ secrets.MACOS_CODESIGN_IDENTITY }} --deep --strict ./flutter/build/macos/Build/Products/Release/RustDesk.app -vvv + create-dmg --icon "RustDesk.app" 200 190 --hide-extension "RustDesk.app" --window-size 800 400 --app-drop-link 600 185 rustdesk-${{ env.VERSION }}.dmg ./flutter/build/macos/Build/Products/Release/RustDesk.app + codesign --force --options runtime -s ${{ secrets.MACOS_CODESIGN_IDENTITY }} --deep --strict rustdesk-${{ env.VERSION }}.dmg -vvv + # notarize the rustdesk-${{ env.VERSION }}.dmg + rcodesign notary-submit --api-key-path ~/.p12/api-key.json --staple rustdesk-${{ env.VERSION }}.dmg + + - name: Rename rustdesk + if: env.UPLOAD_ARTIFACT == 'true' + run: | + for name in rustdesk*??.dmg; do + mv "$name" "${name%%.dmg}-aarch64.dmg" + done + + - name: Publish DMG package + if: env.UPLOAD_ARTIFACT == 'true' + uses: softprops/action-gh-release@v1 + with: + prerelease: true + tag_name: ${{ env.TAG_NAME }} + files: | + rustdesk*-aarch64.dmg + build-for-macOS: name: ${{ matrix.job.target }} (${{ matrix.job.os }}) [${{ matrix.job.extra-build-args }}] runs-on: ${{ matrix.job.os }}