From 4e63c834f58ab0ef25eba83bf4ed634c451cf5a8 Mon Sep 17 00:00:00 2001 From: lejianwen <84855512@qq.com> Date: Mon, 1 Sep 2025 08:16:19 +0800 Subject: [PATCH] chore: Add build test --- .github/workflows/build-test.yaml | 182 ++++++++++++++++++++++++++++++ 1 file changed, 182 insertions(+) create mode 100644 .github/workflows/build-test.yaml diff --git a/.github/workflows/build-test.yaml b/.github/workflows/build-test.yaml new file mode 100644 index 0000000..91cd068 --- /dev/null +++ b/.github/workflows/build-test.yaml @@ -0,0 +1,182 @@ +name: build-test + +# ------------- 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_USERNAME is the username you normally use to login at https://hub.docker.com/ +# DOCKER_PASSWORD is a token you should create under "account settings / security" with read/write access + +on: + workflow_dispatch: + push: + tags: + - 'test.*' + +env: + CARGO_TERM_COLOR: always + LATEST_TAG: latest + +jobs: + + # binary build + build: + + name: Build - ${{ matrix.job.name }} + runs-on: ubuntu-24.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: stable + 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 + + + # docker build and push of single-arch images + docker: + + name: Docker push - ${{ matrix.job.name }} + needs: build + runs-on: ubuntu-24.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_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - 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.GIT_TAG }}-${{ matrix.job.name }} + labels: ${{ steps.meta.outputs.labels }} + + # docker build and push of multiarch images + docker-manifest: + + name: Docker manifest s6 + needs: docker + runs-on: ubuntu-24.04 + + steps: + + - name: Log in to Docker Hub + if: github.event_name != 'pull_request' + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_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 + + # 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@master + if: github.event_name != 'workflow_dispatch' + with: + tags: ${{ secrets.DOCKER_IMAGE }}:${{ env.GIT_TAG }} + inputs: | + ${{ 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 \ No newline at end of file