Skip to content

Commit de51df6

Browse files
authored
Add workflow to build binaries after a release is created (#35)
1 parent 0594c81 commit de51df6

File tree

10 files changed

+77
-46
lines changed

10 files changed

+77
-46
lines changed

.github/workflows/release.yml

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
name: Release
2+
3+
on:
4+
release:
5+
types: [published]
6+
7+
jobs:
8+
build:
9+
name: Build and Upload
10+
runs-on: ${{ matrix.os }}
11+
timeout-minutes: 60
12+
permissions:
13+
contents: write
14+
attestations: write
15+
id-token: write
16+
strategy:
17+
matrix:
18+
include:
19+
- os: ubuntu-22.04
20+
target: x86_64-unknown-linux-gnu
21+
asset_name: substrate-mcp-linux-x86_64
22+
- os: macos-latest
23+
target: x86_64-apple-darwin
24+
asset_name: substrate-mcp-macos-x86_64
25+
- os: macos-latest
26+
target: aarch64-apple-darwin
27+
asset_name: substrate-mcp-macos-aarch64
28+
29+
steps:
30+
- name: Checkout code
31+
uses: actions/checkout@v4
32+
33+
- name: Setup Rust
34+
uses: dtolnay/rust-toolchain@stable
35+
with:
36+
targets: ${{ matrix.target }}
37+
38+
- name: Build binary
39+
run: cargo build --release --target ${{ matrix.target }}
40+
41+
- name: Create release directory
42+
run: mkdir -p release
43+
44+
- name: Copy binary to release directory
45+
run: cp target/${{ matrix.target }}/release/substrate-mcp release/${{ matrix.asset_name }}
46+
47+
- name: Create tarball
48+
run: |
49+
cd release
50+
tar -czf ${{ matrix.asset_name }}.tar.gz ${{ matrix.asset_name }}
51+
rm ${{ matrix.asset_name }}
52+
53+
- name: Generate build attestation
54+
uses: actions/attest-build-provenance@v1
55+
with:
56+
subject-path: ./release/${{ matrix.asset_name }}.tar.gz
57+
58+
- name: Upload tarball
59+
uses: actions/upload-release-asset@v1
60+
env:
61+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
62+
with:
63+
upload_url: ${{ github.event.release.upload_url }}
64+
asset_path: ./release/${{ matrix.asset_name }}.tar.gz
65+
asset_name: ${{ matrix.asset_name }}.tar.gz
66+
asset_content_type: application/gzip
67+

src/service/prompts/analyze_release.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ pub(crate) async fn generate_prompt(args: AnalyzeReleaseArgs) -> Vec<PromptMessa
3030

3131
let content = handlebars
3232
.render_template(TEMPLATE, &context)
33-
.unwrap_or_else(|e| format!("Template rendering failed: {}", e));
33+
.unwrap_or_else(|e| format!("Template rendering failed: {e}"));
3434

3535
vec![PromptMessage::new_text(PromptMessageRole::User, content)]
3636
}

src/service/prompts/get_started.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ pub(crate) async fn generate_prompt(args: GetStartedArgs) -> Vec<PromptMessage>
2424

2525
let content = handlebars
2626
.render_template(TEMPLATE, &context)
27-
.unwrap_or_else(|e| format!("Template rendering failed: {}", e));
27+
.unwrap_or_else(|e| format!("Template rendering failed: {e}"));
2828

2929
vec![PromptMessage::new_text(PromptMessageRole::User, content)]
3030
}

