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" ) # 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: - 'v[0-9]+.[0-9]+.[0-9]+' - '[0-9]+.[0-9]+.[0-9]+' env: CARGO_TERM_COLOR: always jobs: 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" } steps: - name: Checkout uses: actions/checkout@v3 - name: Install toolchain uses: actions-rs/toolchain@v1 with: toolchain: nightly override: true default: true 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: Run tests # run: cargo test --verbose - name: Publish Artifacts uses: actions/upload-artifact@v3 with: name: binaries-${{ matrix.job.name }} path: | target/${{ matrix.job.target }}/release/hbbr target/${{ matrix.job.target }}/release/hbbs if-no-files-found: error release: name: Github release needs: build runs-on: ubuntu-22.04 steps: - name: Download binaries (amd64) uses: actions/download-artifact@v3 with: name: binaries-amd64 path: amd64 - name: Download binaries (arm64v8) uses: actions/download-artifact@v3 with: name: binaries-arm64v8 path: arm64v8 - name: Download binaries (armv7) uses: actions/download-artifact@v3 with: name: binaries-armv7 path: armv7 - name: Download binaries (i386) uses: actions/download-artifact@v3 with: name: binaries-i386 path: i386 - name: Rename files run: for arch in amd64 arm64v8 armv7 i386 ; do for b in hbbr hbbs ; do mv -v ${arch}/${b} ${arch}/${b}-${arch} ; done ; done - name: Create Release uses: softprops/action-gh-release@v1 with: draft: true files: | amd64/* arm64v8/* armv7/* i386/* 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" } - { name: "arm64v8", docker_platform: "linux/arm64" } - { name: "armv7", docker_platform: "linux/arm/v7" } - { name: "i386", docker_platform: "linux/386" } steps: - name: Checkout uses: actions/checkout@v3 - name: Download binaries uses: actions/download-artifact@v3 with: name: binaries-${{ 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: Build and push Docker image uses: docker/build-push-action@v3 with: context: "./docker" platforms: ${{ matrix.job.docker_platform }} push: true tags: "${{ secrets.DOCKER_IMAGE }}:latest-${{ matrix.job.name }}" labels: ${{ steps.meta.outputs.labels }} 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_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - name: Create and push manifest uses: Noelware/docker-manifest-action@master with: base-image: ${{ secrets.DOCKER_IMAGE }}:latest extra-images: ${{ secrets.DOCKER_IMAGE }}:latest-amd64,${{ secrets.DOCKER_IMAGE }}:latest-arm64v8,${{ secrets.DOCKER_IMAGE }}:latest-armv7,${{ secrets.DOCKER_IMAGE }}:latest-i386 push: true