Build the flutter version of the RustDesk #1
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Build the flutter version of the RustDesk | |
on: | |
workflow_dispatch: | |
workflow_call: | |
inputs: | |
upload-artifact: | |
type: boolean | |
default: true | |
upload-tag: | |
type: string | |
default: "nightly" | |
env: | |
RUST_VERSION: "1.75" # https://github.com/rustdesk/rustdesk/discussions/7503 | |
CARGO_NDK_VERSION: "3.1.2" | |
LLVM_VERSION: "15.0.6" | |
FLUTTER_VERSION: "3.19.5" | |
FLUTTER_RUST_BRIDGE_VERSION: "1.80.1" | |
# for arm64 linux because official Dart SDK does not work | |
FLUTTER_ELINUX_VERSION: "3.16.9" | |
FLUTTER_ELINUX_COMMIT_ID: "c02bd16e1630f5bd690b85c5c2456ac1920e25af" | |
TAG_NAME: "${{ inputs.upload-tag }}" | |
VCPKG_BINARY_SOURCES: "clear;x-gha,readwrite" | |
# vcpkg version: 2023.10.19 | |
# for multiarch gcc compatibility | |
VCPKG_COMMIT_ID: "8eb57355a4ffb410a2e94c07b4dca2dffbee8e50" | |
VERSION: "1.2.4" | |
NDK_VERSION: "r26b" | |
#signing keys env variable checks | |
ANDROID_SIGNING_KEY: "${{ secrets.ANDROID_SIGNING_KEY }}" | |
MACOS_P12_BASE64: "${{ secrets.MACOS_P12_BASE64 }}" | |
# To make a custom build with your own servers set the below secret values | |
RS_PUB_KEY: "${{ secrets.RS_PUB_KEY }}" | |
RENDEZVOUS_SERVER: "${{ secrets.RENDEZVOUS_SERVER }}" | |
API_SERVER: "${{ secrets.API_SERVER }}" | |
UPLOAD_ARTIFACT: "${{ inputs.upload-artifact }}" | |
SIGN_BASE_URL: "${{ secrets.SIGN_BASE_URL }}" | |
jobs: | |
build-RustDeskTempTopMostWindow: | |
uses: ./.github/workflows/third-party-RustDeskTempTopMostWindow.yml | |
with: | |
upload-artifact: ${{ inputs.upload-artifact }} | |
target: windows-2019 | |
configuration: Release | |
platform: x64 | |
target_version: Windows10 | |
strategy: | |
fail-fast: false | |
build-for-windows-flutter: | |
name: ${{ matrix.job.target }} (${{ matrix.job.os }}) | |
needs: [build-RustDeskTempTopMostWindow] | |
runs-on: ${{ matrix.job.os }} | |
strategy: | |
fail-fast: false | |
matrix: | |
job: | |
# - { target: i686-pc-windows-msvc , os: windows-2019 } | |
# - { target: x86_64-pc-windows-gnu , os: windows-2019 } | |
- { target: x86_64-pc-windows-msvc, os: windows-2019, arch: x86_64 } | |
# - { target: aarch64-pc-windows-msvc, os: windows-2019, 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: Install LLVM and Clang | |
uses: KyleMayes/install-llvm-action@v1 | |
with: | |
version: ${{ env.LLVM_VERSION }} | |
- name: Install flutter | |
uses: subosito/[email protected] #https://github.com/subosito/flutter-action/issues/277 | |
with: | |
channel: "stable" | |
flutter-version: ${{ env.FLUTTER_VERSION }} | |
cache: true | |
- 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: Install flutter rust bridge deps | |
run: | | |
git config --global core.longpaths true | |
cargo install flutter_rust_bridge_codegen --version ${{ env.FLUTTER_RUST_BRIDGE_VERSION }} --features "uuid" | |
Push-Location flutter ; flutter pub get ; Pop-Location | |
~/.cargo/bin/flutter_rust_bridge_codegen --rust-input ./src/flutter_ffi.rs --dart-output ./flutter/lib/generated_bridge.dart | |
- name: Setup vcpkg with Github Actions binary cache | |
uses: lukka/run-vcpkg@v11 | |
with: | |
vcpkgDirectory: C:\vcpkg | |
vcpkgGitCommitId: ${{ env.VCPKG_COMMIT_ID }} | |
- name: Install vcpkg dependencies | |
run: | | |
$VCPKG_ROOT/vcpkg install --triplet x64-windows-static --x-install-root="$VCPKG_ROOT/installed" | |
shell: bash | |
- name: Build rustdesk | |
run: python3 .\build.py --portable --hwcodec --flutter --gpucodec --skip-portable-pack | |
- 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: "./flutter/build/windows/x64/runner/Release/" | |
- name: Compress unsigned | |
shell: bash | |
run: | | |
mv ./flutter/build/windows/x64/runner/Release ./rustdesk | |
tar czf rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}-unsigned.tar.gz 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: | | |
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: 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 | |
./rustdesk-*.tar.gz | |
# 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-2019 } | |
# - { target: x86_64-pc-windows-gnu , os: windows-2019 } | |
- { target: i686-pc-windows-msvc, os: windows-2019, arch: x86 } | |
# - { target: aarch64-pc-windows-msvc, os: windows-2019 } | |
steps: | |
- name: Export GitHub Actions cache environment variables | |
uses: actions/github-script@v6 | |
with: | |
script: | | |
core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || ''); | |
core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || ''); | |
- name: Checkout source code | |
uses: actions/checkout@v3 | |
- name: Install 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 }} | |
- name: Install vcpkg dependencies | |
run: | | |
$VCPKG_ROOT/vcpkg install --triplet x86-windows-static --x-install-root="$VCPKG_ROOT/installed" | |
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,gpucodec --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 | |
- 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: | | |
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 | |
mv ./Release ./rustdesk | |
tar czf rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.tar.gz rustdesk | |
- 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 | |
./rustdesk-*.tar.gz | |
build-for-macOS-arm64: | |
name: build-for-macOS-arm64 | |
runs-on: [self-hosted, macOS, ARM64] | |
steps: | |
- name: Export GitHub Actions cache environment variables | |
uses: actions/github-script@v6 | |
with: | |
script: | | |
core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || ''); | |
core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || ''); | |
- name: Checkout source code | |
uses: actions/checkout@v3 | |
- name: Install flutter rust bridge deps | |
shell: bash | |
run: | | |
cargo install flutter_rust_bridge_codegen --version ${{ env.FLUTTER_RUST_BRIDGE_VERSION }} --features "uuid" | |
pushd flutter && flutter pub get && popd | |
~/.cargo/bin/flutter_rust_bridge_codegen --rust-input ./src/flutter_ffi.rs --dart-output ./flutter/lib/generated_bridge.dart --c-output ./flutter/macos/Runner/bridge_generated.h | |
- name: Build rustdesk | |
run: | | |
# --hwcodec not supported on macos yet | |
./build.py --flutter | |
- name: 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-for-macOS: | |
name: ${{ matrix.job.target }} (${{ matrix.job.os }}) [${{ matrix.job.extra-build-args }}] | |
runs-on: ${{ matrix.job.os }} | |
strategy: | |
fail-fast: false | |
matrix: | |
job: | |
- { | |
target: x86_64-apple-darwin, | |
os: macos-latest, | |
extra-build-args: "", | |
arch: x86_64, | |
} | |
steps: | |
- name: Export GitHub Actions cache environment variables | |
uses: actions/github-script@v6 | |
with: | |
script: | | |
core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || ''); | |
core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || ''); | |
- name: Checkout source code | |
uses: actions/checkout@v3 | |
- name: 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/[email protected] | |
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: 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: Install flutter rust bridge deps | |
shell: bash | |
run: | | |
cargo install flutter_rust_bridge_codegen --version ${{ env.FLUTTER_RUST_BRIDGE_VERSION }} --features "uuid" | |
pushd flutter && flutter pub get && popd | |
~/.cargo/bin/flutter_rust_bridge_codegen --rust-input ./src/flutter_ffi.rs --dart-output ./flutter/lib/generated_bridge.dart --c-output ./flutter/macos/Runner/bridge_generated.h | |
- name: Setup vcpkg with Github Actions binary cache | |
uses: lukka/run-vcpkg@v11 | |
with: | |
vcpkgGitCommitId: ${{ env.VCPKG_COMMIT_ID }} | |
- name: Install vcpkg dependencies | |
run: | | |
$VCPKG_ROOT/vcpkg install --x-install-root="$VCPKG_ROOT/installed" | |
- 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: | | |
# --hwcodec not supported on macos yet | |
./build.py --flutter ${{ 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 }}-x64.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-x64 | |
path: rustdesk-${{ env.VERSION }}-x64.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_mac: | |
needs: | |
- build-for-macOS | |
- build-for-macOS-arm64 | |
runs-on: ubuntu-latest | |
if: ${{ inputs.upload-artifact }} | |
steps: | |
- name: Download artifacts | |
uses: actions/download-artifact@master | |
with: | |
name: rustdesk-unsigned-macos-x64 | |
path: ./ | |
- name: Download Artifacts | |
uses: actions/download-artifact@master | |
with: | |
name: rustdesk-unsigned-macos-arm64 | |
path: ./ | |
- name: Combine unsigned macos app | |
run: | | |
tar czf rustdesk-${{ env.VERSION }}-macos-unsigned.tar.gz *.dmg | |
- name: Publish unsigned macos app | |
uses: softprops/action-gh-release@v1 | |
with: | |
prerelease: true | |
tag_name: ${{ env.TAG_NAME }} | |
files: rustdesk-${{ env.VERSION }}-macos-unsigned.tar.gz | |
generate-bridge-linux: | |
uses: ./.github/workflows/bridge.yml | |
build-rustdesk-ios: | |
if: ${{ inputs.upload-artifact }} | |
name: build rustdesk ios ipa ${{ matrix.job.target }} (${{ matrix.job.os }}) [${{ matrix.job.extra-build-features }}] | |
runs-on: ${{ matrix.job.os }} | |
strategy: | |
fail-fast: false | |
matrix: | |
job: | |
- { | |
arch: aarch64, | |
target: aarch64-apple-ios, | |
os: macos-latest, | |
extra-build-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: Install dependencies | |
run: | | |
brew install nasm | |
- name: Checkout source code | |
uses: actions/checkout@v3 | |
- 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 }} | |
- name: Install vcpkg dependencies | |
run: | | |
$VCPKG_ROOT/vcpkg install --triplet arm64-ios --x-install-root="$VCPKG_ROOT/installed" | |
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 }}-${{ matrix.job.extra-build-features }} | |
- name: Install flutter rust bridge deps | |
shell: bash | |
run: | | |
cargo install flutter_rust_bridge_codegen --version ${{ env.FLUTTER_RUST_BRIDGE_VERSION }} --features "uuid" | |
pushd flutter && flutter pub get && popd | |
~/.cargo/bin/flutter_rust_bridge_codegen --rust-input ./src/flutter_ffi.rs --dart-output ./flutter/lib/generated_bridge.dart --c-output ./flutter/ios/Runner/bridge_generated.h | |
- name: Build rustdesk lib | |
run: | | |
rustup target add ${{ matrix.job.target }} | |
cargo build --features flutter --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-android: | |
needs: [generate-bridge-linux] | |
name: build rustdesk android apk ${{ matrix.job.target }} (${{ matrix.job.os }}) [${{ matrix.job.extra-build-features }}] | |
runs-on: ${{ matrix.job.os }} | |
strategy: | |
fail-fast: false | |
matrix: | |
job: | |
- { | |
arch: aarch64, | |
target: aarch64-linux-android, | |
os: ubuntu-20.04, | |
extra-build-features: "", | |
openssl-arch: android-arm64, | |
} | |
- { | |
arch: armv7, | |
target: armv7-linux-androideabi, | |
os: ubuntu-20.04, | |
extra-build-features: "", | |
openssl-arch: android-arm, | |
} | |
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: | | |
sudo apt-get update | |
sudo apt-get install -y \ | |
clang \ | |
cmake \ | |
curl \ | |
gcc-multilib \ | |
git \ | |
g++ \ | |
g++-multilib \ | |
libappindicator3-dev \ | |
libasound2-dev \ | |
libc6-dev \ | |
libclang-10-dev \ | |
libclang-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 \ | |
llvm-dev \ | |
nasm \ | |
ninja-build \ | |
openjdk-11-jdk-headless \ | |
pkg-config \ | |
tree \ | |
wget | |
- name: Checkout source code | |
uses: actions/checkout@v3 | |
- name: Install flutter | |
uses: subosito/flutter-action@v2 | |
with: | |
channel: "stable" | |
flutter-version: ${{ env.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 }} | |
- name: Install vcpkg dependencies | |
run: | | |
case ${{ matrix.job.target }} in | |
aarch64-linux-android) | |
./flutter/build_android_deps.sh arm64-v8a | |
;; | |
armv7-linux-androideabi) | |
./flutter/build_android_deps.sh armeabi-v7a | |
;; | |
esac | |
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 }}-${{ matrix.job.extra-build-features }} | |
- 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 | |
;; | |
esac | |
- name: Build rustdesk | |
shell: bash | |
env: | |
JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64 | |
run: | | |
export PATH=/usr/lib/jvm/java-11-openjdk-amd64/bin:$PATH | |
# temporary use debug sign config | |
sed -i "s/signingConfigs.release/signingConfigs.debug/g" ./flutter/android/app/build.gradle | |
case ${{ matrix.job.target }} in | |
aarch64-linux-android) | |
mkdir -p ./flutter/android/app/src/main/jniLibs/arm64-v8a | |
cp ${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/libc++_shared.so ./flutter/android/app/src/main/jniLibs/arm64-v8a/ | |
cp ./target/${{ matrix.job.target }}/release/liblibrustdesk.so ./flutter/android/app/src/main/jniLibs/arm64-v8a/librustdesk.so | |
# build flutter | |
pushd flutter | |
flutter build apk --release --target-platform android-arm64 --split-per-abi | |
mv build/app/outputs/flutter-apk/app-arm64-v8a-release.apk ../rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.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 --release --target-platform android-arm --split-per-abi | |
mv build/app/outputs/flutter-apk/app-armeabi-v7a-release.apk ../rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.apk | |
;; | |
esac | |
popd | |
mkdir -p signed-apk; pushd signed-apk | |
mv ../rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.apk . | |
- uses: r0adkll/sign-android-release@v1 | |
name: Sign app APK | |
if: env.ANDROID_SIGNING_KEY != null | |
id: sign-rustdesk | |
with: | |
releaseDirectory: ./signed-apk | |
signingKeyBase64: ${{ secrets.ANDROID_SIGNING_KEY }} | |
alias: ${{ secrets.ANDROID_ALIAS }} | |
keyStorePassword: ${{ secrets.ANDROID_KEY_STORE_PASSWORD }} | |
keyPassword: ${{ secrets.ANDROID_KEY_PASSWORD }} | |
env: | |
# override default build-tools version (29.0.3) -- optional | |
BUILD_TOOLS_VERSION: "30.0.2" | |
- name: 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-lib-linux-amd64: | |
needs: [generate-bridge-linux] | |
name: build-rust-lib ${{ matrix.job.target }} (${{ matrix.job.os }}) [${{ matrix.job.extra-build-features }}] | |
runs-on: ${{ matrix.job.os }} | |
strategy: | |
fail-fast: false | |
matrix: | |
# use a high level qemu-user-static | |
job: | |
# - { target: i686-unknown-linux-gnu , os: ubuntu-20.04, use-cross: true } | |
# - { target: i686-unknown-linux-musl , os: ubuntu-20.04, use-cross: true } | |
- { | |
arch: x86_64, | |
target: x86_64-unknown-linux-gnu, | |
os: ubuntu-20.04, | |
extra-build-features: "", | |
enable-headless: true, | |
} | |
- { | |
arch: x86_64, | |
target: x86_64-unknown-linux-gnu, | |
os: ubuntu-20.04, | |
extra-build-features: "flatpak", | |
enable-headless: false, | |
} | |
- { | |
arch: x86_64, | |
target: x86_64-unknown-linux-gnu, | |
os: ubuntu-20.04, | |
extra-build-features: "appimage", | |
enable-headless: false, | |
} | |
# - { target: x86_64-unknown-linux-musl , os: ubuntu-20.04, use-cross: true } | |
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 | |
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@v3 | |
- name: Set Swap Space | |
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 | |
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 | |
uses: actions/download-artifact@master | |
with: | |
name: bridge-artifact | |
path: ./ | |
- name: Setup vcpkg with Github Actions binary cache | |
uses: lukka/run-vcpkg@v11 | |
with: | |
vcpkgDirectory: /opt/artifacts/vcpkg | |
vcpkgGitCommitId: ${{ env.VCPKG_COMMIT_ID }} | |
- name: Install vcpkg dependencies | |
run: | | |
$VCPKG_ROOT/vcpkg install --x-install-root="$VCPKG_ROOT/installed" | |
shell: bash | |
- uses: rustdesk-org/run-on-arch-action@amd64-support | |
name: Build rustdesk library for ${{ matrix.job.arch }} | |
id: vcpkg | |
with: | |
arch: ${{ matrix.job.arch }} | |
distro: ubuntu18.04 | |
# not ready yet | |
# distro: ubuntu18.04-rustdesk | |
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 \ | |
clang \ | |
cmake \ | |
curl \ | |
gcc \ | |
git \ | |
g++ \ | |
libappindicator3-dev \ | |
libasound2-dev \ | |
libclang-10-dev \ | |
libclang-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 \ | |
llvm-dev \ | |
nasm \ | |
ninja-build \ | |
pkg-config \ | |
tree \ | |
wget | |
# 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 | |
# mock | |
case "${{ matrix.job.arch }}" in | |
x86_64) | |
# no need mock on x86_64 | |
export VCPKG_ROOT=/opt/artifacts/vcpkg | |
export DEFAULT_FEAT="" | |
if ${{ matrix.job.enable-headless }}; then | |
export DEFAULT_FEAT=linux_headless | |
fi | |
cargo build --lib --features hwcodec,flutter,flutter_texture_render,${{ matrix.job.extra-build-features }},$DEFAULT_FEAT --release | |
;; | |
esac | |
- name: Upload Artifacts | |
uses: actions/upload-artifact@master | |
with: | |
name: librustdesk-${{ matrix.job.arch }}-${{ matrix.job.extra-build-features }}.so | |
path: target/release/liblibrustdesk.so | |
build-rustdesk-lib-linux-arm: | |
if: ${{ inputs.upload-artifact }} | |
needs: [generate-bridge-linux] | |
name: build-rust-lib ${{ matrix.job.target }} (${{ matrix.job.os }}) [${{ matrix.job.extra-build-features }}] | |
runs-on: [self-hosted, Linux, ARM64] | |
strategy: | |
fail-fast: false | |
matrix: | |
# use a high level qemu-user-static | |
job: | |
- { | |
arch: aarch64, | |
target: aarch64-unknown-linux-gnu, | |
os: ubuntu-20.04, # just for naming package, not running host | |
use-cross: true, | |
extra-build-features: "", | |
enable-headless: true, | |
} | |
- { | |
arch: aarch64, | |
target: aarch64-unknown-linux-gnu, | |
os: ubuntu-20.04, # just for naming package, not running host | |
use-cross: true, | |
extra-build-features: "appimage", | |
enable-headless: false, | |
} | |
# - { arch: aarch64, target: aarch64-unknown-linux-gnu , os: ubuntu-20.04, use-cross: true, extra-build-features: "flatpak" } | |
# - { | |
# arch: armv7, | |
# target: armv7-unknown-linux-gnueabihf, | |
# os: ubuntu-20.04, | |
# use-cross: true, | |
# extra-build-features: "", | |
# } | |
# - { arch: armv7, target: armv7-unknown-linux-gnueabihf , os: ubuntu-20.04, use-cross: true, extra-build-features: "appimage" } | |
# - { target: arm-unknown-linux-musleabihf, os: ubuntu-20.04, use-cross: true } | |
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: | | |
sudo apt-get update | |
sudo apt-get install -y \ | |
cmake \ | |
crossbuild-essential-arm64 \ | |
curl \ | |
g++ \ | |
gcc \ | |
git \ | |
nasm \ | |
ninja-build \ | |
pkg-config \ | |
unzip \ | |
xz-utils \ | |
wget \ | |
zip | |
#- name: Maximize build space | |
# run: | | |
# sudo rm -rf /opt/ghc | |
# sudo rm -rf /usr/local/lib/android | |
# sudo rm -rf /usr/share/dotnet | |
# sudo apt-get update -y | |
# sudo apt-get install qemu-user-static -y | |
- name: Checkout source code | |
uses: actions/checkout@v3 | |
#- name: Set Swap Space | |
# 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 | |
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 | |
uses: actions/download-artifact@master | |
with: | |
name: bridge-artifact | |
path: ./ | |
- name: Setup vcpkg with Github Actions binary cache | |
uses: lukka/run-vcpkg@v11 | |
with: | |
vcpkgDirectory: /opt/artifacts/vcpkg | |
vcpkgGitCommitId: ${{ env.VCPKG_COMMIT_ID }} | |
- name: Install vcpkg dependencies | |
run: | | |
case ${{ matrix.job.target }} in | |
aarch64-unknown-linux-gnu) | |
$VCPKG_ROOT/vcpkg install --triplet arm64-linux --x-install-root="$VCPKG_ROOT/installed" | |
;; | |
armv7-unknown-linux-gnueabihf) | |
$VCPKG_ROOT/vcpkg install --triplet arm-linux --x-install-root="$VCPKG_ROOT/installed" | |
;; | |
esac | |
shell: bash | |
- uses: rustdesk-org/run-on-arch-action@amd64-support | |
name: Build rustdesk library for ${{ matrix.job.arch }} | |
id: vcpkg | |
with: | |
arch: ${{ matrix.job.arch }} | |
distro: ubuntu18.04-rustdesk | |
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 \ | |
clang \ | |
cmake \ | |
curl \ | |
gcc \ | |
git \ | |
g++ \ | |
libappindicator3-dev \ | |
libasound2-dev \ | |
libclang-10-dev \ | |
libclang-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 \ | |
llvm-dev \ | |
nasm \ | |
ninja-build \ | |
pkg-config \ | |
tree \ | |
wget | |
# 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 | |
export DEFAULT_FEAT="" | |
if ${{ matrix.job.enable-headless }}; then | |
export DEFAULT_FEAT=linux_headless | |
fi | |
export CARGO_INCREMENTAL=0 | |
cargo build --lib --features flutter,flutter_texture_render,${{ matrix.job.extra-build-features }},$DEFAULT_FEAT --release | |
- name: Upload Artifacts | |
uses: actions/upload-artifact@master | |
with: | |
name: librustdesk-${{ matrix.job.arch }}-${{ matrix.job.extra-build-features }}.so | |
path: target/release/liblibrustdesk.so | |
build-rustdesk-sciter-arm: | |
if: ${{ inputs.upload-artifact }} | |
name: build-rustdesk(sciter) ${{ matrix.job.target }} (${{ matrix.job.os }}) [${{ matrix.job.extra-build-features }}] | |
runs-on: [self-hosted, Linux, ARM64] | |
strategy: | |
fail-fast: false | |
matrix: | |
# use a high level qemu-user-static | |
job: | |
- { | |
arch: armv7, | |
target: armv7-unknown-linux-gnueabihf, | |
deb-arch: armhf, | |
os: ubuntu-latest, | |
use-cross: true, | |
extra-build-features: "", | |
enable-headless: true, | |
} | |
# - { arch: armv7, target: armv7-unknown-linux-gnueabihf , os: ubuntu-20.04, use-cross: true, extra-build-features: "appimage" } | |
# - { target: arm-unknown-linux-musleabihf, os: ubuntu-20.04, use-cross: true } | |
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: | | |
sudo apt-get update | |
sudo apt-get install -y \ | |
cmake \ | |
crossbuild-essential-armhf \ | |
curl \ | |
g++ \ | |
gcc \ | |
git \ | |
nasm \ | |
ninja-build \ | |
pkg-config \ | |
unzip \ | |
xz-utils \ | |
zip | |
#- name: Maximize build space | |
# run: | | |
# sudo rm -rf /opt/ghc | |
# sudo rm -rf /usr/local/lib/android | |
# sudo rm -rf /usr/share/dotnet | |
# sudo apt-get update -y | |
# sudo apt-get install qemu-user-static -y | |
- name: Checkout source code | |
uses: actions/checkout@v3 | |
#- name: Set Swap Space | |
# 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 | |
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: Setup vcpkg with Github Actions binary cache | |
uses: lukka/run-vcpkg@v11 | |
with: | |
vcpkgDirectory: /opt/artifacts/vcpkg | |
vcpkgGitCommitId: ${{ env.VCPKG_COMMIT_ID }} | |
- name: Install vcpkg dependencies | |
run: | | |
cp $PWD/res/vcpkg/linux.cmake $VCPKG_ROOT/scripts/toolchains/linux.cmake | |
$VCPKG_ROOT/vcpkg install --triplet arm-linux --x-install-root="$VCPKG_ROOT/installed" | |
shell: bash | |
- 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: ubuntu18.04-rustdesk | |
githubToken: ${{ github.token }} | |
setup: | | |
ls -l "${PWD}" | |
dockerRunArgs: | | |
--volume "${PWD}:/workspace" | |
--volume "/opt/artifacts:/opt/artifacts" | |
shell: /bin/bash | |
install: | | |
apt-get update -y | |
apt-get install -y \ | |
build-essential \ | |
clang \ | |
cmake \ | |
curl \ | |
gcc \ | |
git \ | |
g++ \ | |
libappindicator3-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 \ | |
nasm \ | |
ninja-build \ | |
pkg-config \ | |
python3 \ | |
rpm \ | |
unzip \ | |
wget \ | |
xz-utils | |
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 | |
# build | |
pushd /workspace | |
python3 ./res/inline-sciter.py | |
export VCPKG_ROOT=/opt/artifacts/vcpkg | |
export ARCH=armhf | |
export DEFAULT_FEAT="" | |
export CARGO_INCREMENTAL=0 | |
if ${{ matrix.job.enable-headless }}; then | |
export DEFAULT_FEAT=linux_headless | |
fi | |
cargo build --features inline,${{ matrix.job.extra-build-features }},$DEFAULT_FEAT --release --bins | |
# 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/arm32/libsciter-gtk.so | |
./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: matrix.job.extra-build-features == '' && 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 Artifact | |
uses: actions/upload-artifact@master | |
if: ${{ contains(matrix.job.extra-build-features, 'flatpak') }} | |
with: | |
name: rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}-sciter.deb | |
path: rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}-sciter.deb | |
build-rustdesk-linux-arm: | |
if: ${{ inputs.upload-artifact }} | |
needs: [build-rustdesk-lib-linux-arm] | |
name: build-rustdesk ${{ matrix.job.target }} (${{ matrix.job.os }}) [${{ matrix.job.extra-build-features }}] | |
runs-on: ubuntu-20.04 # 20.04 has more performance on arm build | |
strategy: | |
fail-fast: false | |
matrix: | |
job: | |
- { | |
arch: aarch64, | |
target: aarch64-unknown-linux-gnu, | |
os: ubuntu-18.04, # just for naming package, not running host | |
use-cross: true, | |
extra-build-features: "", | |
} | |
- { | |
arch: aarch64, | |
target: aarch64-unknown-linux-gnu, | |
os: ubuntu-18.04, # just for naming package, not running host | |
use-cross: true, | |
extra-build-features: "appimage", | |
} | |
# - { | |
# arch: aarch64, | |
# target: aarch64-unknown-linux-gnu, | |
# os: ubuntu-18.04, # just for naming package, not running host | |
# use-cross: true, | |
# extra-build-features: "flatpak", | |
# } | |
# - { arch: armv7, target: armv7-unknown-linux-gnueabihf , os: ubuntu-20.04, use-cross: true, extra-build-features: "" } | |
# - { arch: armv7, target: armv7-unknown-linux-gnueabihf , os: ubuntu-20.04, use-cross: true, extra-build-features: "appimage" } | |
# - { target: arm-unknown-linux-musleabihf, os: ubuntu-20.04, use-cross: true } | |
steps: | |
- name: Checkout source code | |
uses: actions/checkout@v3 | |
- name: Restore bridge files | |
uses: actions/download-artifact@master | |
with: | |
name: bridge-artifact | |
path: ./ | |
- name: Prepare env | |
run: | | |
sudo apt-get update -y | |
sudo apt-get install -y \ | |
curl \ | |
git \ | |
libarchive-tools \ | |
libgtk-3-dev \ | |
nasm \ | |
wget | |
mkdir -p ./target/release/ | |
- name: Restore the rustdesk lib file | |
uses: actions/download-artifact@master | |
with: | |
name: librustdesk-${{ matrix.job.arch }}-${{ matrix.job.extra-build-features }}.so | |
path: ./target/release/ | |
- name: Download Flutter | |
shell: bash | |
run: | | |
# disable git safe.directory | |
git config --global --add safe.directory "*" | |
pushd /opt | |
# 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_ELINUX_COMMIT_ID }} | |
popd | |
- uses: rustdesk-org/run-on-arch-action@amd64-support | |
name: Build rustdesk binary for ${{ matrix.job.arch }} | |
id: vcpkg | |
with: | |
arch: ${{ matrix.job.arch }} | |
distro: ubuntu18.04-rustdesk | |
githubToken: ${{ github.token }} | |
setup: | | |
ls -l "${PWD}" | |
dockerRunArgs: | | |
--volume "${PWD}:/workspace" | |
--volume "/opt/artifacts:/opt/artifacts" | |
--volume "/opt/flutter-elinux:/opt/flutter-elinux" | |
shell: /bin/bash | |
install: | | |
apt-get update -y | |
apt-get install -y \ | |
build-essential \ | |
clang \ | |
cmake \ | |
curl \ | |
gcc \ | |
git \ | |
g++ \ | |
libappindicator3-dev \ | |
libgtk-3-dev \ | |
liblzma-dev \ | |
nasm \ | |
ninja-build \ | |
pkg-config \ | |
python3 \ | |
rpm \ | |
unzip \ | |
wget \ | |
xz-utils | |
run: | | |
# disable git safe.directory | |
git config --global --add safe.directory "*" | |
pushd /workspace | |
# we use flutter-elinux to build our rustdesk | |
export PATH=/opt/flutter-elinux/bin:$PATH | |
sed -i "s/flutter build linux --release/flutter-elinux build linux/g" ./build.py | |
# Setup flutter-elinux. Run doctor to check if issues here. | |
flutter-elinux doctor -v | |
# Patch arm64 engine for flutter 3.6.0+ | |
flutter-elinux precache --linux | |
pushd /tmp | |
curl -O https://storage.googleapis.com/flutter_infra_release/releases/stable/linux/flutter_linux_${{ env.FLUTTER_ELINUX_VERSION }}-stable.tar.xz | |
tar -xvf flutter_linux_${{ env.FLUTTER_ELINUX_VERSION }}-stable.tar.xz flutter/bin/cache/artifacts/engine/linux-x64/shader_lib | |
cp -R flutter/bin/cache/artifacts/engine/linux-x64/shader_lib /opt/flutter-elinux/flutter/bin/cache/artifacts/engine/linux-arm64 | |
popd | |
# edit to corresponding arch | |
case ${{ matrix.job.arch }} in | |
aarch64) | |
export ARCH=arm64 | |
sed -i "s/x64\/release/arm64\/release/g" ./build.py | |
;; | |
armv7) | |
export ARCH=armhf | |
sed -i "s/x64\/release/arm\/release/g" ./build.py | |
;; | |
esac | |
export CARGO_INCREMENTAL=0 | |
python3 ./build.py --flutter --hwcodec --skip-cargo | |
# rpm package | |
echo -e "start packaging fedora package" | |
pushd /workspace | |
case ${{ matrix.job.arch }} in | |
armv7) | |
sed -i "s/64bit/32bit/g" ./res/rpm-flutter.spec | |
sed -i "s/linux\/x64/linux\/arm/g" ./res/rpm-flutter.spec | |
;; | |
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 }} | |
mkdir -p /opt/artifacts/rpm | |
for name in rustdesk*??.rpm; do | |
mv "$name" "/opt/artifacts/rpm/${name%%.rpm}.rpm" | |
done | |
# rpm suse package | |
echo -e "start packaging suse package" | |
pushd /workspace | |
case ${{ matrix.job.arch }} in | |
armv7) | |
sed -i "s/64bit/32bit/g" ./res/rpm-flutter-suse.spec | |
sed -i "s/linux\/x64/linux\/arm/g" ./res/rpm-flutter-suse.spec | |
;; | |
aarch64) | |
sed -i "s/linux\/x64/linux\/arm64/g" ./res/rpm-flutter-suse.spec | |
;; | |
esac | |
HBB=`pwd` rpmbuild ./res/rpm-flutter.spec -bb | |
pushd ~/rpmbuild/RPMS/${{ matrix.job.arch }} | |
mkdir -p /opt/artifacts/rpm | |
for name in rustdesk*??.rpm; do | |
mv "$name" "/opt/artifacts/rpm/${name%%.rpm}-suse.rpm" | |
done | |
- name: Rename rustdesk | |
shell: bash | |
run: | | |
for name in rustdesk*??.deb; do | |
cp "$name" "${name%%.deb}-${{ matrix.job.arch }}.deb" | |
done | |
- name: Publish debian package | |
if: matrix.job.extra-build-features == '' && 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 }}.deb | |
- name: Build appimage package | |
if: ${{ matrix.job.extra-build-features == 'appimage' }} | |
shell: bash | |
run: | | |
# 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: matrix.job.extra-build-features == 'appimage' && env.UPLOAD_ARTIFACT == 'true' | |
uses: softprops/action-gh-release@v1 | |
with: | |
prerelease: true | |
tag_name: ${{ env.TAG_NAME }} | |
files: | | |
./appimage/rustdesk-${{ env.VERSION }}-*.AppImage | |
- name: Upload Artifact | |
uses: actions/upload-artifact@master | |
if: ${{ contains(matrix.job.extra-build-features, 'flatpak') }} | |
with: | |
name: rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.deb | |
path: rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.deb | |
- name: Patch archlinux PKGBUILD | |
if: ${{ matrix.job.extra-build-features == '' }} | |
run: | | |
sed -i "s/arch=('x86_64')/arch=('${{ matrix.job.arch }}')/g" res/PKGBUILD | |
case ${{ matrix.job.arch }} in | |
armv7) | |
sed -i "s/linux\/x64/linux\/arm/g" ./res/PKGBUILD | |
;; | |
aarch64) | |
sed -i "s/linux\/x64/linux\/arm64/g" ./res/PKGBUILD | |
;; | |
esac | |
# Temporary disable for there is no many archlinux arm hosts | |
# - name: Build archlinux package | |
# if: ${{ matrix.job.extra-build-features == '' }} | |
# uses: vufa/arch-makepkg-action@master | |
# with: | |
# packages: > | |
# llvm | |
# clang | |
# libva | |
# libvdpau | |
# rust | |
# gstreamer | |
# unzip | |
# git | |
# cmake | |
# gcc | |
# curl | |
# wget | |
# nasm | |
# zip | |
# make | |
# pkg-config | |
# clang | |
# gtk3 | |
# xdotool | |
# libxcb | |
# libxfixes | |
# alsa-lib | |
# pipewire | |
# python | |
# ttf-arphic-uming | |
# libappindicator-gtk3 | |
# scripts: | | |
# cd res && HBB=`pwd`/.. FLUTTER=1 makepkg -f | |
# - name: Publish archlinux package | |
# if: ${{ matrix.job.extra-build-features == '' }} | |
# uses: softprops/action-gh-release@v1 | |
# with: | |
# prerelease: true | |
# tag_name: ${{ env.TAG_NAME }} | |
# files: | | |
# res/rustdesk*.zst | |
- name: Publish fedora package | |
if: matrix.job.extra-build-features == '' && env.UPLOAD_ARTIFACT == 'true' | |
uses: softprops/action-gh-release@v1 | |
with: | |
prerelease: true | |
tag_name: ${{ env.TAG_NAME }} | |
files: | | |
/opt/artifacts/rpm/*.rpm | |
build-rustdesk-linux-amd64: | |
needs: [build-rustdesk-lib-linux-amd64] | |
name: build-rustdesk ${{ matrix.job.target }} (${{ matrix.job.os }}) [${{ matrix.job.extra-build-features }}] | |
runs-on: ubuntu-20.04 | |
strategy: | |
fail-fast: false | |
matrix: | |
job: | |
# - { target: i686-unknown-linux-gnu , os: ubuntu-20.04, use-cross: true } | |
# - { target: i686-unknown-linux-musl , os: ubuntu-20.04, use-cross: true } | |
- { | |
arch: x86_64, | |
target: x86_64-unknown-linux-gnu, | |
os: ubuntu-18.04, | |
extra-build-features: "", | |
} | |
- { | |
arch: x86_64, | |
target: x86_64-unknown-linux-gnu, | |
os: ubuntu-18.04, | |
extra-build-features: "flatpak", | |
} | |
- { | |
arch: x86_64, | |
target: x86_64-unknown-linux-gnu, | |
os: ubuntu-18.04, | |
extra-build-features: "appimage", | |
} | |
# - { target: x86_64-unknown-linux-musl , os: ubuntu-20.04, use-cross: true } | |
steps: | |
- name: Checkout source code | |
uses: actions/checkout@v3 | |
- name: Restore bridge files | |
uses: actions/download-artifact@master | |
with: | |
name: bridge-artifact | |
path: ./ | |
- name: Prepare env | |
run: | | |
sudo apt-get update -y | |
sudo apt-get install -y \ | |
curl \ | |
git \ | |
libarchive-tools \ | |
libgtk-3-dev \ | |
nasm \ | |
wget | |
mkdir -p ./target/release/ | |
- name: Restore the rustdesk lib file | |
uses: actions/download-artifact@master | |
with: | |
name: librustdesk-${{ matrix.job.arch }}-${{ matrix.job.extra-build-features }}.so | |
path: ./target/release/ | |
- uses: rustdesk-org/run-on-arch-action@amd64-support | |
name: Build rustdesk binary for ${{ matrix.job.arch }} | |
id: vcpkg | |
with: | |
arch: ${{ matrix.job.arch }} | |
distro: ubuntu18.04 | |
githubToken: ${{ github.token }} | |
setup: | | |
ls -l "${PWD}" | |
dockerRunArgs: | | |
--volume "${PWD}:/workspace" | |
--volume "/opt/artifacts:/opt/artifacts" | |
shell: /bin/bash | |
install: | | |
apt-get update -y | |
apt-get install -y \ | |
build-essential \ | |
clang \ | |
cmake \ | |
curl \ | |
gcc \ | |
git \ | |
g++ \ | |
libappindicator3-dev \ | |
libgtk-3-dev \ | |
liblzma-dev \ | |
nasm \ | |
ninja-build \ | |
pkg-config \ | |
python3 \ | |
rpm \ | |
unzip \ | |
wget \ | |
xz-utils | |
run: | | |
# disable git safe.directory | |
git config --global --add safe.directory "*" | |
# Setup Flutter | |
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 | |
ls -l . | |
export PATH=/opt/flutter/bin:$PATH | |
flutter doctor -v | |
pushd /workspace | |
python3 ./build.py --flutter --hwcodec --skip-cargo | |
# rpm package | |
pushd /workspace | |
case ${{ matrix.job.arch }} in | |
armv7) | |
sed -i "s/64bit/32bit/g" ./res/rpm-flutter.spec | |
;; | |
esac | |
HBB=`pwd` rpmbuild ./res/rpm-flutter.spec -bb | |
pushd ~/rpmbuild/RPMS/${{ matrix.job.arch }} | |
mkdir -p /opt/artifacts/rpm | |
for name in rustdesk*??.rpm; do | |
mv "$name" "/opt/artifacts/rpm/${name%%.rpm}.rpm" | |
done | |
# rpm suse package | |
pushd /workspace | |
case ${{ matrix.job.arch }} in | |
armv7) | |
sed -i "s/64bit/32bit/g" ./res/rpm-flutter-suse.spec | |
;; | |
esac | |
HBB=`pwd` rpmbuild ./res/rpm-flutter-suse.spec -bb | |
pushd ~/rpmbuild/RPMS/${{ matrix.job.arch }} | |
mkdir -p /opt/artifacts/rpm | |
for name in rustdesk*??.rpm; do | |
mv "$name" "/opt/artifacts/rpm/${name%%.rpm}-suse.rpm" | |
done | |
- 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 }}.deb" | |
done | |
- name: Publish debian package | |
if: matrix.job.extra-build-features == '' && 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 }}.deb | |
- name: Upload Artifact | |
uses: actions/upload-artifact@master | |
if: ${{ contains(matrix.job.extra-build-features, 'flatpak') }} | |
with: | |
name: rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.deb | |
path: rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.deb | |
- name: Patch archlinux PKGBUILD | |
if: ${{ matrix.job.extra-build-features == '' }} | |
run: | | |
sed -i "s/arch=('x86_64')/arch=('${{ matrix.job.arch }}')/g" res/PKGBUILD | |
- name: Build archlinux package | |
if: ${{ matrix.job.extra-build-features == '' }} | |
uses: rustdesk-org/arch-makepkg-action@master | |
with: | |
packages: > | |
llvm | |
clang | |
libva | |
libvdpau | |
rust | |
gstreamer | |
unzip | |
git | |
cmake | |
gcc | |
curl | |
wget | |
nasm | |
zip | |
make | |
pkg-config | |
clang | |
gtk3 | |
xdotool | |
libxcb | |
libxfixes | |
alsa-lib | |
pipewire | |
python | |
ttf-arphic-uming | |
libappindicator-gtk3 | |
pam | |
gst-plugins-base | |
gst-plugin-pipewire | |
scripts: | | |
cd res && HBB=`pwd`/.. FLUTTER=1 makepkg -f | |
- name: Publish archlinux package | |
if: matrix.job.extra-build-features == '' && env.UPLOAD_ARTIFACT == 'true' | |
uses: softprops/action-gh-release@v1 | |
with: | |
prerelease: true | |
tag_name: ${{ env.TAG_NAME }} | |
files: | | |
res/rustdesk-${{ env.VERSION }}*.zst | |
- name: Build appimage package | |
if: matrix.job.extra-build-features == 'appimage' && env.UPLOAD_ARTIFACT == 'true' | |
shell: bash | |
run: | | |
# 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-x86_64.yml | |
- name: Publish appimage package | |
if: matrix.job.extra-build-features == 'appimage' && env.UPLOAD_ARTIFACT == 'true' | |
uses: softprops/action-gh-release@v1 | |
with: | |
prerelease: true | |
tag_name: ${{ env.TAG_NAME }} | |
files: | | |
./appimage/rustdesk-${{ env.VERSION }}-*.AppImage | |
- name: Publish fedora package | |
if: matrix.job.extra-build-features == '' && env.UPLOAD_ARTIFACT == 'true' | |
uses: softprops/action-gh-release@v1 | |
with: | |
prerelease: true | |
tag_name: ${{ env.TAG_NAME }} | |
files: | | |
/opt/artifacts/rpm/*.rpm | |
# Temporary disable flatpak arm build | |
# | |
# build-flatpak-arm: | |
# name: Build Flatpak | |
# needs: [build-rustdesk-linux-arm] | |
# runs-on: ${{ matrix.job.os }} | |
# strategy: | |
# fail-fast: false | |
# matrix: | |
# job: | |
# # - { target: aarch64-unknown-linux-gnu , os: ubuntu-18.04, arch: arm64 } | |
# - { target: aarch64-unknown-linux-gnu, os: ubuntu-20.04, arch: arm64 } | |
# steps: | |
# - name: Checkout source code | |
# uses: actions/checkout@v3 | |
# - name: Download Binary | |
# uses: actions/download-artifact@master | |
# with: | |
# name: rustdesk-${{ env.VERSION }}-${{ matrix.job.target }}-${{ matrix.job.os }}.deb | |
# path: . | |
# - name: Rename Binary | |
# run: | | |
# mv rustdesk-${{ env.VERSION }}-${{ matrix.job.target }}-${{ matrix.job.os }}.deb rustdesk-${{ env.VERSION }}.deb | |
# - uses: rustdesk-org/run-on-arch-action@amd64-support | |
# name: Build rustdesk flatpak package for ${{ matrix.job.arch }} | |
# id: rpm | |
# with: | |
# arch: ${{ matrix.job.arch }} | |
# distro: ubuntu18.04 | |
# githubToken: ${{ github.token }} | |
# setup: | | |
# ls -l "${PWD}" | |
# dockerRunArgs: | | |
# --volume "${PWD}:/workspace" | |
# shell: /bin/bash | |
# install: | | |
# apt-get update -y | |
# apt-get install -y rpm | |
# run: | | |
# 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.target }}.flatpak org.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.target }}.flatpak | |
build-flatpak-amd64: | |
name: Build Flatpak | |
needs: [build-rustdesk-linux-amd64] | |
runs-on: ubuntu-20.04 | |
strategy: | |
fail-fast: false | |
matrix: | |
job: | |
- { target: x86_64-unknown-linux-gnu, os: ubuntu-18.04, arch: x86_64 } | |
steps: | |
- name: Checkout source code | |
uses: actions/checkout@v3 | |
- 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 rustdesk-${{ env.VERSION }}.deb | |
- uses: rustdesk-org/run-on-arch-action@amd64-support | |
name: Build rustdesk flatpak package for ${{ matrix.job.arch }} | |
id: rpm | |
with: | |
arch: ${{ matrix.job.arch }} | |
distro: ubuntu18.04 | |
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 }}.flatpak com.rustdesk.RustDesk | |
- name: Publish flatpak package | |
uses: softprops/action-gh-release@v1 | |
if: env.UPLOAD_ARTIFACT == 'true' | |
with: | |
prerelease: true | |
tag_name: ${{ env.TAG_NAME }} | |
files: | | |
flatpak/rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.flatpak | |
build-rustdesk-web: | |
name: build-rustdesk-web | |
runs-on: ubuntu-20.04 | |
strategy: | |
fail-fast: false | |
matrix: | |
job: | |
- { arch: x86_64, target: x86_64-unknown-linux-gnu, os: ubuntu-18.04 } | |
env: | |
RELEASE_NAME: web-basic | |
steps: | |
- name: Checkout source code | |
uses: actions/checkout@v3 | |
- name: Prepare env | |
run: | | |
sudo apt-get update -y | |
sudo apt-get install -y wget npm | |
- name: Install flutter | |
uses: subosito/[email protected] #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 [email protected] | |
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 |