name: Release on: push: tags: ["v*"] permissions: contents: write packages: write env: CARGO_TERM_COLOR: always RUSTFLAGS: "--cfg reqwest_unstable" jobs: build: name: Build ${{ matrix.target }} runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: include: - target: x86_64-apple-darwin os: macos-latest - target: aarch64-apple-darwin os: macos-latest - target: x86_64-unknown-linux-gnu os: ubuntu-latest - target: aarch64-unknown-linux-gnu os: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@stable with: targets: ${{ matrix.target }} - uses: Swatinem/rust-cache@v2 with: key: ${{ matrix.target }} # Cross-compilation support for aarch64-linux - name: Install cross-compilation tools if: matrix.target == 'aarch64-unknown-linux-gnu' run: | sudo apt-get update sudo apt-get install -y gcc-aarch64-linux-gnu echo "CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=aarch64-linux-gnu-gcc" >> $GITHUB_ENV - name: Build run: cargo build --release --target ${{ matrix.target }} - name: Package shell: bash run: | tag="${GITHUB_REF#refs/tags/}" staging="webclaw-${tag}-${{ matrix.target }}" mkdir "$staging" cp target/${{ matrix.target }}/release/webclaw "$staging/" 2>/dev/null || true cp target/${{ matrix.target }}/release/webclaw-mcp "$staging/" 2>/dev/null || true cp README.md LICENSE "$staging/" tar czf "$staging.tar.gz" "$staging" echo "ASSET=$staging.tar.gz" >> $GITHUB_ENV - name: Upload artifact uses: actions/upload-artifact@v4 with: name: ${{ matrix.target }} path: ${{ env.ASSET }} release: name: Release needs: build runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/download-artifact@v4 with: path: artifacts - name: Compute checksums run: | cd artifacts find . -name '*.tar.gz' -exec mv {} . \; sha256sum *.tar.gz > SHA256SUMS cat SHA256SUMS - name: Create GitHub Release uses: softprops/action-gh-release@v2 with: generate_release_notes: true files: | artifacts/*.tar.gz artifacts/SHA256SUMS docker: name: Docker needs: release runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: docker/setup-qemu-action@v3 with: platforms: arm64 - uses: docker/setup-buildx-action@v3 - uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} # Download pre-built binaries for both architectures - name: Download release binaries run: | tag="${GITHUB_REF#refs/tags/}" for target in x86_64-unknown-linux-gnu aarch64-unknown-linux-gnu; do dir="webclaw-${tag}-${target}" curl -sSL "https://github.com/0xMassi/webclaw/releases/download/${tag}/${dir}.tar.gz" -o "${target}.tar.gz" tar xzf "${target}.tar.gz" mkdir -p "binaries-${target}" cp "${dir}/webclaw" "binaries-${target}/webclaw" cp "${dir}/webclaw-mcp" "binaries-${target}/webclaw-mcp" chmod +x "binaries-${target}"/* done ls -laR binaries-*/ # Build per-arch images with plain docker build (no buildx manifest nesting) - name: Build and push run: | tag="${GITHUB_REF#refs/tags/}" # amd64 docker build -f Dockerfile.ci --build-arg BINARY_DIR=binaries-x86_64-unknown-linux-gnu \ --platform linux/amd64 -t ghcr.io/0xmassi/webclaw:${tag}-amd64 --push . # arm64 docker build -f Dockerfile.ci --build-arg BINARY_DIR=binaries-aarch64-unknown-linux-gnu \ --platform linux/arm64 -t ghcr.io/0xmassi/webclaw:${tag}-arm64 --push . # Multi-arch manifest docker manifest create ghcr.io/0xmassi/webclaw:${tag} \ ghcr.io/0xmassi/webclaw:${tag}-amd64 \ ghcr.io/0xmassi/webclaw:${tag}-arm64 docker manifest push ghcr.io/0xmassi/webclaw:${tag} docker manifest create ghcr.io/0xmassi/webclaw:latest \ ghcr.io/0xmassi/webclaw:${tag}-amd64 \ ghcr.io/0xmassi/webclaw:${tag}-arm64 docker manifest push ghcr.io/0xmassi/webclaw:latest homebrew: name: Update Homebrew needs: release runs-on: ubuntu-latest steps: - name: Update Homebrew formula uses: mislav/bump-homebrew-formula-action@v3 with: formula-name: webclaw homebrew-tap: 0xMassi/homebrew-webclaw download-url: https://github.com/0xMassi/webclaw/releases/download/${{ github.ref_name }}/webclaw-${{ github.ref_name }}-aarch64-apple-darwin.tar.gz env: COMMITTER_TOKEN: ${{ secrets.HOMEBREW_TAP_TOKEN }}