src/service/prompts/release_comparison.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,14 @@ pub(crate) async fn generate_prompt(
3535

3636
let content = handlebars
3737
.render_template(TEMPLATE, &context)
38-
.map_err(|e| McpError::internal_error(format!("Template rendering failed: {}", e), None))?;
38+
.map_err(|e| McpError::internal_error(format!("Template rendering failed: {e}"), None))?;
3939

4040
let description = handlebars
4141
.render_template(
4242
"Compare changes between Polkadot SDK versions {{current_version}} and {{target_version}}",
4343
&context
4444
)
45-
.map_err(|e| McpError::internal_error(format!("Description template rendering failed: {}", e), None))?;
45+
.map_err(|e| McpError::internal_error(format!("Description template rendering failed: {e}"), None))?;
4646

4747
Ok(GetPromptResult {
4848
description: Some(description),

src/service/prompts/scaffold_pallet.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ pub(crate) async fn generate_prompt(args: ScaffoldPalletArgs) -> Vec<PromptMessa
2727

2828
let content = handlebars
2929
.render_template(TEMPLATE, &context)
30-
.unwrap_or_else(|e| format!("Template rendering failed: {}", e));
30+
.unwrap_or_else(|e| format!("Template rendering failed: {e}"));
3131

3232
vec![PromptMessage::new_text(PromptMessageRole::User, content)]
3333
}

src/service/prompts/security_review.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ pub(crate) async fn generate_prompt(args: SecurityReviewArgs) -> Vec<PromptMessa
3030

3131
let content = handlebars
3232
.render_template(TEMPLATE, &context)
33-
.unwrap_or_else(|e| format!("Template rendering failed: {}", e));
33+
.unwrap_or_else(|e| format!("Template rendering failed: {e}"));
3434

3535
vec![PromptMessage::new_text(PromptMessageRole::User, content)]
3636
}

src/service/tests/helpers/substrate_runner.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,5 @@ fn find_port_from_logs(stderr: ChildStderr) -> io::Result<u16> {
6464
}
6565
}
6666

67-
Err(io::Error::new(
68-
io::ErrorKind::Other,
69-
"Could not find RPC port in node logs",
70-
))
67+
Err(io::Error::other("Could not find RPC port in node logs"))
7168
}

src/service/tools/polkadot_sdk_releases.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -748,8 +748,7 @@ mod tests {
748748
for pr_num in &expected_prs_with_audience {
749749
assert!(
750750
all_indexed_prs.contains(pr_num),
751-
"PR {} is missing from audience index",
752-
pr_num
751+
"PR {pr_num} is missing from audience index"
753752
);
754753
}
755754

src/service/tools/substrate/events.rs

Lines changed: 1 addition & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -5,38 +5,6 @@ use subxt::PolkadotConfig;
55

66
use super::utils;
77

8-
/// Represents a decoded event from the chain
9-
#[derive(Debug, Clone, Serialize, Deserialize)]
10-
pub(crate) struct DecodedEvent {
11-
/// The pallet that emitted the event
12-
pub(crate) pallet: String,
13-
/// The event variant name
14-
pub(crate) variant: String,
15-
/// The block number where the event occurred
16-
pub(crate) block_number: u32,
17-
/// The block hash where the event occurred
18-
pub(crate) block_hash: String,
19-
/// The event index within the block
20-
pub(crate) event_index: u32,
21-
/// The decoded event data as JSON
22-
pub(crate) data: serde_json::Value,
23-
}
24-
25-
/// Filter criteria for event queries
26-
#[derive(Debug, Clone, Serialize, Deserialize)]
27-
pub(crate) struct EventFilter {
28-
/// Filter by pallet name (supports partial matching)
29-
pub(crate) pallet: Option<String>,
30-
/// Filter by event variant name (supports partial matching)
31-
pub(crate) variant: Option<String>,
32-
/// Start block number (inclusive)
33-
pub(crate) from_block: Option<u32>,
34-
/// End block number (inclusive)
35-
pub(crate) to_block: Option<u32>,
36-
/// Maximum number of events to return
37-
pub(crate) limit: Option<usize>,
38-
}
39-
408
/// Query events from blocks
419
#[derive(Debug, Clone, Serialize, Deserialize)]
4210
pub(crate) struct EventsQuery {
@@ -169,7 +137,7 @@ async fn decode_events_with_subxt(
169137

170138
// Decode event data
171139
let data = match event.field_values() {
172-
Ok(fields) => format!("{}", fields),
140+
Ok(fields) => format!("{fields}"),
173141
Err(e) => format!("Failed to decode call arguments: {e}"),
174142
};
175143

src/service/tools/substrate/extrinsic.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ async fn process_extrinsic(
236236

237237
// Decode call arguments
238238
let args = match extrinsic.field_values() {
239-
Ok(fields) => format!("{}", fields),
239+
Ok(fields) => format!("{fields}"),
240240
Err(e) => format!("Failed to decode call arguments: {e}"),
241241
};
242242

0 commit comments

Comments
 (0)