Build for linux only #2
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 for linux only | |
on: | |
workflow_dispatch: | |
inputs: | |
upload-artifact: | |
type: boolean | |
default: true | |
upload-tag: | |
type: string | |
default: "nightly" | |
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: | |
generate-bridge-linux: | |
uses: ./.github/workflows/bridge.yml | |
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-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 |