ci: automatically lint and build CLI (#33)
This commit is contained in:
		
							parent
							
								
									f7fe621554
								
							
						
					
					
						commit
						d9507aa2ac
					
				
							
								
								
									
										64
									
								
								.github/workflows/ci.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								.github/workflows/ci.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -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
									
								
								clients/cli/Cargo.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										2
									
								
								clients/cli/Cargo.lock
									
									
									
										generated
									
									
									
								
							@ -1567,7 +1567,7 @@ dependencies = [
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "nexus-network"
 | 
			
		||||
version = "0.1.0"
 | 
			
		||||
version = "0.3.4"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "ark-bn254",
 | 
			
		||||
 "ark-crypto-primitives",
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,6 @@
 | 
			
		||||
[package]
 | 
			
		||||
name = "nexus-network"
 | 
			
		||||
version = "0.3.2"
 | 
			
		||||
version = "0.3.4"
 | 
			
		||||
edition = "2021"
 | 
			
		||||
 | 
			
		||||
[[bin]]
 | 
			
		||||
@ -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"] }
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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()
 | 
			
		||||
 | 
			
		||||
@ -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))]
 | 
			
		||||
 | 
			
		||||
@ -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 {
 | 
			
		||||
@ -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,
 | 
			
		||||
            },
 | 
			
		||||
        )),
 | 
			
		||||
@ -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);
 | 
			
		||||
    while 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;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // 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(
 | 
			
		||||
@ -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
 | 
			
		||||
@ -244,10 +248,10 @@ 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();
 | 
			
		||||
@ -255,7 +259,10 @@ async fn main() {
 | 
			
		||||
            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,
 | 
			
		||||
@ -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 {
 | 
			
		||||
@ -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(),
 | 
			
		||||
 | 
			
		||||
@ -1,8 +0,0 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
 | 
			
		||||
mkdir -p clients/flutter/lib/src/generated
 | 
			
		||||
protoc --experimental_allow_proto3_optional --dart_out=grpc:clients/flutter/lib/src/generated -Iproto proto/orchestrator.proto
 | 
			
		||||
dart format clients/flutter/lib/src/generated
 | 
			
		||||
(cd clients/dummy_client && cargo build || echo clients/dummy_client not found, possibly due to a sparse checkout.)
 | 
			
		||||
(cd clients/cli && cargo build || echo clients/cli not found, possibly due to a sparse checkout.)
 | 
			
		||||
(cd orchestrator && cargo build || echo orchestrator/ not found, possibly due a sparse checkout.)
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user