Files
lighthouse/testing/web3signer_tests/src/get_web3signer.rs
chonghe 522bd9e9c6 Update Rust Edition to 2024 (#7766)
* #7749

Thanks @dknopik and @michaelsproul for your help!
2025-08-13 03:04:31 +00:00

93 lines
3.0 KiB
Rust

//! This build script downloads the latest Web3Signer release and places it in the `OUT_DIR` so it
//! can be used for integration testing.
use reqwest::Client;
use std::env;
use std::fs;
use std::path::{Path, PathBuf};
use zip::ZipArchive;
/// Use `None` to download the latest Github release.
/// Use `Some("21.8.1")` to download a specific version.
const FIXED_VERSION_STRING: Option<&str> = None;
// This function no longer makes any attempt to avoid downloads, because in practice we use it
// with a fresh temp directory every time we run the tests. We might want to change this in future
// to enable reproducible/offline testing.
pub async fn download_binary(dest_dir: PathBuf) {
let version = if let Some(version) = FIXED_VERSION_STRING {
version.to_string()
} else if let Ok(env_version) = env::var("LIGHTHOUSE_WEB3SIGNER_VERSION") {
env_version
} else {
// The Consenys artifact server resolves `latest` to the latest release. We previously hit
// the Github API to establish the version, but that is no longer necessary.
"latest".to_string()
};
eprintln!("Downloading web3signer version: {version}");
// Download the release zip.
let client = Client::builder().build().unwrap();
let zip_url = format!(
"https://artifacts.consensys.net/public/web3signer/raw/names/web3signer.zip/versions/{}/web3signer-{}.zip",
version, version
);
let zip_response = client
.get(zip_url)
.send()
.await
.unwrap()
.error_for_status()
.unwrap()
.bytes()
.await
.unwrap();
// Write the zip to a file.
let zip_path = dest_dir.join(format!("web3signer-{version}.zip"));
fs::write(&zip_path, zip_response).unwrap();
// Unzip the zip.
let mut zip_file = fs::File::open(&zip_path).unwrap();
ZipArchive::new(&mut zip_file)
.unwrap()
.extract(&dest_dir)
.unwrap();
// Rename the web3signer directory so it doesn't include the version string. This ensures the
// path to the binary is predictable.
let web3signer_dir = dest_dir.join("web3signer");
if web3signer_dir.exists() {
fs::remove_dir_all(&web3signer_dir).unwrap();
}
let versioned_web3signer_dir = find_versioned_web3signer_dir(&dest_dir);
eprintln!(
"Renaming versioned web3signer dir at: {}",
versioned_web3signer_dir.display()
);
fs::rename(versioned_web3signer_dir, web3signer_dir).unwrap();
// Delete zip.
fs::remove_file(&zip_path).unwrap();
}
fn find_versioned_web3signer_dir(dest_dir: &Path) -> PathBuf {
for entry in fs::read_dir(dest_dir).unwrap() {
let entry = entry.unwrap();
let path = entry.path();
if path
.file_name()
.and_then(|n| n.to_str())
.map(|s| s.starts_with("web3signer-"))
.unwrap_or(false)
&& entry.file_type().unwrap().is_dir()
{
return path;
}
}
panic!("no directory named web3signer-* found after ZIP extraction")
}