1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101 |
- name: Build the flutter version of the RustDesk
- on:
- workflow_call:
- inputs:
- upload-artifact:
- type: boolean
- default: true
- upload-tag:
- type: string
- default: "nightly"
- # NOTE: F-Droid builder script 'flutter/build_fdroid.sh' reads environment
- # variables from this workflow!
- #
- # It does NOT read build steps, however, so please fix 'flutter/build_fdroid.sh
- # whenever you add changes to Android CI build action ('build-rustdesk-android')
- # in this file!
- 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.4"
- ANDROID_FLUTTER_VERSION: "3.24.4"
- # 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: "1de2026f28ead93ff1773e6e680387643e914ea1"
- VERSION: "1.3.3"
- NDK_VERSION: "r27b"
- #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:
- generate-bridge:
- uses: ./.github/workflows/bridge.yml
- 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, generate-bridge]
- 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 }
- - {
- 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: 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@v4
- - name: Restore bridge files
- uses: actions/download-artifact@master
- with:
- name: bridge-artifact
- path: ./
- - name: Install LLVM and Clang
- uses: KyleMayes/install-llvm-action@v1
- with:
- version: ${{ env.LLVM_VERSION }}
- - 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 }}
- # https://github.com/flutter/flutter/issues/155685
- - name: Replace engine with rustdesk custom flutter engine
- run: |
- flutter doctor -v
- flutter precache --windows
- Invoke-WebRequest -Uri https://github.com/rustdesk/engine/releases/download/main/windows-x64-release.zip -OutFile windows-x64-release.zip
- Expand-Archive -Path windows-x64-release.zip -DestinationPath windows-x64-release
- mv -Force windows-x64-release/* C:/hostedtoolcache/windows/flutter/stable-${{ env.FLUTTER_VERSION }}-x64/bin/cache/artifacts/engine/windows-x64-release/
- - name: Patch flutter
- shell: bash
- run: |
- cp .github/patches/flutter_3.24.4_dropdown_menu_enableFilter.diff $(dirname $(dirname $(which flutter)))
- cd $(dirname $(dirname $(which flutter)))
- [[ "3.24.4" == ${{env.FLUTTER_VERSION}} ]] && git apply flutter_3.24.4_dropdown_menu_enableFilter.diff
- - name: Install Rust toolchain
- uses: dtolnay/rust-toolchain@v1
- with:
- toolchain: ${{ env.SCITER_RUST_VERSION }}
- targets: ${{ matrix.job.target }}
- components: "rustfmt"
- - uses: Swatinem/rust-cache@v2
- with:
- prefix-key: ${{ matrix.job.os }}
- - name: Setup vcpkg with Github Actions binary cache
- uses: lukka/run-vcpkg@v11
- with:
- vcpkgDirectory: C:\vcpkg
- vcpkgGitCommitId: ${{ env.VCPKG_COMMIT_ID }}
- doNotCache: false
- - name: Install vcpkg dependencies
- env:
- VCPKG_DEFAULT_HOST_TRIPLET: ${{ matrix.job.vcpkg-triplet }}
- run: |
- 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
- shell: bash
- - name: Build rustdesk
- run: |
- 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: 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: |
- 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: 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: rustdesk-unsigned-windows-${{ matrix.job.arch }}
- path: rustdesk
- - name: Sign rustdesk files
- if: env.UPLOAD_ARTIFACT == 'true' && env.SIGN_BASE_URL != ''
- shell: bash
- run: |
- 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 ./SignOutput
- mv ./target/release/rustdesk-portable-packer.exe ./SignOutput/rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.exe
- - name: Add MSBuild to PATH
- uses: microsoft/setup-msbuild@v2
- - 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: 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: |
- ./SignOutput/rustdesk-*.msi
- ./SignOutput/rustdesk-*.exe
- # The fallback for the flutter version, we use Sciter for 32bit Windows.
- build-for-windows-sciter:
- name: ${{ matrix.job.target }} (${{ matrix.job.os }})
- runs-on: ${{ matrix.job.os }}
- # Temporarily disable this action due to additional test is needed.
- # if: false
- strategy:
- fail-fast: false
- matrix:
- job:
- # - { target: i686-pc-windows-msvc , os: windows-2022 }
- # - { target: x86_64-pc-windows-gnu , os: windows-2022 }
- - {
- target: i686-pc-windows-msvc,
- os: windows-2022,
- arch: x86,
- vcpkg-triplet: x86-windows-static,
- }
- # - { target: aarch64-pc-windows-msvc, os: windows-2022 }
- 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@v4
- - name: Install LLVM and Clang
- uses: rustdesk-org/install-llvm-action-32bit@master
- with:
- version: ${{ env.LLVM_VERSION }}
- - name: Install Rust toolchain
- uses: dtolnay/rust-toolchain@v1
- with:
- toolchain: nightly-2023-10-13-${{ matrix.job.target }} # must use nightly here, because of abi_thiscall feature required
- targets: ${{ matrix.job.target }}
- components: "rustfmt"
- - uses: Swatinem/rust-cache@v2
- with:
- prefix-key: ${{ matrix.job.os }}-sciter
- - name: Setup vcpkg with Github Actions binary cache
- uses: lukka/run-vcpkg@v11
- with:
- vcpkgDirectory: C:\vcpkg
- vcpkgGitCommitId: ${{ env.VCPKG_COMMIT_ID }}
- doNotCache: false
- - name: Install vcpkg dependencies
- env:
- VCPKG_DEFAULT_HOST_TRIPLET: ${{ matrix.job.vcpkg-triplet }}
- run: |
- 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
- shell: bash
- - name: Build rustdesk
- id: build
- shell: bash
- run: |
- python3 res/inline-sciter.py
- # Patch sciter x86
- sed -i 's/branch = "dyn"/branch = "dyn_x86"/g' ./Cargo.toml
- cargo build --features inline,vram,hwcodec --release --bins
- mkdir -p ./Release
- mv ./target/release/rustdesk.exe ./Release/rustdesk.exe
- curl -LJ -o ./Release/sciter.dll https://github.com/c-smile/sciter-sdk/raw/master/bin.win/x32/sciter.dll
- echo "output_folder=./Release" >> $GITHUB_OUTPUT
- curl -LJ -o ./usbmmidd_v2.zip https://github.com/rustdesk-org/rdev/releases/download/usbmmidd_v2/usbmmidd_v2.zip
- unzip usbmmidd_v2.zip
- # Do not remove x64 files, because the user may run the 32bit version on a 64bit system.
- # Do not remove ./usbmmidd_v2/deviceinstaller64.exe, as x86 exe cannot install and uninstall drivers when running on x64,
- # we need the x64 exe to install and uninstall the driver.
- rm -rf ./usbmmidd_v2/deviceinstaller.exe ./usbmmidd_v2/usbmmidd.bat
- mv ./usbmmidd_v2 ./Release || true
- - 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: |
- 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: Sign rustdesk files
- if: env.UPLOAD_ARTIFACT == 'true' && env.SIGN_BASE_URL != ''
- shell: bash
- run: |
- pip3 install requests argparse
- BASE_URL=${{ secrets.SIGN_BASE_URL }} SECRET_KEY=${{ secrets.SIGN_SECRET_KEY }} python3 res/job.py sign_files ./Release/
- - name: Build self-extracted executable
- shell: bash
- run: |
- sed -i '/dpiAware/d' res/manifest.xml
- pushd ./libs/portable
- pip3 install -r requirements.txt
- python3 ./generate.py -f ../../Release/ -o . -e ../../Release/rustdesk.exe
- popd
- mkdir -p ./SignOutput
- mv ./target/release/rustdesk-portable-packer.exe ./SignOutput/rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}-sciter.exe
- - 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: |
- ./SignOutput/rustdesk-*.exe
- build-for-macOS-arm64-selfhost:
- # use build-for-macOS instead
- if: false
- runs-on: [self-hosted, macOS, ARM64]
- needs: [generate-bridge]
- 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@v4
- - name: Restore bridge files
- uses: actions/download-artifact@master
- with:
- name: bridge-artifact
- path: ./
- - name: Build rustdesk
- run: |
- ./build.py --flutter --hwcodec
- - name: create unsigned dmg
- if: env.UPLOAD_ARTIFACT == 'true'
- run: |
- 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"
- create-dmg --icon "RustDesk.app" 200 190 --hide-extension "RustDesk.app" --window-size 800 400 --app-drop-link 600 185 rustdesk-${{ env.VERSION }}-arm64.dmg ./flutter/build/macos/Build/Products/Release/RustDesk.app
- - name: Upload unsigned macOS app
- if: env.UPLOAD_ARTIFACT == 'true'
- uses: actions/upload-artifact@master
- with:
- name: rustdesk-unsigned-macos-arm64
- path: rustdesk-${{ env.VERSION }}-arm64.dmg # can not upload the directory directly or tar.gz file, which destroy the link structure, causing the codesign failed
- - 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 -rf *.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-rustdesk-ios:
- if: ${{ inputs.upload-artifact }}
- name: build rustdesk ios ipa
- runs-on: ${{ matrix.job.os }}
- needs: [generate-bridge]
- strategy:
- fail-fast: false
- matrix:
- job:
- - {
- arch: aarch64,
- target: aarch64-apple-ios,
- os: macos-13,
- vcpkg-triplet: arm64-ios,
- }
- 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: Install dependencies
- run: |
- brew install nasm yasm
- - name: Checkout source code
- uses: actions/checkout@v4
- - name: Install flutter
- uses: subosito/flutter-action@v2
- with:
- channel: "stable"
- flutter-version: ${{ env.FLUTTER_VERSION }}
- - name: Patch flutter
- run: |
- cd $(dirname $(dirname $(which flutter)))
- [[ "3.24.4" == ${{env.FLUTTER_VERSION}} ]] && git apply ${{ github.workspace }}/.github/patches/flutter_3.24.4_dropdown_menu_enableFilter.diff
- - name: Setup vcpkg with Github Actions binary cache
- uses: lukka/run-vcpkg@v11
- with:
- vcpkgGitCommitId: ${{ env.VCPKG_COMMIT_ID }}
- doNotCache: false
- - name: Install vcpkg dependencies
- run: |
- 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
- shell: bash
- - name: Install Rust toolchain
- uses: dtolnay/rust-toolchain@v1
- with:
- toolchain: ${{ env.RUST_VERSION }}
- targets: ${{ matrix.job.target }}
- components: "rustfmt"
- - uses: Swatinem/rust-cache@v2
- with:
- prefix-key: rustdesk-lib-cache-ios
- key: ${{ matrix.job.target }}
- - name: Restore bridge files
- uses: actions/download-artifact@master
- with:
- name: bridge-artifact
- path: ./
- - name: Build rustdesk lib
- run: |
- rustup target add ${{ matrix.job.target }}
- cargo build --features flutter,hwcodec --release --target aarch64-apple-ios --lib
- - name: Build rustdesk
- shell: bash
- run: |
- pushd flutter
- # flutter build ipa --release --obfuscate --split-debug-info=./split-debug-info --no-codesign
- # for easy debugging
- flutter build ipa --release --no-codesign
- # - 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: flutter/build/ios/ipa/*.ipa
- # - name: Publish ipa package
- # # if: env.ANDROID_SIGNING_KEY != null && env.UPLOAD_ARTIFACT == 'true'
- # uses: softprops/action-gh-release@v1
- # with:
- # prerelease: true
- # tag_name: ${{ env.TAG_NAME }}
- # files: |
- # flutter/build/ios/ipa/*.ipa
- build-rustdesk-ios-selfhost:
- #if: ${{ inputs.upload-artifact }}
- if: false
- runs-on: [self-hosted, macOS, ARM64]
- needs: [generate-bridge]
- strategy:
- fail-fast: false
- 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@v4
- # $VCPKG_ROOT/vcpkg install --triplet arm64-ios --x-install-root="$VCPKG_ROOT/installed"
- - name: Restore bridge files
- uses: actions/download-artifact@master
- with:
- name: bridge-artifact
- path: ./
- - name: Build rustdesk lib
- run: |
- cargo build --features flutter,hwcodec --release --target aarch64-apple-ios --lib
- - name: Build rustdesk
- # ios sdk not installed on this machine, I will install it later after I am back home
- if: false
- shell: bash
- run: |
- pushd flutter
- # flutter build ipa --release --obfuscate --split-debug-info=./split-debug-info --no-codesign
- # for easy debugging
- flutter build ipa --release --no-codesign
- # - 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: flutter/build/ios/ipa/*.ipa
- # - name: Publish ipa package
- # # if: env.ANDROID_SIGNING_KEY != null && env.UPLOAD_ARTIFACT == 'true'
- # uses: softprops/action-gh-release@v1
- # with:
- # prerelease: true
- # tag_name: ${{ env.TAG_NAME }}
- # files: |
- # flutter/build/ios/ipa/*.ipa
- build-for-macOS:
- name: ${{ matrix.job.target }}
- runs-on: ${{ matrix.job.os }}
- needs: [generate-bridge]
- strategy:
- fail-fast: false
- matrix:
- job:
- - {
- target: x86_64-apple-darwin,
- os: macos-13, #macos-latest or macos-14 use M1 now, https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners/about-github-hosted-runners#:~:text=14%20GB-,macos%2Dlatest%20or%20macos%2D14,-The%20macos%2Dlatestlabel
- extra-build-args: "",
- arch: x86_64,
- }
- - {
- target: aarch64-apple-darwin,
- os: macos-latest,
- # extra-build-args: "--disable-flutter-texture-render", # disable this for mac, because we see a lot of users reporting flickering both on arm and x64, and we can not confirm if texture rendering has better performance if htere is no vram, https://github.com/rustdesk/rustdesk/issues/6296
- extra-build-args: "",
- arch: aarch64,
- }
- 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@v4
- - name: Import the codesign cert
- if: env.MACOS_P12_BASE64 != null
- uses: apple-actions/import-codesign-certs@v1
- with:
- p12-file-base64: ${{ secrets.MACOS_P12_BASE64 }}
- p12-password: ${{ secrets.MACOS_P12_PASSWORD }}
- keychain: rustdesk
- - name: Check sign and import sign key
- if: env.MACOS_P12_BASE64 != null
- run: |
- security default-keychain -s rustdesk.keychain
- security find-identity -v
- - name: Import notarize key
- if: env.MACOS_P12_BASE64 != null
- uses: timheuer/base64-to-file@v1.2
- with:
- # https://gregoryszorc.com/docs/apple-codesign/stable/apple_codesign_rcodesign.html#notarizing-and-stapling
- fileName: rustdesk.json
- fileDir: ${{ github.workspace }}
- encodedString: ${{ secrets.MACOS_NOTARIZE_JSON }}
- - name: Install rcodesign tool
- if: env.MACOS_P12_BASE64 != null
- shell: bash
- run: |
- pushd /tmp
- wget https://github.com/indygreg/apple-platform-rs/releases/download/apple-codesign%2F0.22.0/apple-codesign-0.22.0-macos-universal.tar.gz
- tar -zxvf apple-codesign-0.22.0-macos-universal.tar.gz
- mv apple-codesign-0.22.0-macos-universal/rcodesign /usr/local/bin
- popd
- - name: Install build runtime
- run: |
- brew install llvm create-dmg nasm cmake gcc wget ninja pkg-config
- - name: Install flutter
- uses: subosito/flutter-action@v2
- with:
- channel: "stable"
- flutter-version: ${{ env.FLUTTER_VERSION }}
- - name: Patch flutter
- run: |
- cd $(dirname $(dirname $(which flutter)))
- [[ "3.24.4" == ${{env.FLUTTER_VERSION}} ]] && git apply ${{ github.workspace }}/.github/patches/flutter_3.24.4_dropdown_menu_enableFilter.diff
- - name: Workaround for flutter issue
- shell: bash
- run: |
- cd "$(dirname "$(which flutter)")"
- # https://github.com/flutter/flutter/issues/133533
- sed -i -e 's/_setFramesEnabledState(false);/\/\/_setFramesEnabledState(false);/g' ../packages/flutter/lib/src/scheduler/binding.dart
- grep -n '_setFramesEnabledState(false);' ../packages/flutter/lib/src/scheduler/binding.dart
- - name: Install Rust toolchain
- uses: dtolnay/rust-toolchain@v1
- with:
- toolchain: ${{ env.RUST_VERSION }}
- targets: ${{ matrix.job.target }}
- components: "rustfmt"
- - uses: Swatinem/rust-cache@v2
- with:
- prefix-key: ${{ matrix.job.os }}
- - name: Restore bridge files
- uses: actions/download-artifact@master
- with:
- name: bridge-artifact
- path: ./
- - name: Setup vcpkg with Github Actions binary cache
- uses: lukka/run-vcpkg@v11
- with:
- vcpkgGitCommitId: ${{ env.VCPKG_COMMIT_ID }}
- doNotCache: false
- - name: Install vcpkg dependencies
- run: |
- if ! $VCPKG_ROOT/vcpkg \
- install \
- --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
- - name: Show version information (Rust, cargo, Clang)
- shell: bash
- run: |
- clang --version || true
- rustup -V
- rustup toolchain list
- rustup default
- cargo -V
- rustc -V
- - name: Build rustdesk
- run: |
- ./build.py --flutter --hwcodec ${{ matrix.job.extra-build-args }}
- - name: create unsigned dmg
- if: env.UPLOAD_ARTIFACT == 'true'
- run: |
- 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"
- create-dmg --icon "RustDesk.app" 200 190 --hide-extension "RustDesk.app" --window-size 800 400 --app-drop-link 600 185 rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.dmg ./flutter/build/macos/Build/Products/Release/RustDesk.app
- - name: Upload unsigned macOS app
- if: env.UPLOAD_ARTIFACT == 'true'
- uses: actions/upload-artifact@master
- with:
- name: rustdesk-unsigned-macos-${{ matrix.job.arch }}
- path: rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.dmg # can not upload the directory directly or tar.gz, which destroy the link structure, causing the codesign failed
- - 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"
- # Unlock keychain
- security default-keychain -s rustdesk.keychain
- security unlock-keychain -p ${{ secrets.MACOS_P12_PASSWORD }} rustdesk.keychain
- # start sign the rustdesk.app and dmg
- rm -rf *.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 ${{ github.workspace }}/rustdesk.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}-${{ matrix.job.arch }}.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*-${{ matrix.job.arch }}.dmg
- publish_unsigned:
- needs:
- - build-for-macOS
- - build-for-windows-flutter
- runs-on: ubuntu-latest
- if: ${{ inputs.upload-artifact }}
- steps:
- - name: Download artifacts
- uses: actions/download-artifact@master
- with:
- name: rustdesk-unsigned-macos-x86_64
- path: ./
- - name: Download Artifacts
- uses: actions/download-artifact@master
- with:
- name: rustdesk-unsigned-macos-aarch64
- path: ./
- - name: Download Artifacts
- uses: actions/download-artifact@master
- with:
- name: rustdesk-unsigned-windows-x86_64
- path: ./windows-x86_64/
- - name: Combine unsigned app
- run: |
- tar czf rustdesk-${{ env.VERSION }}-unsigned.tar.gz *.dmg windows-x86_64
- - name: Publish unsigned app
- uses: softprops/action-gh-release@v1
- with:
- prerelease: true
- tag_name: ${{ env.TAG_NAME }}
- files: rustdesk-${{ env.VERSION }}-unsigned.tar.gz
- build-rustdesk-android:
- needs: [generate-bridge]
- name: build rustdesk android apk ${{ matrix.job.target }}
- runs-on: ${{ matrix.job.os }}
- strategy:
- fail-fast: false
- matrix:
- job:
- - {
- arch: aarch64,
- target: aarch64-linux-android,
- os: ubuntu-20.04,
- reltype: release,
- suffix: "",
- }
- - {
- arch: armv7,
- target: armv7-linux-androideabi,
- os: ubuntu-20.04,
- reltype: release,
- suffix: "",
- }
- - {
- arch: x86_64,
- target: x86_64-linux-android,
- os: ubuntu-20.04,
- reltype: release,
- suffix: "",
- }
- 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:
- script: |
- 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 \
- libayatana-appindicator3-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-17-jdk-headless \
- pkg-config \
- tree \
- wget
- - name: Checkout source code
- uses: actions/checkout@v4
- - name: Install flutter
- uses: subosito/flutter-action@v2
- with:
- channel: "stable"
- flutter-version: ${{ env.ANDROID_FLUTTER_VERSION }}
- - name: Patch flutter
- run: |
- cd $(dirname $(dirname $(which flutter)))
- [[ "3.24.4" == ${{env.ANDROID_FLUTTER_VERSION}} ]] && git apply ${{ github.workspace }}/.github/patches/flutter_3.24.4_dropdown_menu_enableFilter.diff
- - uses: nttld/setup-ndk@v1
- id: setup-ndk
- with:
- ndk-version: ${{ env.NDK_VERSION }}
- add-to-path: true
- - name: Setup vcpkg with Github Actions binary cache
- uses: lukka/run-vcpkg@v11
- with:
- vcpkgDirectory: /opt/artifacts/vcpkg
- vcpkgGitCommitId: ${{ env.VCPKG_COMMIT_ID }}
- doNotCache: false
- - name: Install vcpkg dependencies
- run: |
- case ${{ matrix.job.target }} in
- aarch64-linux-android)
- ANDROID_TARGET=arm64-v8a
- ;;
- armv7-linux-androideabi)
- ANDROID_TARGET=armeabi-v7a
- ;;
- x86_64-linux-android)
- ANDROID_TARGET=x86_64
- ;;
- i686-linux-android)
- ANDROID_TARGET=x86
- ;;
- esac
- if ! ./flutter/build_android_deps.sh "${ANDROID_TARGET}"; then
- find "${VCPKG_ROOT}/" -name "*.log" | while read -r _1; do
- echo "$_1:"
- echo "======"
- cat "$_1"
- echo "======"
- echo ""
- done
- exit 1
- 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' }}
- run: |
- cd flutter
- sed -i 's/uni_links_desktop/#uni_links_desktop/g' pubspec.yaml
- sed -i 's/extended_text: .*/extended_text: 11.1.0/' pubspec.yaml
- flutter pub get
- cd lib
- find . | grep dart | xargs sed -i 's/textScaler: TextScaler.linear(\(.*\)),/textScaleFactor: \1,/g'
- - name: Build rustdesk lib
- env:
- ANDROID_NDK_HOME: ${{ steps.setup-ndk.outputs.ndk-path }}
- ANDROID_NDK_ROOT: ${{ steps.setup-ndk.outputs.ndk-path }}
- 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
- ;;
- armv7-linux-androideabi)
- ./flutter/ndk_arm.sh
- mkdir -p ./flutter/android/app/src/main/jniLibs/armeabi-v7a
- cp ./target/${{ matrix.job.target }}/release/liblibrustdesk.so ./flutter/android/app/src/main/jniLibs/armeabi-v7a/librustdesk.so
- ;;
- x86_64-linux-android)
- ./flutter/ndk_x64.sh
- mkdir -p ./flutter/android/app/src/main/jniLibs/x86_64
- cp ./target/${{ matrix.job.target }}/release/liblibrustdesk.so ./flutter/android/app/src/main/jniLibs/x86_64/librustdesk.so
- ;;
- i686-linux-android)
- ./flutter/ndk_x86.sh
- mkdir -p ./flutter/android/app/src/main/jniLibs/x86
- cp ./target/${{ matrix.job.target }}/release/liblibrustdesk.so ./flutter/android/app/src/main/jniLibs/x86/librustdesk.so
- ;;
- esac
- - name: Upload Rustdesk library to Artifacts
- uses: actions/upload-artifact@master
- with:
- name: librustdesk.so.${{ matrix.job.target }}
- path: ./target/${{ matrix.job.target }}/release/liblibrustdesk.so
- - name: Build rustdesk
- shell: bash
- env:
- JAVA_HOME: /usr/lib/jvm/java-17-openjdk-amd64
- run: |
- export PATH=/usr/lib/jvm/java-17-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
- ;;
- armv7-linux-androideabi)
- mkdir -p ./flutter/android/app/src/main/jniLibs/armeabi-v7a
- cp ${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/arm-linux-androideabi/libc++_shared.so ./flutter/android/app/src/main/jniLibs/armeabi-v7a/
- cp ./target/${{ matrix.job.target }}/release/liblibrustdesk.so ./flutter/android/app/src/main/jniLibs/armeabi-v7a/librustdesk.so
- # build flutter
- pushd flutter
- flutter build apk "--${{ matrix.job.reltype }}" --target-platform android-arm --split-per-abi
- mv build/app/outputs/flutter-apk/app-armeabi-v7a-${{ matrix.job.reltype }}.apk ../rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}${{ matrix.job.suffix }}.apk
- ;;
- x86_64-linux-android)
- mkdir -p ./flutter/android/app/src/main/jniLibs/x86_64
- cp ${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/x86_64-linux-android/libc++_shared.so ./flutter/android/app/src/main/jniLibs/x86_64/
- cp ./target/${{ matrix.job.target }}/release/liblibrustdesk.so ./flutter/android/app/src/main/jniLibs/x86_64/librustdesk.so
- # build flutter
- pushd flutter
- flutter build apk "--${{ matrix.job.reltype }}" --target-platform android-x64 --split-per-abi
- mv build/app/outputs/flutter-apk/app-x86_64-${{ matrix.job.reltype }}.apk ../rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}${{ matrix.job.suffix }}.apk
- ;;
- i686-linux-android)
- mkdir -p ./flutter/android/app/src/main/jniLibs/x86
- cp ${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/i686-linux-android/libc++_shared.so ./flutter/android/app/src/main/jniLibs/x86/
- cp ./target/${{ matrix.job.target }}/release/liblibrustdesk.so ./flutter/android/app/src/main/jniLibs/x86/librustdesk.so
- # build flutter
- pushd flutter
- flutter build apk "--${{ matrix.job.reltype }}" --target-platform android-x86 --split-per-abi
- mv build/app/outputs/flutter-apk/app-x86-${{ matrix.job.reltype }}.apk ../rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}${{ matrix.job.suffix }}.apk
- ;;
- esac
- popd
- mkdir -p signed-apk; pushd signed-apk
- mv ../rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}${{ matrix.job.suffix }}.apk .
- # https://github.com/r0adkll/sign-android-release/issues/84#issuecomment-1889636075
- - name: Setup sign tool version variable
- shell: bash
- run: |
- BUILD_TOOL_VERSION=$(ls /usr/local/lib/android/sdk/build-tools/ | tail -n 1)
- echo "ANDROID_SIGN_TOOL_VERSION=$BUILD_TOOL_VERSION" >> $GITHUB_ENV
- echo Last build tool version is: $BUILD_TOOL_VERSION
- - 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:
- # env.ANDROID_SIGN_TOOL_VERSION is set by Step "Setup sign tool version variable"
- BUILD_TOOLS_VERSION: ${{ env.ANDROID_SIGN_TOOL_VERSION }}
- - 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: Publish signed apk package
- if: env.ANDROID_SIGNING_KEY != null && env.UPLOAD_ARTIFACT == 'true'
- uses: softprops/action-gh-release@v1
- with:
- prerelease: true
- tag_name: ${{ env.TAG_NAME }}
- files: |
- ${{steps.sign-rustdesk.outputs.signedReleaseFile}}
- - name: Publish unsigned apk package
- if: env.ANDROID_SIGNING_KEY == null && 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
- build-rustdesk-android-universal:
- needs: [build-rustdesk-android]
- name: build rustdesk android universal apk
- if: ${{ inputs.upload-artifact }}
- runs-on: ubuntu-20.04
- env:
- reltype: release
- x86_target: "" # can be ",android-x86"
- suffix: ""
- 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:
- script: |
- 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 \
- libayatana-appindicator3-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-17-jdk-headless \
- pkg-config \
- tree \
- wget
- - name: Checkout source code
- uses: actions/checkout@v4
- - name: Install flutter
- uses: subosito/flutter-action@v2
- with:
- channel: "stable"
- flutter-version: ${{ env.ANDROID_FLUTTER_VERSION }}
- - name: Patch flutter
- run: |
- cd $(dirname $(dirname $(which flutter)))
- [[ "3.24.4" == ${{env.ANDROID_FLUTTER_VERSION}} ]] && git apply ${{ github.workspace }}/.github/patches/flutter_3.24.4_dropdown_menu_enableFilter.diff
- - name: Restore bridge files
- uses: actions/download-artifact@master
- with:
- name: bridge-artifact
- path: ./
- - name: Download Rustdesk library from Artifacts
- uses: actions/download-artifact@master
- with:
- name: librustdesk.so.aarch64-linux-android
- path: ./flutter/android/app/src/main/jniLibs/arm64-v8a
- - name: Download Rustdesk library from Artifacts
- uses: actions/download-artifact@master
- with:
- name: librustdesk.so.armv7-linux-androideabi
- path: ./flutter/android/app/src/main/jniLibs/armeabi-v7a
- - name: Download Rustdesk library from Artifacts
- uses: actions/download-artifact@master
- with:
- name: librustdesk.so.x86_64-linux-android
- path: ./flutter/android/app/src/main/jniLibs/x86_64
- - name: Download Rustdesk library from Artifacts
- if: ${{ env.reltype == 'debug' }}
- uses: actions/download-artifact@master
- with:
- name: librustdesk.so.i686-linux-android
- path: ./flutter/android/app/src/main/jniLibs/x86
- - name: fix android for flutter 3.13
- if: ${{ env.ANDROID_FLUTTER_VERSION == '3.13.9' }}
- run: |
- cd flutter
- sed -i 's/uni_links_desktop/#uni_links_desktop/g' pubspec.yaml
- sed -i 's/extended_text: .*/extended_text: 11.1.0/' pubspec.yaml
- flutter pub get
- cd lib
- find . | grep dart | xargs sed -i 's/textScaler: TextScaler.linear(\(.*\)),/textScaleFactor: \1,/g'
- - name: Build rustdesk
- shell: bash
- env:
- JAVA_HOME: /usr/lib/jvm/java-17-openjdk-amd64
- run: |
- export PATH=/usr/lib/jvm/java-17-openjdk-amd64/bin:$PATH
- # temporary use debug sign config
- sed -i "s/signingConfigs.release/signingConfigs.debug/g" ./flutter/android/app/build.gradle
- mv ./flutter/android/app/src/main/jniLibs/arm64-v8a/liblibrustdesk.so ./flutter/android/app/src/main/jniLibs/arm64-v8a/librustdesk.so
- 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/
- mv ./flutter/android/app/src/main/jniLibs/armeabi-v7a/liblibrustdesk.so ./flutter/android/app/src/main/jniLibs/armeabi-v7a/librustdesk.so
- cp ${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/arm-linux-androideabi/libc++_shared.so ./flutter/android/app/src/main/jniLibs/armeabi-v7a/
- mv ./flutter/android/app/src/main/jniLibs/x86_64/liblibrustdesk.so ./flutter/android/app/src/main/jniLibs/x86_64/librustdesk.so
- cp ${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/x86_64-linux-android/libc++_shared.so ./flutter/android/app/src/main/jniLibs/x86_64/
- if [ "${{ env.reltype }}" = "debug" ]; then
- mv ./flutter/android/app/src/main/jniLibs/x86/liblibrustdesk.so ./flutter/android/app/src/main/jniLibs/x86/librustdesk.so
- cp ${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/i686-linux-android/libc++_shared.so ./flutter/android/app/src/main/jniLibs/x86/
- fi
- # build flutter
- pushd flutter
- flutter build apk "--${{ env.reltype }}" --target-platform android-arm64,android-arm,android-x64${{ env.x86_target }}
- popd
- mkdir -p signed-apk
- mv ./flutter/build/app/outputs/flutter-apk/app-${{ env.reltype }}.apk signed-apk/rustdesk-${{ env.VERSION }}-universal${{ env.suffix }}.apk
- # https://github.com/r0adkll/sign-android-release/issues/84#issuecomment-1889636075
- - name: Setup sign tool version variable
- shell: bash
- run: |
- BUILD_TOOL_VERSION=$(ls /usr/local/lib/android/sdk/build-tools/ | tail -n 1)
- echo "ANDROID_SIGN_TOOL_VERSION=$BUILD_TOOL_VERSION" >> $GITHUB_ENV
- echo Last build tool version is: $BUILD_TOOL_VERSION
- - 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:
- # env.ANDROID_SIGN_TOOL_VERSION is set by Step "Setup sign tool version variable"
- BUILD_TOOLS_VERSION: ${{ env.ANDROID_SIGN_TOOL_VERSION }}
- - 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: Publish signed apk package
- if: env.ANDROID_SIGNING_KEY != null && env.UPLOAD_ARTIFACT == 'true'
- uses: softprops/action-gh-release@v1
- with:
- prerelease: true
- tag_name: ${{ env.TAG_NAME }}
- files: |
- ${{steps.sign-rustdesk.outputs.signedReleaseFile}}
- - name: Publish unsigned apk package
- if: env.ANDROID_SIGNING_KEY == null && env.UPLOAD_ARTIFACT == 'true'
- uses: softprops/action-gh-release@v1
- with:
- prerelease: true
- tag_name: ${{ env.TAG_NAME }}
- files: |
- signed-apk/rustdesk-${{ env.VERSION }}-universal${{ env.suffix }}.apk
- build-rustdesk-linux:
- needs: [generate-bridge]
- 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-20.04,
- deb_arch: amd64,
- vcpkg-triplet: x64-linux,
- }
- - {
- arch: aarch64,
- target: aarch64-unknown-linux-gnu,
- distro: ubuntu18.04,
- on: [self-hosted, Linux, ARM64],
- deb_arch: arm64,
- vcpkg-triplet: arm64-linux,
- }
- 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: Maximize build space
- if: ${{ matrix.job.arch == 'x86_64' }}
- 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 qemu-user-static
- - name: Checkout source code
- uses: actions/checkout@v4
- - 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: |
- 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
- shell: bash
- - 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++ \
- 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 \
- libvdpau-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
- # 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
- cargo build --lib $JOBS --features hwcodec,flutter --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.4" == ${{ 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
- export CARGO_INCREMENTAL=0
- export DEB_ARCH=${{ matrix.job.deb_arch }}
- python3 ./build.py --flutter --skip-cargo
- for name in rustdesk*??.deb; do
- mv "$name" "${name%%.deb}-${{ 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 rustdesk*??.rpm; do
- mv "$name" /workspace/"${name%%.rpm}.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 rustdesk*??.rpm; do
- mv "$name" /workspace/"${name%%.rpm}-suse.rpm"
- done
- - name: Publish debian/rpm package
- if: env.UPLOAD_ARTIFACT == 'true'
- uses: softprops/action-gh-release@v1
- with:
- prerelease: true
- tag_name: ${{ env.TAG_NAME }}
- files: |
- rustdesk-*.deb
- rustdesk-*.rpm
- - name: Upload deb
- uses: actions/upload-artifact@master
- if: env.UPLOAD_ARTIFACT == 'true'
- with:
- name: rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.deb
- path: rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.deb
- # 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
- if: matrix.job.arch == 'x86_64' && env.UPLOAD_ARTIFACT == 'true'
- 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
- if: matrix.job.arch == 'x86_64' && env.UPLOAD_ARTIFACT == 'true'
- uses: rustdesk-org/arch-makepkg-action@master
- with:
- packages:
- scripts: |
- cd res && HBB=`pwd`/.. FLUTTER=1 makepkg -f
- - name: Publish archlinux package
- if: matrix.job.arch == 'x86_64' && env.UPLOAD_ARTIFACT == 'true'
- uses: softprops/action-gh-release@v1
- with:
- prerelease: true
- tag_name: ${{ env.TAG_NAME }}
- files: |
- res/rustdesk-${{ env.VERSION }}*.zst
- build-rustdesk-linux-sciter:
- if: ${{ inputs.upload-artifact }}
- needs: build-rustdesk-linux # not for dep, just make it run later for parallelism
- runs-on: ${{ matrix.job.on }}
- name: build-rustdesk-linux-sciter ${{ matrix.job.target }}
- strategy:
- fail-fast: false
- matrix:
- # use a high level qemu-user-static
- job:
- - {
- arch: x86_64,
- target: x86_64-unknown-linux-gnu,
- on: ubuntu-20.04,
- distro: ubuntu18.04,
- deb_arch: amd64,
- sciter_arch: x64,
- vcpkg-triplet: x64-linux,
- extra_features: ",hwcodec",
- }
- - {
- arch: armv7,
- target: armv7-unknown-linux-gnueabihf,
- on: [self-hosted, Linux, ARM64],
- distro: ubuntu18.04-rustdesk,
- deb_arch: armhf,
- sciter_arch: arm32,
- vcpkg-triplet: arm-linux,
- extra_features: "",
- }
- 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@v4
- - name: Free Space
- run: |
- df -h
- free -m
- - name: Install Rust toolchain
- uses: dtolnay/rust-toolchain@v1
- with:
- toolchain: ${{ env.SCITER_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
- - uses: rustdesk-org/run-on-arch-action@amd64-support
- name: Build rustdesk sciter binary for ${{ matrix.job.arch }}
- id: vcpkg
- 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
- apt-get install -y \
- build-essential \
- clang \
- curl \
- gcc \
- git \
- g++ \
- libayatana-appindicator3-dev \
- libasound2-dev \
- libclang-dev \
- libdbus-1-dev \
- libglib2.0-dev \
- libgstreamer1.0-dev \
- libgstreamer-plugins-base1.0-dev \
- libgtk-3-dev \
- liblzma-dev \
- libpam0g-dev \
- libpulse-dev \
- libva-dev \
- libvdpau-dev \
- libxcb-randr0-dev \
- libxcb-shape0-dev \
- libxcb-xfixes0-dev \
- libxdo-dev \
- libxfixes-dev \
- ninja-build \
- pkg-config \
- python3 \
- python3.7 \
- rpm \
- unzip \
- wget \
- xz-utils \
- zip
- # arm-linux needs CMake and vcokg built from source as there
- # are no prebuilts available from Kitware and Microsoft
- if [ "${{ matrix.job.vcpkg-triplet }}" = "arm-linux" ]; then
- # install gcc/g++ 8 for vcpkg and OpenSSL headers for CMake
- apt-get install -y gcc-8 g++-8 libssl-dev
- # bootstrap CMake amd add it to PATH
- git clone --depth 1 https://github.com/kitware/cmake -b "v${{ env.SCITER_ARMV7_CMAKE_VERSION }}" /tmp/cmake
- pushd /tmp/cmake
- ./bootstrap --generator='Unix Makefiles' "--prefix=/opt/cmake-${{ env.SCITER_ARMV7_CMAKE_VERSION }}-linux-armhf"
- make -j1 install
- popd
- rm -rf /tmp/cmake
- export PATH="/opt/cmake-${{ env.SCITER_ARMV7_CMAKE_VERSION }}-linux-armhf/bin:$PATH"
- fi
- # bootstrap vcpkg and set VCPKG_ROOT
- export VCPKG_ROOT=/opt/artifacts/vcpkg
- mkdir -p /opt/artifacts
- pushd /opt/artifacts
- rm -rf vcpkg
- git clone https://github.com/microsoft/vcpkg
- pushd vcpkg
- git reset --hard ${{ env.VCPKG_COMMIT_ID }}
- # build vcpkg helper executable with gcc-8 for arm-linux but use prebuilt one on x64-linux
- if [ "${{ matrix.job.vcpkg-triplet }}" = "arm-linux" ]; then
- CC=/usr/bin/gcc-8 CXX=/usr/bin/g++-8 sh bootstrap-vcpkg.sh -disableMetrics
- else
- sh bootstrap-vcpkg.sh -disableMetrics
- fi
- popd
- popd
- # rust
- pushd /opt
- # do not use rustup, because memory overflow in qemu
- wget --output-document 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
- pushd rust-${{env.RUST_TOOLCHAIN_VERSION}}-${{ matrix.job.target }}
- ./install.sh
- popd
- rm -rf rust-${{env.RUST_TOOLCHAIN_VERSION}}-${{ matrix.job.target }}
- popd
- # install newer nasm for aom
- wget --output-document nasm.deb "http://ftp.us.debian.org/debian/pool/main/n/nasm/nasm_${{ env.SCITER_NASM_DEBVERSION }}_${{ matrix.job.deb_arch }}.deb"
- dpkg -i nasm.deb
- rm -f nasm.deb
- run: |
- # disable git safe.directory
- git config --global --add safe.directory "*"
- # set python3.7 as default python3
- update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.7 1
- # add built CMake to PATH and set VCPKG_FORCE_SYSTEM_BINARIES Afor arm-linux
- if [ "${{ matrix.job.vcpkg-triplet }}" = "arm-linux" ]; then
- export PATH="/opt/cmake-${{ env.SCITER_ARMV7_CMAKE_VERSION }}-linux-armhf/bin:$PATH"
- export VCPKG_FORCE_SYSTEM_BINARIES=1
- fi
- # edit cargo config
- mkdir -p ~/.cargo/
- echo """
- [source.crates-io]
- registry = 'https://github.com/rust-lang/crates.io-index'
- """ > ~/.cargo/config
- cat ~/.cargo/config
- # install dependencies from vcpkg
- export VCPKG_ROOT=/opt/artifacts/vcpkg
- 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
- # build rustdesk
- python3 ./res/inline-sciter.py
- export CARGO_INCREMENTAL=0
- cargo build --features inline${{ matrix.job.extra_features }} --release --bins --jobs 1
- # make debian package
- mkdir -p ./Release
- mv ./target/release/rustdesk ./Release/rustdesk
- wget -O ./Release/libsciter-gtk.so https://github.com/c-smile/sciter-sdk/raw/master/bin.lnx/${{ matrix.job.sciter_arch }}/libsciter-gtk.so
- export DEB_ARCH=${{ matrix.job.deb_arch }}
- ./build.py --package ./Release
- - name: Rename rustdesk
- shell: bash
- run: |
- for name in rustdesk*??.deb; do
- # use cp to duplicate deb files to fit other packages.
- cp "$name" "${name%%.deb}-${{ matrix.job.arch }}-sciter.deb"
- done
- - name: Publish debian package
- if: env.UPLOAD_ARTIFACT == 'true'
- uses: softprops/action-gh-release@v1
- with:
- prerelease: true
- tag_name: ${{ env.TAG_NAME }}
- files: |
- rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}-sciter.deb
- - name: Upload deb
- uses: actions/upload-artifact@master
- if: env.UPLOAD_ARTIFACT == 'true'
- with:
- name: rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}-sciter.deb
- path: rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}-sciter.deb
- build-appimage:
- name: Build appimage ${{ matrix.job.target }}
- needs: [build-rustdesk-linux]
- runs-on: ubuntu-20.04
- if: ${{ inputs.upload-artifact }}
- 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 source code
- uses: actions/checkout@v4
- - name: Download Binary
- uses: actions/download-artifact@master
- with:
- name: rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.deb
- path: .
- - name: Rename Binary
- run: |
- mv rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.deb appimage/rustdesk.deb
- - name: Build appimage package
- shell: bash
- run: |
- # install libarchive-tools for bsdtar command used in AppImageBuilder.yml
- sudo apt-get update -y
- sudo apt-get install -y libarchive-tools
- # set-up appimage-builder
- pushd /tmp
- wget -O appimage-builder-x86_64.AppImage https://github.com/AppImageCrafters/appimage-builder/releases/download/v1.1.0/appimage-builder-1.1.0-x86_64.AppImage
- chmod +x appimage-builder-x86_64.AppImage
- sudo mv appimage-builder-x86_64.AppImage /usr/local/bin/appimage-builder
- popd
- # run appimage-builder
- pushd appimage
- sudo appimage-builder --skip-tests --recipe ./AppImageBuilder-${{ matrix.job.arch }}.yml
- - name: Publish appimage package
- if: env.UPLOAD_ARTIFACT == 'true'
- uses: softprops/action-gh-release@v1
- with:
- prerelease: true
- tag_name: ${{ env.TAG_NAME }}
- files: |
- ./appimage/rustdesk-${{ env.VERSION }}-*.AppImage
- build-flatpak:
- name: Build flatpak ${{ matrix.job.target }}${{ matrix.job.suffix }}
- needs:
- - build-rustdesk-linux
- - build-rustdesk-linux-sciter
- runs-on: ${{ matrix.job.on }}
- if: ${{ inputs.upload-artifact }}
- strategy:
- fail-fast: false
- matrix:
- job:
- - {
- target: x86_64-unknown-linux-gnu,
- distro: ubuntu18.04,
- on: ubuntu-20.04,
- arch: x86_64,
- suffix: "",
- }
- - {
- target: x86_64-unknown-linux-gnu,
- distro: ubuntu18.04,
- on: ubuntu-20.04,
- arch: x86_64,
- suffix: "-sciter",
- }
- - {
- 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: [self-hosted, Linux, ARM64],
- arch: aarch64,
- suffix: "",
- }
- steps:
- - name: Checkout source code
- uses: actions/checkout@v4
- - name: Download Binary
- uses: actions/download-artifact@master
- with:
- name: rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}${{ matrix.job.suffix }}.deb
- path: .
- - name: Rename Binary
- run: |
- mv rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}${{ matrix.job.suffix }}.deb flatpak/rustdesk.deb
- - uses: rustdesk-org/run-on-arch-action@amd64-support
- name: Build rustdesk flatpak package for ${{ matrix.job.arch }}
- 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 \
- curl \
- git \
- rpm \
- wget
- run: |
- # disable git safe.directory
- git config --global --add safe.directory "*"
- pushd /workspace
- # install
- apt-get update -y
- apt-get install -y \
- cmake \
- curl \
- flatpak \
- flatpak-builder \
- gcc \
- git \
- g++ \
- libgtk-3-dev \
- nasm \
- wget
- # flatpak deps
- flatpak --user remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
- flatpak --user install -y flathub org.freedesktop.Platform/${{ matrix.job.arch }}/23.08
- flatpak --user install -y flathub org.freedesktop.Sdk/${{ matrix.job.arch }}/23.08
- # package
- pushd flatpak
- git clone https://github.com/flathub/shared-modules.git --depth=1
- flatpak-builder --user --force-clean --repo=repo ./build ./rustdesk.json
- flatpak build-bundle ./repo rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}${{ matrix.job.suffix }}.flatpak com.rustdesk.RustDesk
- - name: Publish flatpak package
- uses: softprops/action-gh-release@v1
- with:
- prerelease: true
- tag_name: ${{ env.TAG_NAME }}
- files: |
- flatpak/rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}${{ matrix.job.suffix }}.flatpak
- build-rustdesk-web:
- 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: 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 }}
- - name: Patch flutter
- shell: bash
- run: |
- cd $(dirname $(dirname $(which flutter)))
- [[ "3.24.4" == ${{env.FLUTTER_VERSION}} ]] && git apply ${{ github.workspace }}/.github/patches/flutter_3.24.4_dropdown_menu_enableFilter.diff
- # 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: |
- flutter/build/rustdesk-${{ env.VERSION }}-${{ env.RELEASE_NAME }}.tar.gz
|