name: Release on: push: tags: - "v*" workflow_dispatch: inputs: tag: description: "Existing release tag to build and attach binaries to (for example v0.2.3)" required: true pull_request: paths: - ".github/workflows/release.yml" - "Cargo.toml" - "crates/*/Cargo.toml" - "Cargo.lock" - "package.json" - "npm/idx-mcp/package.json" - "scripts/install.js" - "install.sh" permissions: contents: write env: RELEASE_TAG: ${{ github.event_name == 'workflow_dispatch' && inputs.tag || github.ref_name }} jobs: build: name: Build ${{ matrix.asset }} runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: include: - os: ubuntu-latest target: x86_64-unknown-linux-musl asset: linux-x64 - os: ubuntu-24.04-arm target: aarch64-unknown-linux-musl asset: linux-arm64 - os: macos-14 target: aarch64-apple-darwin asset: darwin-arm64 - os: macos-14 target: x86_64-apple-darwin asset: darwin-x64 steps: - name: Check out source uses: actions/checkout@v4 with: ref: ${{ github.event_name == 'workflow_dispatch' && inputs.tag || github.ref }} - name: Install Rust toolchain and target uses: dtolnay/rust-toolchain@stable with: targets: ${{ matrix.target }} - name: Install musl toolchain if: endsWith(matrix.target, '-linux-musl') run: sudo apt-get update && sudo apt-get install --yes musl-tools - name: Build release binary shell: bash run: | target="${{ matrix.target }}" if [[ "$target" == *-linux-musl ]]; then # Bundled SQLite and ring compile C code; build it against musl too. export "CC_${target//-/_}=musl-gcc" fi cargo build --release --locked --target "$target" -p idx-cli -p idx-mcp for bin in idx idx-mcp; do cp "target/${{ matrix.target }}/release/$bin" "$bin-${{ matrix.asset }}" chmod 0755 "$bin-${{ matrix.asset }}" done - name: Check binaries run if: matrix.target != 'x86_64-apple-darwin' run: | ./idx-${{ matrix.asset }} --help >/dev/null ./idx-mcp-${{ matrix.asset }} --help >/dev/null - name: Upload target artifacts uses: actions/upload-artifact@v4 with: name: idx-${{ matrix.asset }} path: | idx-${{ matrix.asset }} idx-mcp-${{ matrix.asset }} if-no-files-found: error publish: name: Attach binaries to release needs: build if: github.event_name != 'pull_request' runs-on: ubuntu-latest steps: - name: Check out install script uses: actions/checkout@v4 with: ref: ${{ github.event_name == 'workflow_dispatch' && inputs.tag || github.ref }} sparse-checkout: install.sh sparse-checkout-cone-mode: false path: src - name: Download target artifacts uses: actions/download-artifact@v4 with: pattern: idx-* merge-multiple: true - name: Write checksums run: | sha256sum \ idx-linux-x64 idx-linux-arm64 idx-darwin-arm64 idx-darwin-x64 \ idx-mcp-linux-x64 idx-mcp-linux-arm64 idx-mcp-darwin-arm64 idx-mcp-darwin-x64 \ > SHA256SUMS - name: Attach binaries to the version tag uses: softprops/action-gh-release@v2 with: tag_name: ${{ env.RELEASE_TAG }} files: | idx-linux-x64 idx-linux-arm64 idx-darwin-arm64 idx-darwin-x64 idx-mcp-linux-x64 idx-mcp-linux-arm64 idx-mcp-darwin-arm64 idx-mcp-darwin-x64 SHA256SUMS src/install.sh