name: build

# ------------- NOTE
# please setup some secrets before running this workflow:
# DOCKER_IMAGE should be the target image name on docker hub (e.g. "rustdesk/rustdesk-server-s6" )
# DOCKER_IMAGE_CLASSIC should be the target image name on docker hub for the old build (e.g. "rustdesk/rustdesk-server" )
# DOCKER_HUB_USERNAME is the username you normally use to login at https://hub.docker.com/
# DOCKER_HUB_PASSWORD is a token you should create under "account settings / security" with read/write access

permissions:
  contents: read
  packages: write

on:
  workflow_dispatch:
  push:
    tags:
      - 'v[0-9]+.[0-9]+.[0-9]+'
      - '[0-9]+.[0-9]+.[0-9]+'
      - 'v[0-9]+.[0-9]+.[0-9]+-[0-9]+'
      - '[0-9]+.[0-9]+.[0-9]+-[0-9]+'

env:
  CARGO_TERM_COLOR: always
  LATEST_TAG: latest
  GHCR_IMAGE: ghcr.io/rustdesk/rustdesk-server-s6
  GHCR_IMAGE_CLASSIC: ghcr.io/rustdesk/rustdesk-server
  
jobs:

  # binary build
  build:

    name: Build - ${{ matrix.job.name }}
    runs-on: ubuntu-22.04
    strategy:
      fail-fast: false
      matrix:
        job:
          - { name: "amd64",   target: "x86_64-unknown-linux-musl" }
          - { name: "arm64v8", target: "aarch64-unknown-linux-musl" }
          - { name: "armv7",   target: "armv7-unknown-linux-musleabihf" }
          - { name: "i386",    target: "i686-unknown-linux-musl" }
          #- { name: "amd64fb",    target: "x86_64-unknown-freebsd" }

    steps:
      
      - name: Checkout
        uses: actions/checkout@v3
        with:
          submodules: recursive

      - name: Install toolchain
        uses: actions-rs/toolchain@v1
        with:
          toolchain: "1.90"
          override: true
          default: true
          components: rustfmt
          profile: minimal
          target: ${{ matrix.job.target }}

      - name: Build
        uses: actions-rs/cargo@v1
        with:
          command: build
          args: --release --all-features --target=${{ matrix.job.target }}
          use-cross: true  

      - name: Exec chmod
        run: chmod -v a+x target/${{ matrix.job.target }}/release/*

      - name: Publish Artifacts
        uses: actions/upload-artifact@v4
        with:
          name: binaries-linux-${{ matrix.job.name }}
          path: |
            target/${{ matrix.job.target }}/release/hbbr
            target/${{ matrix.job.target }}/release/hbbs
            target/${{ matrix.job.target }}/release/rustdesk-utils
          if-no-files-found: error

  build-win:
    name: Build - windows
    runs-on: windows-2022

    steps:
      
      - name: Checkout
        uses: actions/checkout@v3
        with:
          submodules: recursive

      - name: Install toolchain
        uses: actions-rs/toolchain@v1
        with:
          toolchain: "1.90"
          override: true
          default: true
          components: rustfmt
          profile: minimal
          target: x86_64-pc-windows-msvc

      - name: Build
        uses: actions-rs/cargo@v1
        with:
          command: build
          args: --release --all-features --target=x86_64-pc-windows-msvc
          use-cross: true

      - name: Install NSIS
        run: |
          iwr -useb get.scoop.sh -outfile 'install.ps1'
          .\install.ps1 -RunAsAdmin
          scoop update
          scoop bucket add extras
          scoop install nsis

      - name: Install Node.js
        uses: actions/setup-node@v3
        with:
          node-version: 16

      - name: Sign exe files
        uses: GermanBluefox/code-sign-action@v7
        if: false
        with:
          certificate: '${{ secrets.WINDOWS_PFX_BASE64 }}'
          password: '${{ secrets.WINDOWS_PFX_PASSWORD }}'
          certificatesha1: '${{ secrets.WINDOWS_PFX_SHA1_THUMBPRINT }}'
          folder: 'target\x86_64-pc-windows-msvc\release'
          recursive: false

      - name: Build UI browser file
        run: |
          npm i
          npm run build
        working-directory: ./ui/html

      - name: Build UI setup file
        run: |
          rustup default nightly
          cargo build --release
          xcopy /y ..\target\x86_64-pc-windows-msvc\release\*.exe setup\bin\
          xcopy /y target\release\*.exe setup\
          mkdir setup\logs
          makensis /V1 setup.nsi
          mkdir SignOutput
          mv RustDeskServer.Setup.exe SignOutput\
          mv ..\target\x86_64-pc-windows-msvc\release\*.exe SignOutput\
        working-directory: ./ui

      - name: Sign UI setup file 
        uses: GermanBluefox/code-sign-action@v7
        if: false
        with:
          certificate: '${{ secrets.WINDOWS_PFX_BASE64 }}'
          password: '${{ secrets.WINDOWS_PFX_PASSWORD }}'
          certificatesha1: '${{ secrets.WINDOWS_PFX_SHA1_THUMBPRINT }}'
          folder: './ui/SignOutput'
          recursive: false

      - name: Publish Artifacts
        uses: actions/upload-artifact@v4
        with:
          name: binaries-windows-x86_64
          path: |
            ui\SignOutput\hbbr.exe
            ui\SignOutput\hbbs.exe
            ui\SignOutput\rustdesk-utils.exe
            ui\SignOutput\RustDeskServer.Setup.exe
          if-no-files-found: error

  # github (draft) release with all binaries
  release:

    name: Github release
    needs: 
      - build
      - build-win
    runs-on: ubuntu-22.04
    strategy:
      fail-fast: false
      matrix:
        job:
          - { os: "linux", name: "amd64", suffix: "" }
          - { os: "linux", name: "arm64v8", suffix: "" }
          - { os: "linux", name: "armv7", suffix: "" }
          - { os: "linux", name: "i386", suffix: "" }
          #- { os: "linux", name: "amd64fb", suffix: "" }
          - { os: "windows", name: "x86_64", suffix: "-unsigned" }
          
    steps:

      - name: Download binaries (${{ matrix.job.os }} - ${{ matrix.job.name }})
        uses: actions/download-artifact@v4
        with:
          name: binaries-${{ matrix.job.os }}-${{ matrix.job.name }}
          path: ${{ matrix.job.name }}

      - name: Exec chmod
        run: chmod -v a+x ${{ matrix.job.name }}/*

      - name: Pack files (${{ matrix.job.os }} - ${{ matrix.job.name }})
        run: |
          sudo apt update
          DEBIAN_FRONTEND=noninteractive sudo apt install -y zip
          zip ${{ matrix.job.name }}/rustdesk-server-${{ matrix.job.os }}-${{ matrix.job.name }}${{ matrix.job.suffix }}.zip ${{ matrix.job.name }}/*

      - name: Create Release (${{ matrix.job.os }} - (${{ matrix.job.name }})
        uses: softprops/action-gh-release@v1
        with:
          draft: true
          files: ${{ matrix.job.name }}/rustdesk-server-${{ matrix.job.os }}-${{ matrix.job.name }}${{ matrix.job.suffix }}.zip
            
  # docker build and push of single-arch images
  docker:

    name: Docker push - ${{ matrix.job.name }}
    needs: build
    runs-on: ubuntu-22.04
    strategy:
      fail-fast: false
      matrix:
        job:
          - { name: "amd64",   docker_platform: "linux/amd64",  s6_platform: "x86_64" }
          - { name: "arm64v8", docker_platform: "linux/arm64",  s6_platform: "aarch64" }
          - { name: "armv7",   docker_platform: "linux/arm/v7", s6_platform: "armhf" }
          - { name: "i386",    docker_platform: "linux/386",    s6_platform: "i686" }

    steps:

      - name: Checkout
        uses: actions/checkout@v3
        with:
          submodules: recursive
        
      - name: Download binaries
        uses: actions/download-artifact@v4
        with:
          name: binaries-linux-${{ matrix.job.name }}
          path: docker/rootfs/usr/bin

      - name: Make binaries executable
        run: chmod -v a+x docker/rootfs/usr/bin/*

      - name: Set up QEMU
        uses: docker/setup-qemu-action@v2
      
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v2

      - name: Log in to Docker Hub
        if: github.event_name != 'pull_request'
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKER_HUB_USERNAME }}
          password: ${{ secrets.DOCKER_HUB_PASSWORD }}

      - name: Log in to GHCR
        if: github.event_name != 'pull_request'
        uses: docker/login-action@v2
        with:
          registry: ghcr.io
          username: rustdesk
          password: ${{ secrets.GITHUB_TOKEN }}
        
      - name: Extract metadata (tags, labels) for Docker
        id: meta
        uses: docker/metadata-action@v4
        with:
          images: registry.hub.docker.com/${{ secrets.DOCKER_IMAGE }}

      - name: Get git tag
        id: vars
        run: |
          T=${GITHUB_REF#refs/*/}
          M=${T%%.*}
          echo "GIT_TAG=$T" >> $GITHUB_ENV
          echo "MAJOR_TAG=$M" >> $GITHUB_ENV

      - name: Build and push Docker image
        uses: docker/build-push-action@v5
        with:
          context: "./docker"
          platforms: ${{ matrix.job.docker_platform }}
          push: true
          provenance: false
          build-args: |
            S6_ARCH=${{ matrix.job.s6_platform }}
          tags: |
            ${{ secrets.DOCKER_IMAGE }}:${{ env.LATEST_TAG }}-${{ matrix.job.name }}
            ${{ secrets.DOCKER_IMAGE }}:${{ env.GIT_TAG }}-${{ matrix.job.name }}
            ${{ secrets.DOCKER_IMAGE }}:${{ env.MAJOR_TAG }}-${{ matrix.job.name }}
            ${{ env.GHCR_IMAGE }}:${{ env.LATEST_TAG }}-${{ matrix.job.name }}
            ${{ env.GHCR_IMAGE }}:${{ env.GIT_TAG }}-${{ matrix.job.name }}
            ${{ env.GHCR_IMAGE }}:${{ env.MAJOR_TAG }}-${{ matrix.job.name }}
          labels: ${{ steps.meta.outputs.labels }}

  # docker build and push of multiarch images
  docker-manifest:

    name: Docker manifest
    needs: docker
    runs-on: ubuntu-22.04

    steps:

      - name: Log in to Docker Hub
        if: github.event_name != 'pull_request'
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKER_HUB_USERNAME }}
          password: ${{ secrets.DOCKER_HUB_PASSWORD }}

      - name: Get git tag
        id: vars
        run: |
          T=${GITHUB_REF#refs/*/}
          M=${T%%.*}
          echo "GIT_TAG=$T" >> $GITHUB_ENV
          echo "MAJOR_TAG=$M" >> $GITHUB_ENV

      - name: Log in to GHCR
        if: github.event_name != 'pull_request'
        uses: docker/login-action@v2
        with:
          registry: ghcr.io
          username: rustdesk
          password: ${{ secrets.GITHUB_TOKEN }}

      # manifest for :1.2.3 tag
      #  this has to run only if invoked by a new tag
      - name: Create and push manifest (:ve.rs.ion)
        uses: Noelware/docker-manifest-action@0.4.3
        if: github.event_name != 'workflow_dispatch'
        with:
          base-image: ${{ secrets.DOCKER_IMAGE }}:${{ env.GIT_TAG }}
          extra-images: ${{ secrets.DOCKER_IMAGE }}:${{ env.GIT_TAG }}-amd64,${{ secrets.DOCKER_IMAGE }}:${{ env.GIT_TAG }}-arm64v8,${{ secrets.DOCKER_IMAGE }}:${{ env.GIT_TAG }}-armv7,${{ secrets.DOCKER_IMAGE }}:${{ env.GIT_TAG }}-i386
          push: true

      # manifest for :1 tag (major release)
      - name: Create and push manifest (:major)
        uses: Noelware/docker-manifest-action@0.4.3
        with:
          base-image: ${{ secrets.DOCKER_IMAGE }}:${{ env.MAJOR_TAG }}
          extra-images: ${{ secrets.DOCKER_IMAGE }}:${{ env.MAJOR_TAG }}-amd64,${{ secrets.DOCKER_IMAGE }}:${{ env.MAJOR_TAG }}-arm64v8,${{ secrets.DOCKER_IMAGE }}:${{ env.MAJOR_TAG }}-armv7,${{ secrets.DOCKER_IMAGE }}:${{ env.MAJOR_TAG }}-i386
          push: true

      # manifest for :latest tag
      - name: Create and push manifest (:latest)
        uses: Noelware/docker-manifest-action@0.4.3
        with:
          base-image: ${{ secrets.DOCKER_IMAGE }}:${{ env.LATEST_TAG }}
          extra-images: ${{ secrets.DOCKER_IMAGE }}:${{ env.LATEST_TAG }}-amd64,${{ secrets.DOCKER_IMAGE }}:${{ env.LATEST_TAG }}-arm64v8,${{ secrets.DOCKER_IMAGE }}:${{ env.LATEST_TAG }}-armv7,${{ secrets.DOCKER_IMAGE }}:${{ env.LATEST_TAG }}-i386
          push: true

      # GHCR manifests
      # manifest for :1.2.3 tag
      - name: Create and push GHCR manifest (:ve.rs.ion)
        uses: Noelware/docker-manifest-action@0.4.3
        if: github.event_name != 'workflow_dispatch'
        with:
          base-image: ${{ env.GHCR_IMAGE }}:${{ env.GIT_TAG }}
          extra-images: ${{ env.GHCR_IMAGE }}:${{ env.GIT_TAG }}-amd64,${{ env.GHCR_IMAGE }}:${{ env.GIT_TAG }}-arm64v8,${{ env.GHCR_IMAGE }}:${{ env.GIT_TAG }}-armv7,${{ env.GHCR_IMAGE }}:${{ env.GIT_TAG }}-i386
          push: true

      # manifest for :1 tag (major release)
      - name: Create and push GHCR manifest (:major)
        uses: Noelware/docker-manifest-action@0.4.3
        with:
          base-image: ${{ env.GHCR_IMAGE }}:${{ env.MAJOR_TAG }}
          extra-images: ${{ env.GHCR_IMAGE }}:${{ env.MAJOR_TAG }}-amd64,${{ env.GHCR_IMAGE }}:${{ env.MAJOR_TAG }}-arm64v8,${{ env.GHCR_IMAGE }}:${{ env.MAJOR_TAG }}-armv7,${{ env.GHCR_IMAGE }}:${{ env.MAJOR_TAG }}-i386
          push: true

      # manifest for :latest tag
      - name: Create and push GHCR manifest (:latest)
        uses: Noelware/docker-manifest-action@0.4.3
        with:
          base-image: ${{ env.GHCR_IMAGE }}:${{ env.LATEST_TAG }}
          extra-images: ${{ env.GHCR_IMAGE }}:${{ env.LATEST_TAG }}-amd64,${{ env.GHCR_IMAGE }}:${{ env.LATEST_TAG }}-arm64v8,${{ env.GHCR_IMAGE }}:${{ env.LATEST_TAG }}-armv7,${{ env.GHCR_IMAGE }}:${{ env.LATEST_TAG }}-i386
          push: true

            
  # docker build and push of single-arch images
  docker-classic:

    name: Docker push - ${{ matrix.job.name }}
    needs: build
    runs-on: ubuntu-22.04
    strategy:
      fail-fast: false
      matrix:
        job:
          - { name: "amd64",   docker_platform: "linux/amd64" }
          - { name: "arm64v8", docker_platform: "linux/arm64" }
          - { name: "armv7",   docker_platform: "linux/arm/v7" }

    steps:

      - name: Checkout
        uses: actions/checkout@v3
        with:
          submodules: recursive
        
      - name: Download binaries
        uses: actions/download-artifact@v4
        with:
          name: binaries-linux-${{ matrix.job.name }}
          path: docker-classic/

      - name: Make binaries executable
        run: chmod -v a+x docker-classic/*

      - name: Set up QEMU
        uses: docker/setup-qemu-action@v2
      
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v2

      - name: Log in to Docker Hub
        if: github.event_name != 'pull_request'
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKER_HUB_USERNAME }}
          password: ${{ secrets.DOCKER_HUB_PASSWORD }}

      - name: Log in to GHCR
        if: github.event_name != 'pull_request'
        uses: docker/login-action@v2
        with:
          registry: ghcr.io
          username: rustdesk
          password: ${{ secrets.GITHUB_TOKEN }}
        
      - name: Extract metadata (tags, labels) for Docker
        id: meta
        uses: docker/metadata-action@v4
        with:
          images: registry.hub.docker.com/${{ secrets.DOCKER_IMAGE_CLASSIC }}

      - name: Get git tag
        id: vars
        run: |
          T=${GITHUB_REF#refs/*/}
          M=${T%%.*}
          echo "GIT_TAG=$T" >> $GITHUB_ENV
          echo "MAJOR_TAG=$M" >> $GITHUB_ENV

      - name: Build and push Docker image
        uses: docker/build-push-action@v5
        with:
          context: "./docker-classic"
          platforms: ${{ matrix.job.docker_platform }}
          push: true
          provenance: false
          tags: |
            ${{ secrets.DOCKER_IMAGE_CLASSIC }}:${{ env.LATEST_TAG }}-${{ matrix.job.name }}
            ${{ secrets.DOCKER_IMAGE_CLASSIC }}:${{ env.GIT_TAG }}-${{ matrix.job.name }}
            ${{ secrets.DOCKER_IMAGE_CLASSIC }}:${{ env.MAJOR_TAG }}-${{ matrix.job.name }}
            ${{ env.GHCR_IMAGE_CLASSIC }}:${{ env.LATEST_TAG }}-${{ matrix.job.name }}
            ${{ env.GHCR_IMAGE_CLASSIC }}:${{ env.GIT_TAG }}-${{ matrix.job.name }}
            ${{ env.GHCR_IMAGE_CLASSIC }}:${{ env.MAJOR_TAG }}-${{ matrix.job.name }}
          labels: ${{ steps.meta.outputs.labels }}

  # docker build and push of multiarch images
  docker-manifest-classic:

    name: Docker manifest
    needs: docker
    runs-on: ubuntu-22.04

    steps:

      - name: Log in to Docker Hub
        if: github.event_name != 'pull_request'
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKER_HUB_USERNAME }}
          password: ${{ secrets.DOCKER_HUB_PASSWORD }}

      - name: Get git tag
        id: vars
        run: |
          T=${GITHUB_REF#refs/*/}
          M=${T%%.*}
          echo "GIT_TAG=$T" >> $GITHUB_ENV
          echo "MAJOR_TAG=$M" >> $GITHUB_ENV

      - name: Log in to GHCR
        if: github.event_name != 'pull_request'
        uses: docker/login-action@v2
        with:
          registry: ghcr.io
          username: rustdesk
          password: ${{ secrets.GITHUB_TOKEN }}

      # manifest for :1.2.3 tag
      #  this has to run only if invoked by a new tag
      - name: Create and push manifest (:ve.rs.ion)
        uses: Noelware/docker-manifest-action@0.4.3
        if: github.event_name != 'workflow_dispatch'
        with:
          base-image: ${{ secrets.DOCKER_IMAGE_CLASSIC }}:${{ env.GIT_TAG }}
          extra-images: ${{ secrets.DOCKER_IMAGE_CLASSIC }}:${{ env.GIT_TAG }}-amd64,${{ secrets.DOCKER_IMAGE_CLASSIC }}:${{ env.GIT_TAG }}-arm64v8,${{ secrets.DOCKER_IMAGE_CLASSIC }}:${{ env.GIT_TAG }}-armv7
          push: true

      # manifest for :1 tag (major release)
      - name: Create and push manifest (:major)
        uses: Noelware/docker-manifest-action@0.4.3
        with:
          base-image: ${{ secrets.DOCKER_IMAGE_CLASSIC }}:${{ env.MAJOR_TAG }}
          extra-images: ${{ secrets.DOCKER_IMAGE_CLASSIC }}:${{ env.MAJOR_TAG }}-amd64,${{ secrets.DOCKER_IMAGE_CLASSIC }}:${{ env.MAJOR_TAG }}-arm64v8,${{ secrets.DOCKER_IMAGE_CLASSIC }}:${{ env.MAJOR_TAG }}-armv7
          push: true

      # manifest for :latest tag
      - name: Create and push manifest (:latest)
        uses: Noelware/docker-manifest-action@0.4.3
        with:
          base-image: ${{ secrets.DOCKER_IMAGE_CLASSIC }}:${{ env.LATEST_TAG }}
          extra-images: ${{ secrets.DOCKER_IMAGE_CLASSIC }}:${{ env.LATEST_TAG }}-amd64,${{ secrets.DOCKER_IMAGE_CLASSIC }}:${{ env.LATEST_TAG }}-arm64v8,${{ secrets.DOCKER_IMAGE_CLASSIC }}:${{ env.LATEST_TAG }}-armv7
          push: true

      # GHCR manifests
      # manifest for :1.2.3 tag
      - name: Create and push GHCR manifest (:ve.rs.ion)
        uses: Noelware/docker-manifest-action@0.4.3
        if: github.event_name != 'workflow_dispatch'
        with:
          base-image: ${{ env.GHCR_IMAGE_CLASSIC }}:${{ env.GIT_TAG }}
          extra-images: ${{ env.GHCR_IMAGE_CLASSIC }}:${{ env.GIT_TAG }}-amd64,${{ env.GHCR_IMAGE_CLASSIC }}:${{ env.GIT_TAG }}-arm64v8,${{ env.GHCR_IMAGE_CLASSIC }}:${{ env.GIT_TAG }}-armv7
          push: true

      # manifest for :1 tag (major release)
      - name: Create and push GHCR manifest (:major)
        uses: Noelware/docker-manifest-action@0.4.3
        with:
          base-image: ${{ env.GHCR_IMAGE_CLASSIC }}:${{ env.MAJOR_TAG }}
          extra-images: ${{ env.GHCR_IMAGE_CLASSIC }}:${{ env.MAJOR_TAG }}-amd64,${{ env.GHCR_IMAGE_CLASSIC }}:${{ env.MAJOR_TAG }}-arm64v8,${{ env.GHCR_IMAGE_CLASSIC }}:${{ env.MAJOR_TAG }}-armv7
          push: true

      # manifest for :latest tag
      - name: Create and push GHCR manifest (:latest)
        uses: Noelware/docker-manifest-action@0.4.3
        with:
          base-image: ${{ env.GHCR_IMAGE_CLASSIC }}:${{ env.LATEST_TAG }}
          extra-images: ${{ env.GHCR_IMAGE_CLASSIC }}:${{ env.LATEST_TAG }}-amd64,${{ env.GHCR_IMAGE_CLASSIC }}:${{ env.LATEST_TAG }}-arm64v8,${{ env.GHCR_IMAGE_CLASSIC }}:${{ env.LATEST_TAG }}-armv7
          push: true


  deb-package:

    name: debian package - ${{ matrix.job.name }}
    needs: build
    runs-on: ubuntu-22.04
    strategy:
      fail-fast: false
      matrix:
        job:
          - { name: "amd64",   debian_platform: "amd64",   crossbuild_package: "" }
          - { name: "arm64v8", debian_platform: "arm64",   crossbuild_package: "crossbuild-essential-arm64" }
          - { name: "armv7",   debian_platform: "armhf",   crossbuild_package: "crossbuild-essential-armhf" }
          - { name: "i386",    debian_platform: "i386",    crossbuild_package: "crossbuild-essential-i386" }

    steps:

      - name: Checkout
        uses: actions/checkout@v3
        with:
          submodules: recursive

      - name: Set up QEMU
        uses: docker/setup-qemu-action@v2

      - name: Create packaging env
        run: |
          sudo apt update
          DEBIAN_FRONTEND=noninteractive sudo apt install -y devscripts build-essential debhelper pkg-config ${{ matrix.job.crossbuild_package }}
          mkdir -p debian-build/${{ matrix.job.name }}/bin

      - name: Download binaries
        uses: actions/download-artifact@v4
        with:
          name: binaries-linux-${{ matrix.job.name }}
          path: debian-build/${{ matrix.job.name }}/bin

      - name: Build package for ${{ matrix.job.name }} arch
        run: |
          chmod -v a+x debian-build/${{ matrix.job.name }}/bin/*
          cp -vr debian systemd debian-build/${{ matrix.job.name }}/
          cat debian/control.tpl | sed 's/{{ ARCH }}/${{ matrix.job.debian_platform }}/' > debian-build/${{ matrix.job.name }}/debian/control
          cd debian-build/${{ matrix.job.name }}/
          debuild -i -us -uc -b -a${{ matrix.job.debian_platform }}

      - name: Create Release
        uses: softprops/action-gh-release@v1
        with:
          draft: true
          files: |
            debian-build/rustdesk-server-hbbr_*_${{ matrix.job.debian_platform }}.deb
            debian-build/rustdesk-server-hbbs_*_${{ matrix.job.debian_platform }}.deb
            debian-build/rustdesk-server-utils_*_${{ matrix.job.debian_platform }}.deb
