Fix asset version issues

This commit is contained in:
Mubelotix
2025-08-25 15:39:05 +02:00
parent d649732acd
commit b2a72b0363
6 changed files with 53 additions and 23 deletions

View File

@ -166,7 +166,14 @@ fn check_sha256(name: &str, asset: &Asset, mut file: std::fs::File) -> anyhow::R
} }
} }
None => { None => {
tracing::warn!(sha256 = file_hash, "Skipping hash for asset {name} that doesn't have one. Please add it to workload file"); let msg = match name.starts_with("meilisearch-v") {
true => "Please add it to xtask/src/test/versions.rs",
false => "Please add it to workload file",
};
tracing::warn!(
sha256 = file_hash,
"Skipping hash for asset {name} that doesn't have one. {msg}"
);
true true
} }
}) })

View File

@ -4,6 +4,7 @@ use crate::{bench::BenchWorkload, test::TestWorkload};
#[derive(Deserialize)] #[derive(Deserialize)]
#[serde(tag = "type")] #[serde(tag = "type")]
#[serde(rename_all = "camelCase")]
pub enum Workload { pub enum Workload {
Bench(BenchWorkload), Bench(BenchWorkload),
Test(TestWorkload), Test(TestWorkload),

View File

@ -2,7 +2,6 @@ use std::time::Duration;
use crate::common::{args::CommonArgs, client::Client, logs::setup_logs, workload::Workload}; use crate::common::{args::CommonArgs, client::Client, logs::setup_logs, workload::Workload};
use anyhow::{bail, Context}; use anyhow::{bail, Context};
use cargo_metadata::semver::Version;
use clap::Parser; use clap::Parser;
mod versions; mod versions;
@ -16,8 +15,6 @@ pub struct TestDeriveArgs {
/// Common arguments shared with other commands /// Common arguments shared with other commands
#[command(flatten)] #[command(flatten)]
common: CommonArgs, common: CommonArgs,
initial_version: Version,
} }
pub fn run(args: TestDeriveArgs) -> anyhow::Result<()> { pub fn run(args: TestDeriveArgs) -> anyhow::Result<()> {
@ -58,18 +55,10 @@ async fn run_inner(args: TestDeriveArgs) -> anyhow::Result<()> {
match workload.run(&args, &assets_client, &meili_client).await { match workload.run(&args, &assets_client, &meili_client).await {
Ok(_) => { Ok(_) => {
println!( println!("✅ Workload {} completed successfully", workload.name,);
"✅ Workload {} from file {} completed successfully",
workload.name,
workload_file.display()
);
} }
Err(error) => { Err(error) => {
println!( println!("❌ Workload {} failed: {error}", workload.name,);
"❌ Workload {} from file {} failed: {error}",
workload.name,
workload_file.display()
);
return Err(error); return Err(error);
} }
} }

View File

@ -6,10 +6,15 @@ use cargo_metadata::semver::Version;
use serde::Deserialize; use serde::Deserialize;
async fn get_sha256(version: &Version, asset_name: &str) -> anyhow::Result<String> { async fn get_sha256(version: &Version, asset_name: &str) -> anyhow::Result<String> {
// If version is lower than 1.15 there is no point in trying to get the sha256, GitHub didn't support it
if *version < Version::parse("1.15.0")? {
anyhow::bail!("version is lower than 1.15, sha256 not available");
}
#[derive(Deserialize)] #[derive(Deserialize)]
struct GithubReleaseAsset { struct GithubReleaseAsset {
name: String, name: String,
digest: String, digest: Option<String>,
} }
#[derive(Deserialize)] #[derive(Deserialize)]
@ -19,14 +24,20 @@ async fn get_sha256(version: &Version, asset_name: &str) -> anyhow::Result<Strin
let url = let url =
format!("https://api.github.com/repos/meilisearch/meilisearch/releases/tags/v{version}"); format!("https://api.github.com/repos/meilisearch/meilisearch/releases/tags/v{version}");
let data: GithubRelease = reqwest::get(url).await?.json().await?; let client = reqwest::Client::builder()
.user_agent("Meilisearch bench xtask")
.build()
.context("failed to build reqwest client")?;
let body = client.get(url).send().await?.text().await?;
let data: GithubRelease = serde_json::from_str(&body)?;
let digest = data let digest = data
.assets .assets
.into_iter() .into_iter()
.find(|asset| asset.name.as_str() == asset_name) .find(|asset| asset.name.as_str() == asset_name)
.with_context(|| format!("asset {asset_name} not found in release v{version}"))? .with_context(|| format!("asset {asset_name} not found in release v{version}"))?
.digest; .digest
.with_context(|| format!("asset {asset_name} has no digest"))?;
let sha256 = let sha256 =
digest.strip_prefix("sha256:").map(|s| s.to_string()).context("invalid sha256 format")?; digest.strip_prefix("sha256:").map(|s| s.to_string()).context("invalid sha256 format")?;
@ -79,12 +90,19 @@ async fn add_asset(assets: &mut BTreeMap<String, Asset>, version: &Version) -> a
let filename = format!("meilisearch-{arch}"); let filename = format!("meilisearch-{arch}");
// Try to get the sha256 but it may fail if Github is rate limiting us // Try to get the sha256 but it may fail if Github is rate limiting us
let sha256 = match get_sha256(version, &filename).await { // We hardcode some values to speed up tests and avoid hitting Github
Ok(sha256) => Some(sha256), // Also, versions prior to 1.15 don't have sha256 available anyway
Err(err) => { let sha256 = match local_filename.as_str() {
eprintln!("⚠️ Warning: could not get sha256 from GitHub: {err}. Proceeding without integrity check."); "meilisearch-1.12.0-macos-apple-silicon" => {
None Some(String::from("3b384707a5df9edf66f9157f0ddb70dcd3ac84d4887149169cf93067d06717b7"))
} }
_ => match get_sha256(version, &filename).await {
Ok(sha256) => Some(sha256),
Err(err) => {
tracing::warn!("failed to get sha256 for version {version}: {err}");
None
}
},
}; };
let url = format!( let url = format!(

View File

@ -48,8 +48,10 @@ enum CommandOrUpgradeVec {
/// A test workload. /// A test workload.
/// Not to be confused with [a bench workload](crate::bench::workload::Workload). /// Not to be confused with [a bench workload](crate::bench::workload::Workload).
#[derive(Deserialize)] #[derive(Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct TestWorkload { pub struct TestWorkload {
pub name: String, pub name: String,
pub initial_version: Version,
pub assets: BTreeMap<String, Asset>, pub assets: BTreeMap<String, Asset>,
pub commands: Vec<CommandOrUpgrade>, pub commands: Vec<CommandOrUpgrade>,
} }
@ -64,7 +66,7 @@ impl TestWorkload {
// Group commands between upgrades // Group commands between upgrades
let mut commands_or_upgrade = Vec::new(); let mut commands_or_upgrade = Vec::new();
let mut current_commands = Vec::new(); let mut current_commands = Vec::new();
let mut all_versions = vec![args.initial_version.clone()]; let mut all_versions = vec![self.initial_version.clone()];
for command_or_upgrade in &self.commands { for command_or_upgrade in &self.commands {
match command_or_upgrade { match command_or_upgrade {
CommandOrUpgrade::Command(command) => current_commands.push(command.clone()), CommandOrUpgrade::Command(command) => current_commands.push(command.clone()),

View File

@ -0,0 +1,13 @@
{
"name": "movies",
"type": "test",
"initialVersion": "1.12.0",
"assets": {
"movies.json": {
"local_location": null,
"remote_location": "https://milli-benchmarks.fra1.digitaloceanspaces.com/bench/datasets/movies.json",
"sha256": "5b6e4cb660bc20327776e8a33ea197b43d9ec84856710ead1cc87ab24df77de1"
}
},
"commands": []
}