name: Release binaries for Linux and Docker on: push: branches: - main tags: - "v*.*.*" jobs: release-linux: runs-on: ${{ matrix.os }} if: github.ref_type == 'tag' strategy: fail-fast: false matrix: include: - os: ubuntu-24.04 arch: amd64 - os: ubuntu-24.04-arm arch: arm64 steps: - uses: actions/checkout@v4 - name: Install tauri dependencies run: | sudo apt-get update sudo apt-get install -y libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf - name: Install Binstall uses: cargo-bins/cargo-binstall@main - name: install Tauri run: cargo binstall tauri-cli --no-confirm - name: npm install (desktop) working-directory: desktop run: npm install - name: npm install (librqbit/webui) working-directory: crates/librqbit/webui run: npm install - name: cargo tauri build working-directory: desktop run: cargo tauri build --ci - name: Move files run: | mkdir -p builds find target/ -type f \( -name "*.deb" -o -name "*.AppImage" -o -name "*.rpm" \) -print0 | while IFS= read -r -d '' file; do mv "$file" ${{ github.workspace }}/builds/ done mv target/release/rqbit-desktop ${{ github.workspace }}/builds/rqbit-desktop-linux-${{ matrix.arch }} - uses: softprops/action-gh-release@v1 with: generate_release_notes: true files: | ${{ github.workspace }}/builds/* build-docker-cross: runs-on: ubuntu-latest strategy: fail-fast: true matrix: platform: [linux/arm/v7, linux/amd64, linux/arm64] steps: - uses: actions/checkout@v4 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 id: builder1 - name: Cache uses: actions/cache@v4 id: cache with: path: | usr-local-cargo-git-db usr-local-cargo-registry-cache usr-local-cargo-registry-index src-target key: docker-xx-v1-${{ matrix.platform }}-release save-always: true - name: inject cache into docker uses: reproducible-containers/buildkit-cache-dance@v3.1.0 with: cache-map: | { "usr-local-cargo-git-db": "/usr/local/cargo/git/db", "usr-local-cargo-registry-cache": "/usr/local/cargo/registry/cache", "usr-local-cargo-registry-index": "/usr/local/cargo/registry/index", "src-target": "/src/target" } skip-extraction: ${{ steps.cache.outputs.cache-hit }} - name: cross-compile the binary run: | set -e mkdir -p target/cross docker buildx ls mkdir -p target/cross/${{ matrix.platform }} docker build --builder ${{ steps.builder1.outputs.name }} \ --platform ${{ matrix.platform }} \ -f docker/Dockerfile.xx \ --output type=local,dest=target/cross/${{ matrix.platform }} ./ - name: list files run: find target/cross/ - name: generate-archive-key id: gen_artifact_key run: | echo "key=$(echo ${{ matrix.platform }} | tr '/' '-')" >> "$GITHUB_OUTPUT" - name: copy binary for release run: | cd target/cross cp -l ${{ matrix.platform }}/rqbit rqbit-${{ steps.gen_artifact_key.outputs.key }} - uses: softprops/action-gh-release@v1 if: ${{ github.ref_type == 'tag' }} with: generate_release_notes: true files: | target/cross/rqbit-${{ steps.gen_artifact_key.outputs.key }} - name: Archive target/cross/ uses: actions/upload-artifact@v4 with: name: ${{ steps.gen_artifact_key.outputs.key }} path: target/cross/${{ matrix.platform }}/rqbit build-push-docker-multiarch: runs-on: ubuntu-latest needs: build-docker-cross steps: - uses: actions/checkout@v4 - name: Docker meta id: meta uses: docker/metadata-action@v5 with: images: | ${{ vars.DOCKERHUB_USERNAME }}/rqbit, enable=${{ vars.DOCKERHUB_USERNAME != '' }} tags: | type=ref,event=branch type=semver,pattern={{version}} type=semver,pattern={{major}}.{{minor}} - uses: actions/download-artifact@v4 with: name: linux-arm-v7 path: target/cross/linux/arm/v7/ - uses: actions/download-artifact@v4 with: name: linux-arm64 path: target/cross/linux/arm64/ - uses: actions/download-artifact@v4 with: name: linux-amd64 path: target/cross/linux/amd64/ - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Login to Docker Hub if: "${{ vars.DOCKERHUB_USERNAME != '' }}" id: docker_login uses: docker/login-action@v3 with: username: ${{ vars.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Build and push uses: docker/build-push-action@v6 with: push: ${{ steps.docker_login.outcome == 'success' }} tags: ${{ steps.meta.outputs.tags }} platforms: linux/amd64,linux/arm64,linux/arm/v7 context: target/cross/ file: docker/Dockerfile