1+ name : Release
2+
3+ on :
4+ push :
5+ tags :
6+ - ' v*.*.*' # Trigger on version tags like v1.0.0
7+ workflow_dispatch : # Allows manual triggering
8+
9+ permissions :
10+ contents : write # Needed to create releases and upload assets
11+
12+ env :
13+ CARGO_TERM_COLOR : always
14+ CRATE_NAME : rustdocs_mcp_server
15+
16+ jobs :
17+ create_release :
18+ name : Create Release
19+ runs-on : ubuntu-latest
20+ outputs :
21+ upload_url : ${{ steps.create_release.outputs.upload_url }}
22+ steps :
23+ - name : Create Release
24+ id : create_release
25+ uses : actions/create-release@v1
26+ env :
27+ GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
28+ with :
29+ tag_name : ${{ github.ref_name }}
30+ release_name : Release ${{ github.ref_name }}
31+ body : |
32+ Automated release for ${{ github.ref_name }}
33+ draft : false
34+ prerelease : false
35+
36+ build_release :
37+ name : Build Release Assets
38+ needs : create_release
39+ strategy :
40+ matrix :
41+ include :
42+ - target : x86_64-unknown-linux-gnu
43+ os : ubuntu-latest
44+ asset_name_suffix : linux-x86_64
45+ - target : x86_64-apple-darwin
46+ os : macos-latest
47+ asset_name_suffix : macos-x86_64
48+ - target : aarch64-apple-darwin
49+ os : macos-latest # Can build aarch64 on x86_64 macOS runners
50+ asset_name_suffix : macos-aarch64
51+ - target : x86_64-pc-windows-msvc
52+ os : windows-latest
53+ asset_name_suffix : windows-x86_64.exe # Add .exe for Windows
54+
55+ runs-on : ${{ matrix.os }}
56+ steps :
57+ - name : Checkout code
58+ uses : actions/checkout@v4
59+
60+ - name : Set up Rust toolchain
61+ uses : dtolnay/rust-toolchain@stable
62+ with :
63+ targets : ${{ matrix.target }} # Ensure the target is installed for the host
64+
65+ - name : Install cross-rs
66+ if : runner.os != 'Windows' # cross doesn't work on Windows runners directly for MSVC target
67+ run : cargo install cross --git https://github.com/cross-rs/cross --rev 1131999 # Use specific rev for stability
68+
69+ - name : Build binary (cross)
70+ if : runner.os != 'Windows'
71+ run : cross build --release --target ${{ matrix.target }} --verbose
72+ env :
73+ # Set linker for Linux MUSL if needed, otherwise default GNU is fine
74+ # For macOS, default linker works
75+ CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_LINKER : gcc
76+ # Add other specific env vars if needed for cross-compilation
77+
78+ - name : Build binary (native Windows)
79+ if : runner.os == 'Windows'
80+ run : cargo build --release --target ${{ matrix.target }} --verbose
81+
82+ - name : Determine Artifact Path and Name
83+ id : artifact_details
84+ shell : bash
85+ run : |
86+ BINARY_NAME="${{ env.CRATE_NAME }}"
87+ ASSET_SUFFIX="${{ matrix.asset_name_suffix }}"
88+ TARGET_DIR="target/${{ matrix.target }}/release"
89+
90+ if [[ "${{ matrix.os }}" == "windows-latest" ]]; then
91+ BINARY_PATH="$TARGET_DIR/$BINARY_NAME.exe"
92+ ASSET_NAME="$BINARY_NAME-$ASSET_SUFFIX" # Suffix already includes .exe
93+ else
94+ BINARY_PATH="$TARGET_DIR/$BINARY_NAME"
95+ ASSET_NAME="$BINARY_NAME-$ASSET_SUFFIX"
96+ fi
97+
98+ echo "Calculated binary path: $BINARY_PATH"
99+ echo "Calculated asset name: $ASSET_NAME"
100+
101+ # Check if the binary exists
102+ if [[ ! -f "$BINARY_PATH" ]]; then
103+ echo "Error: Binary not found at $BINARY_PATH"
104+ # List directory contents for debugging
105+ echo "Listing contents of $TARGET_DIR:"
106+ ls -l "$TARGET_DIR"
107+ exit 1
108+ fi
109+
110+ echo "binary_path=$BINARY_PATH" >> $GITHUB_OUTPUT
111+ echo "asset_name=$ASSET_NAME" >> $GITHUB_OUTPUT
112+
113+
114+ - name : Upload Release Asset
115+ uses : actions/upload-release-asset@v1
116+ env :
117+ GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
118+ with :
119+ upload_url : ${{ needs.create_release.outputs.upload_url }}
120+ asset_path : ${{ steps.artifact_details.outputs.binary_path }}
121+ asset_name : ${{ steps.artifact_details.outputs.asset_name }}
122+ asset_content_type : application/octet-stream
0 commit comments