mirror of
https://github.com/rustdesk/rustdesk.git
synced 2024-12-18 05:27:53 +08:00
2056 lines
78 KiB
YAML
2056 lines
78 KiB
YAML
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 }}
|
||
cache: true
|
||
|
||
# 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: 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-macos
|
||
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: 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-macos
|
||
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-macos
|
||
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: 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-macos
|
||
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 }}
|
||
- 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: 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
|
||
|
||
# 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 }}
|
||
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: |
|
||
flutter/build/rustdesk-${{ env.VERSION }}-${{ env.RELEASE_NAME }}.tar.gz
|