name: Release on: push: tags: - "v*.*.*" permissions: contents: write env: CARGO_TERM_COLOR: always jobs: # ── Build binaries (matrix — no release creation here) ───────────────────── build: name: Build (${{ matrix.target }}) runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: include: - os: ubuntu-latest target: x86_64-unknown-linux-gnu binary: fetchx archive: fetchx-linux-x86_64.tar.gz - os: ubuntu-latest target: aarch64-unknown-linux-gnu binary: fetchx archive: fetchx-linux-aarch64.tar.gz - os: ubuntu-latest target: armv7-unknown-linux-gnueabihf binary: fetchx archive: fetchx-linux-armv7.tar.gz - os: macos-latest target: x86_64-apple-darwin binary: fetchx archive: fetchx-macos-x86_64.tar.gz - os: macos-latest target: aarch64-apple-darwin binary: fetchx archive: fetchx-macos-aarch64.tar.gz steps: - uses: actions/checkout@v4 - name: Install Rust toolchain uses: dtolnay/rust-toolchain@stable with: targets: ${{ matrix.target }} - name: Install cross-compilation tools (aarch64) if: matrix.target == 'aarch64-unknown-linux-gnu' run: | sudo apt-get update sudo apt-get install -y gcc-aarch64-linux-gnu - name: Install cross-compilation tools (armv7) if: matrix.target == 'armv7-unknown-linux-gnueabihf' run: | sudo apt-get update sudo apt-get install -y gcc-arm-linux-gnueabihf - name: Build release binary run: cargo build --release --target ${{ matrix.target }} env: CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER: aarch64-linux-gnu-gcc CARGO_TARGET_ARMV7_UNKNOWN_LINUX_GNUEABIHF_LINKER: arm-linux-gnueabihf-gcc - name: Package binary run: | cd target/${{ matrix.target }}/release tar czf ../../../${{ matrix.archive }} ${{ matrix.binary }} cd ../../.. - name: Upload artifact uses: actions/upload-artifact@v4 with: name: ${{ matrix.archive }} path: ${{ matrix.archive }} # ── Create GitHub Release (single job — no race condition) ───────────────── release: name: Create GitHub Release runs-on: ubuntu-latest needs: build steps: - name: Download all artifacts uses: actions/download-artifact@v4 with: path: artifacts merge-multiple: true - name: Create release uses: softprops/action-gh-release@v2 with: files: artifacts/* generate_release_notes: true # ── Publish to crates.io (independent of release) ────────────────────────── publish: name: Publish to crates.io runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Install Rust toolchain uses: dtolnay/rust-toolchain@stable - name: Publish to crates.io run: cargo publish --token ${{ secrets.CARGO_REGISTRY_TOKEN }} env: CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}