Skip to content

Commit

Permalink
ci: automatically lint and build CLI (#33)
Browse files Browse the repository at this point in the history
  • Loading branch information
collinjackson authored Nov 8, 2024
1 parent f7fe621 commit d9507aa
Show file tree
Hide file tree
Showing 7 changed files with 131 additions and 51 deletions.
64 changes: 64 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
name: ci

on:
push:
branches:
- main
pull_request:
branches:
- "**"

jobs:
build:
name: Lint CLI
runs-on: ubuntu-latest

steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
sparse-checkout: |
clients/cli
proto
- name: Set up Rust
uses: dtolnay/rust-toolchain@stable

- name: Install protoc
uses: arduino/setup-protoc@v3

- name: Set up Rust cache
uses: Swatinem/rust-cache@v2
with:
workspaces: ./clients/cli

- name: Format
working-directory: clients/cli
run: |
rustfmt src/**/*.rs --check --edition 2021
- name: Build
working-directory: clients/cli
run: |
cargo build --profile=ci-build
- name: Run cargo clippy
working-directory: clients/cli
run: |
cargo clippy --profile=ci-build --no-deps --all-targets --workspace -- -D warnings
- name: Test
working-directory: clients/cli
run: |
cargo test --profile=ci-build --tests
- name: Ensure checked in generated files are up to date
run: |
if [ -n "$(git status --porcelain)" ]; then \
echo "There are uncommitted changes in working tree after building."; \
git status; \
git --no-pager diff; \
exit 1; \
else \
echo "Git working tree is clean"; \
fi;
2 changes: 1 addition & 1 deletion clients/cli/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

24 changes: 18 additions & 6 deletions clients/cli/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "nexus-network"
version = "0.3.2"
version = "0.3.4"
edition = "2021"

[[bin]]
Expand All @@ -10,6 +10,23 @@ path = "src/prover.rs"
[build-dependencies]
prost-build = "0.13"

[profile.dev]
opt-level = 1

[profile.release]
lto = "fat"
strip = true
codegen-units = 1

[profile.ci-build]
inherits = "dev"
opt-level = 0
debug = 0
strip = "none"
lto = false
codegen-units = 256
incremental = true

[dependencies]
async-stream = "0.3"
clap = { version = "4.5", features = ["derive"] }
Expand Down Expand Up @@ -83,8 +100,3 @@ ark-vesta = { git = "https://github.com/arkworks-rs/curves/", rev = "8c0256a" }
ark-bls12-381 = { git = "https://github.com/arkworks-rs/curves/", rev = "3fded1f" }

zstd-sys = { git = "https://github.com/gyscos/zstd-rs" }

[profile.release]
strip = true
lto = true
codegen-units = 1
2 changes: 1 addition & 1 deletion clients/cli/src/analytics.rs
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ pub fn track(
let client = reqwest::Client::new();
let _ = client
.post("https://api.mixpanel.com/track?ip=1")
.body(format!("[{}]", body.to_string()))
.body(format!("[{}]", body))
.header(ACCEPT, "text/plain")
.header(CONTENT_TYPE, "application/json")
.send()
Expand Down
2 changes: 1 addition & 1 deletion clients/cli/src/config.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#[cfg(debug_assertions)]
pub fn analytics_token(_ws_addr_string: &str) -> String {
// Use one of the tokens in the release version if debugging analytics
return "".into();
"".into()
}

#[cfg(not(debug_assertions))]
Expand Down
80 changes: 46 additions & 34 deletions clients/cli/src/prover.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,8 @@ use nexus_core::{
init_circuit_trace, key::CanonicalSerialize, pp::gen_vm_pp, prove_seq_step, types::*,
},
};
use rand::RngCore;
use zstd::stream::Encoder;
use rand::{ RngCore };

#[derive(Parser, Debug)]
struct Args {
Expand Down Expand Up @@ -118,7 +118,7 @@ async fn main() {
contents: Some(prover_request::Contents::Registration(
ProverRequestRegistration {
prover_type: ProverType::Volunteer.into(),
prover_id: prover_id.clone().into(),
prover_id: prover_id.clone(),
estimated_proof_cycles_hertz: None,
},
)),
Expand All @@ -127,21 +127,25 @@ async fn main() {
let mut retries = 0;
let max_retries = 5;

loop {
if let Err(e) = client.send(Message::Binary(registration.encode_to_vec())).await {
eprintln!("Failed to send message: {:?}, attempt {}/{}", e, retries + 1, max_retries);

retries += 1;
if retries >= max_retries {
eprintln!("Max retries reached, exiting...");
break;
}
while let Err(e) = client
.send(Message::Binary(registration.encode_to_vec()))
.await
{
eprintln!(
"Failed to send message: {:?}, attempt {}/{}",
e,
retries + 1,
max_retries
);

// Add a delay before retrying
tokio::time::sleep(tokio::time::Duration::from_secs(u64::pow(2, retries))).await;
} else {
retries += 1;
if retries >= max_retries {
eprintln!("Max retries reached, exiting...");
break;
}

// Add a delay before retrying
tokio::time::sleep(tokio::time::Duration::from_secs(u64::pow(2, retries))).await;
}

track(
Expand Down Expand Up @@ -180,7 +184,7 @@ async fn main() {
);

let mut vm: NexusVM<MerkleTrie> =
parse_elf(&elf_bytes.as_ref()).expect("error loading and parsing RISC-V instruction");
parse_elf(elf_bytes.as_ref()).expect("error loading and parsing RISC-V instruction");
vm.syscalls.set_input(&input);

// TODO(collinjackson): Get outputs
Expand Down Expand Up @@ -244,18 +248,21 @@ async fn main() {
completed_fraction = steps_proven as f32 / steps_to_prove as f32;
let progress = ProverRequest {
contents: Some(prover_request::Contents::Progress(Progress {
completed_fraction: completed_fraction,
completed_fraction,
steps_in_trace: total_steps as i32,
steps_to_prove: steps_to_prove as i32,
steps_proven: steps_proven as i32,
steps_proven,
})),
};
let progress_duration = SystemTime::now().duration_since(progress_time).unwrap();
let cycles_proven = steps_proven * 4;
let proof_cycles_hertz = k as f64 * 1000.0 / progress_duration.as_millis() as f64;
track(
"progress".into(),
format!("Proved step {} at {:.2} proof cycles/sec.", step, proof_cycles_hertz),
format!(
"Proved step {} at {:.2} proof cycles/sec.",
step, proof_cycles_hertz
),
&ws_addr_string,
json!({
"completed_fraction": completed_fraction,
Expand All @@ -273,21 +280,22 @@ async fn main() {

let mut retries = 0;
let max_retries = 5;
loop {
if let Err(e) = client.send(Message::Binary(progress.encode_to_vec())).await {
eprintln!("Failed to send message: {:?}, attempt {}/{}", e, retries + 1, max_retries);

retries += 1;
if retries >= max_retries {
eprintln!("Max retries reached, exiting...");
break;
}

// Add a delay before retrying
tokio::time::sleep(tokio::time::Duration::from_secs(u64::pow(2, retries))).await;
} else {
while let Err(e) = client.send(Message::Binary(progress.encode_to_vec())).await {
eprintln!(
"Failed to send message: {:?}, attempt {}/{}",
e,
retries + 1,
max_retries
);

retries += 1;
if retries >= max_retries {
eprintln!("Max retries reached, exiting...");
break;
}

// Add a delay before retrying
tokio::time::sleep(tokio::time::Duration::from_secs(u64::pow(2, retries))).await;
}

if step == end - 1 {
Expand All @@ -305,14 +313,18 @@ async fn main() {
})),
};
let duration = SystemTime::now().duration_since(start_time).unwrap();
let proof_cycles_hertz = cycles_proven as f64 * 1000.0 / duration.as_millis() as f64;
let proof_cycles_hertz =
cycles_proven as f64 * 1000.0 / duration.as_millis() as f64;
client
.send(Message::Binary(response.encode_to_vec()))
.await
.unwrap();
.unwrap();
track(
"proof".into(),
format!("Proof sent! Overall speed was {:.2} proof cycles/sec.", proof_cycles_hertz),
format!(
"Proof sent! Overall speed was {:.2} proof cycles/sec.",
proof_cycles_hertz
),
&ws_addr_string,
json!({
"proof_duration_sec": duration.as_secs(),
Expand Down
8 changes: 0 additions & 8 deletions proto/generate_protobufs.sh

This file was deleted.

0 comments on commit d9507aa

Please sign in to comment.