From cccebce34489bcadb402db345757f3d3a0140b45 Mon Sep 17 00:00:00 2001 From: fargito Date: Thu, 24 Oct 2024 14:23:12 +0200 Subject: [PATCH 1/8] chore(vscode): add rust settings --- .vscode/extensions.json | 9 +++++++++ .vscode/settings.json | 15 ++++++++++++++- cspell.json | 10 ++++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 .vscode/extensions.json create mode 100644 cspell.json diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..8eccfaf --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,9 @@ +{ + "recommendations": [ + "esbenp.prettier-vscode", + "foxundermoon.shell-format", + "rust-lang.rust-analyzer", + "GitHub.vscode-github-actions", + "GitLab.gitlab-workflow" + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json index 0f9dbb7..052e0ce 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,18 @@ { + "editor.defaultFormatter": "esbenp.prettier-vscode", "editor.formatOnSave": true, "rust-analyzer.checkOnSave": true, - "rust-analyzer.check.command": "clippy" + "rust-analyzer.check.command": "clippy", + "[dotenv][ignore][properties][shellscript]": { + "editor.defaultFormatter": "foxundermoon.shell-format" + }, + "[html][javascript][json]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[rust]": { + "editor.defaultFormatter": "rust-lang.rust-analyzer" + }, + "files.watcherExclude": { + "**/target/**": true + } } diff --git a/cspell.json b/cspell.json new file mode 100644 index 0000000..40331c2 --- /dev/null +++ b/cspell.json @@ -0,0 +1,10 @@ +{ + // Version of the setting file. Always 0.2 + "version": "0.2", + // language - current active spelling language + "language": "en", + // words - list of words to be always considered correct + "words": [ + "codspeed" + ] +} From 64ae64757840ecc1065eb0bea8ac84a0a06ed9ce Mon Sep 17 00:00:00 2001 From: fargito Date: Thu, 24 Oct 2024 16:18:51 +0200 Subject: [PATCH 2/8] feat(setup): use system distribution id instead of name --- src/run/check_system.rs | 16 ++++++++-------- src/run/runner/valgrind/setup.rs | 16 ++++++++-------- ...pload_metadata__tests__get_metadata_hash.snap | 2 +- src/run/uploader/upload_metadata.rs | 2 +- 4 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/run/check_system.rs b/src/run/check_system.rs index 759bccb..aef92b3 100644 --- a/src/run/check_system.rs +++ b/src/run/check_system.rs @@ -38,7 +38,7 @@ pub struct SystemInfo { impl SystemInfo { pub fn test() -> Self { SystemInfo { - os: "Ubuntu".to_string(), + os: "ubuntu".to_string(), os_version: "20.04".to_string(), arch: "x86_64".to_string(), host: "host".to_string(), @@ -54,7 +54,7 @@ impl SystemInfo { impl SystemInfo { pub fn new() -> Result { - let os = System::name().ok_or(anyhow!("Failed to get OS name"))?; + let os = System::distribution_id(); let os_version = System::os_version().ok_or(anyhow!("Failed to get OS version"))?; let arch = System::cpu_arch().ok_or(anyhow!("Failed to get CPU architecture"))?; let user = get_user()?; @@ -98,12 +98,12 @@ impl SystemInfo { lazy_static! { static ref SUPPORTED_SYSTEMS: HashSet<(&'static str, &'static str, &'static str)> = { HashSet::from([ - ("Ubuntu", "20.04", "x86_64"), - ("Ubuntu", "22.04", "x86_64"), - ("Ubuntu", "24.04", "x86_64"), - ("Ubuntu", "22.04", "aarch64"), - ("Debian", "11", "x86_64"), - ("Debian", "12", "x86_64"), + ("ubuntu", "20.04", "x86_64"), + ("ubuntu", "22.04", "x86_64"), + ("ubuntu", "24.04", "x86_64"), + ("ubuntu", "22.04", "aarch64"), + ("debian", "11", "x86_64"), + ("debian", "12", "x86_64"), ]) }; } diff --git a/src/run/runner/valgrind/setup.rs b/src/run/runner/valgrind/setup.rs index f15443d..801459b 100644 --- a/src/run/runner/valgrind/setup.rs +++ b/src/run/runner/valgrind/setup.rs @@ -44,12 +44,12 @@ fn get_codspeed_valgrind_filename(system_info: &SystemInfo) -> Result { system_info.os_version.as_str(), system_info.arch.as_str(), ) { - ("Ubuntu", "20.04", "x86_64") | ("Debian", "11", "x86_64") | ("Debian", "12", "x86_64") => { + ("ubuntu", "20.04", "x86_64") | ("debian", "11", "x86_64") | ("debian", "12", "x86_64") => { ("20.04", "amd64") } - ("Ubuntu", "22.04", "x86_64") => ("22.04", "amd64"), - ("Ubuntu", "24.04", "x86_64") => ("24.04", "amd64"), - ("Ubuntu", "22.04", "aarch64") => ("22.04", "arm64"), + ("ubuntu", "22.04", "x86_64") => ("22.04", "amd64"), + ("ubuntu", "24.04", "x86_64") => ("24.04", "amd64"), + ("ubuntu", "22.04", "aarch64") => ("22.04", "arm64"), _ => bail!("Unsupported system"), }; @@ -148,7 +148,7 @@ mod tests { #[test] fn test_system_info_to_codspeed_valgrind_version_ubuntu() { let system_info = SystemInfo { - os: "Ubuntu".to_string(), + os: "ubuntu".to_string(), os_version: "22.04".to_string(), arch: "x86_64".to_string(), ..SystemInfo::test() @@ -162,7 +162,7 @@ mod tests { #[test] fn test_system_info_to_codspeed_valgrind_version_ubuntu_24() { let system_info = SystemInfo { - os: "Ubuntu".to_string(), + os: "ubuntu".to_string(), os_version: "24.04".to_string(), arch: "x86_64".to_string(), ..SystemInfo::test() @@ -176,7 +176,7 @@ mod tests { #[test] fn test_system_info_to_codspeed_valgrind_version_debian() { let system_info = SystemInfo { - os: "Debian".to_string(), + os: "debian".to_string(), os_version: "11".to_string(), arch: "x86_64".to_string(), ..SystemInfo::test() @@ -190,7 +190,7 @@ mod tests { #[test] fn test_system_info_to_codspeed_valgrind_version_ubuntu_arm() { let system_info = SystemInfo { - os: "Ubuntu".to_string(), + os: "ubuntu".to_string(), os_version: "22.04".to_string(), arch: "aarch64".to_string(), ..SystemInfo::test() diff --git a/src/run/uploader/snapshots/codspeed__run__uploader__upload_metadata__tests__get_metadata_hash.snap b/src/run/uploader/snapshots/codspeed__run__uploader__upload_metadata__tests__get_metadata_hash.snap index 172ff56..dfdf937 100644 --- a/src/run/uploader/snapshots/codspeed__run__uploader__upload_metadata__tests__get_metadata_hash.snap +++ b/src/run/uploader/snapshots/codspeed__run__uploader__upload_metadata__tests__get_metadata_hash.snap @@ -13,7 +13,7 @@ expression: upload_metadata "MongoDB" ], "executor": "valgrind", - "os": "Ubuntu", + "os": "ubuntu", "osVersion": "20.04", "arch": "x86_64", "host": "host", diff --git a/src/run/uploader/upload_metadata.rs b/src/run/uploader/upload_metadata.rs index 4f49d48..8bc5fd3 100644 --- a/src/run/uploader/upload_metadata.rs +++ b/src/run/uploader/upload_metadata.rs @@ -58,7 +58,7 @@ mod tests { let hash = upload_metadata.get_hash(); assert_eq!( hash, - "3fc8e6c1b3f4adfe00e027d148f308a34730f1f2fa053c19378ce3e97b5dbab1" + "4527a74101c6a91645a22ab2d6e787217274f464c5872cc1865270d0d1a078a4" ); assert_json_snapshot!(upload_metadata); } From 7a9ade5041d9fac47d465e3371ddd4e7c18fb09d Mon Sep 17 00:00:00 2001 From: fargito Date: Thu, 24 Oct 2024 15:35:00 +0200 Subject: [PATCH 3/8] refactor(builkite): improve string interpolation --- src/run/ci_provider/buildkite/logger.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/run/ci_provider/buildkite/logger.rs b/src/run/ci_provider/buildkite/logger.rs index df727c5..aea05bb 100644 --- a/src/run/ci_provider/buildkite/logger.rs +++ b/src/run/ci_provider/buildkite/logger.rs @@ -39,10 +39,10 @@ impl Log for BuildkiteLogger { if let Some(group_event) = get_group_event(record) { match group_event { GroupEvent::Start(name) => { - println!("--- {}", name); + println!("--- {name}"); } GroupEvent::StartOpened(name) => { - println!("+++ {}", name); + println!("+++ {name}"); } GroupEvent::End => {} } @@ -55,19 +55,19 @@ impl Log for BuildkiteLogger { // there is no support for log levels in Buildkite, so we print the level in the message match level { Level::Error => { - println!("[ERROR] {}", message); + println!("[ERROR] {message}"); } Level::Warn => { - println!("[WARN] {}", message); + println!("[WARN] {message}"); } Level::Info => { - println!("{}", message); + println!("{message}"); } Level::Debug => { - println!("[DEBUG] {}", message); + println!("[DEBUG] {message}"); } Level::Trace => { - println!("[TRACE] {}", message); + println!("[TRACE] {message}"); } } } From d58a137022b5f505a183feffbc6ef7aaacab5f59 Mon Sep 17 00:00:00 2001 From: fargito Date: Tue, 29 Oct 2024 10:02:55 +0100 Subject: [PATCH 4/8] refactor(github): use string for runId --- src/run/ci_provider/github_actions/provider.rs | 6 ++---- ...rovider__tests__fork_pull_request_provider_metadata.snap | 2 +- ...ns__provider__tests__pull_request_provider_metadata.snap | 2 +- src/run/ci_provider/interfaces.rs | 2 +- ...uploader__upload_metadata__tests__get_metadata_hash.snap | 2 +- src/run/uploader/upload_metadata.rs | 4 ++-- 6 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/run/ci_provider/github_actions/provider.rs b/src/run/ci_provider/github_actions/provider.rs index cfa6b5c..401b49a 100644 --- a/src/run/ci_provider/github_actions/provider.rs +++ b/src/run/ci_provider/github_actions/provider.rs @@ -95,9 +95,7 @@ impl TryFrom<&Config> for GitHubActionsProvider { event, gh_data: GhData { job: get_env_variable("GITHUB_JOB")?, - run_id: get_env_variable("GITHUB_RUN_ID")? - .parse() - .context("Failed to parse GITHUB_RUN_ID into an integer")?, + run_id: get_env_variable("GITHUB_RUN_ID")?, sender: Some(Sender { login: get_env_variable("GITHUB_ACTOR")?, id: get_env_variable("GITHUB_ACTOR_ID")? @@ -196,7 +194,7 @@ mod tests { assert_eq!(github_actions_provider.head_ref, None); assert_eq!(github_actions_provider.event, RunEvent::Push); assert_eq!(github_actions_provider.gh_data.job, "job"); - assert_eq!(github_actions_provider.gh_data.run_id, 1234567890); + assert_eq!(github_actions_provider.gh_data.run_id, "1234567890"); assert_eq!( github_actions_provider .gh_data diff --git a/src/run/ci_provider/github_actions/snapshots/codspeed__run__ci_provider__github_actions__provider__tests__fork_pull_request_provider_metadata.snap b/src/run/ci_provider/github_actions/snapshots/codspeed__run__ci_provider__github_actions__provider__tests__fork_pull_request_provider_metadata.snap index f6c9bbb..1a78a2c 100644 --- a/src/run/ci_provider/github_actions/snapshots/codspeed__run__ci_provider__github_actions__provider__tests__fork_pull_request_provider_metadata.snap +++ b/src/run/ci_provider/github_actions/snapshots/codspeed__run__ci_provider__github_actions__provider__tests__fork_pull_request_provider_metadata.snap @@ -10,7 +10,7 @@ expression: provider_metadata "repository": "adrien-python-test", "event": "pull_request", "ghData": { - "runId": 6957110437, + "runId": "6957110437", "job": "log-env", "sender": { "id": 19605940, diff --git a/src/run/ci_provider/github_actions/snapshots/codspeed__run__ci_provider__github_actions__provider__tests__pull_request_provider_metadata.snap b/src/run/ci_provider/github_actions/snapshots/codspeed__run__ci_provider__github_actions__provider__tests__pull_request_provider_metadata.snap index a4b3d7f..7925682 100644 --- a/src/run/ci_provider/github_actions/snapshots/codspeed__run__ci_provider__github_actions__provider__tests__pull_request_provider_metadata.snap +++ b/src/run/ci_provider/github_actions/snapshots/codspeed__run__ci_provider__github_actions__provider__tests__pull_request_provider_metadata.snap @@ -10,7 +10,7 @@ expression: provider_metadata "repository": "adrien-python-test", "event": "pull_request", "ghData": { - "runId": 6957110437, + "runId": "6957110437", "job": "log-env", "sender": { "id": 19605940, diff --git a/src/run/ci_provider/interfaces.rs b/src/run/ci_provider/interfaces.rs index e802da8..584451b 100644 --- a/src/run/ci_provider/interfaces.rs +++ b/src/run/ci_provider/interfaces.rs @@ -27,7 +27,7 @@ pub enum RunEvent { #[derive(Deserialize, Serialize, Debug, Clone)] #[serde(rename_all = "camelCase")] pub struct GhData { - pub run_id: u64, + pub run_id: String, pub job: String, pub sender: Option, } diff --git a/src/run/uploader/snapshots/codspeed__run__uploader__upload_metadata__tests__get_metadata_hash.snap b/src/run/uploader/snapshots/codspeed__run__uploader__upload_metadata__tests__get_metadata_hash.snap index dfdf937..555f4bf 100644 --- a/src/run/uploader/snapshots/codspeed__run__uploader__upload_metadata__tests__get_metadata_hash.snap +++ b/src/run/uploader/snapshots/codspeed__run__uploader__upload_metadata__tests__get_metadata_hash.snap @@ -33,7 +33,7 @@ expression: upload_metadata "repository": "codspeed-node", "event": "pull_request", "ghData": { - "runId": 7044765741, + "runId": "7044765741", "job": "codspeed", "sender": { "id": 19605940, diff --git a/src/run/uploader/upload_metadata.rs b/src/run/uploader/upload_metadata.rs index 8bc5fd3..1e3c19e 100644 --- a/src/run/uploader/upload_metadata.rs +++ b/src/run/uploader/upload_metadata.rs @@ -44,7 +44,7 @@ mod tests { repository: "codspeed-node".into(), event: RunEvent::PullRequest, gh_data: Some(GhData { - run_id: 7044765741, + run_id: "7044765741".into(), job: "codspeed".into(), sender: Some(Sender { id: 19605940, @@ -58,7 +58,7 @@ mod tests { let hash = upload_metadata.get_hash(); assert_eq!( hash, - "4527a74101c6a91645a22ab2d6e787217274f464c5872cc1865270d0d1a078a4" + "71edde76c402f43b357dd816fa08421130e0ac1d634a43fdb61c5070f831052a" ); assert_json_snapshot!(upload_metadata); } From 10d0b1e968e1f6fac1e8fb3c67b55f4e1d565511 Mon Sep 17 00:00:00 2001 From: fargito Date: Mon, 28 Oct 2024 18:37:36 +0100 Subject: [PATCH 5/8] refactor: rename provider to ci provider --- src/run/ci_provider/buildkite/provider.rs | 8 ++++---- src/run/ci_provider/github_actions/provider.rs | 10 +++++----- src/run/ci_provider/interfaces.rs | 2 +- src/run/ci_provider/local/provider.rs | 6 +++--- src/run/ci_provider/provider.rs | 10 +++++----- src/run/poll_results.rs | 6 +++--- src/run/uploader/interfaces.rs | 4 ++-- src/run/uploader/upload.rs | 3 ++- src/run/uploader/upload_metadata.rs | 4 ++-- 9 files changed, 27 insertions(+), 26 deletions(-) diff --git a/src/run/ci_provider/buildkite/provider.rs b/src/run/ci_provider/buildkite/provider.rs index 1dac710..256016f 100644 --- a/src/run/ci_provider/buildkite/provider.rs +++ b/src/run/ci_provider/buildkite/provider.rs @@ -7,7 +7,7 @@ use simplelog::SharedLogger; use crate::prelude::*; use crate::run::{ ci_provider::{ - interfaces::{ProviderMetadata, RunEvent}, + interfaces::{CIProviderMetadata, RunEvent}, provider::{CIProvider, CIProviderDetector}, }, config::Config, @@ -145,8 +145,8 @@ impl CIProvider for BuildkiteProvider { "buildkite" } - fn get_provider_metadata(&self) -> Result { - Ok(ProviderMetadata { + fn get_ci_provider_metadata(&self) -> Result { + Ok(CIProviderMetadata { base_ref: self.base_ref.clone(), head_ref: self.head_ref.clone(), event: self.event.clone(), @@ -300,7 +300,7 @@ mod tests { ..Config::test() }; let provider = BuildkiteProvider::try_from(&config).unwrap(); - let provider_metadata = provider.get_provider_metadata().unwrap(); + let provider_metadata = provider.get_ci_provider_metadata().unwrap(); assert_json_snapshot!(provider_metadata, { ".runner.version" => insta::dynamic_redaction(|value,_path| { diff --git a/src/run/ci_provider/github_actions/provider.rs b/src/run/ci_provider/github_actions/provider.rs index 401b49a..fc5e900 100644 --- a/src/run/ci_provider/github_actions/provider.rs +++ b/src/run/ci_provider/github_actions/provider.rs @@ -7,7 +7,7 @@ use std::{env, fs}; use crate::prelude::*; use crate::run::{ ci_provider::{ - interfaces::{GhData, ProviderMetadata, RunEvent, Sender}, + interfaces::{CIProviderMetadata, GhData, RunEvent, Sender}, provider::{CIProvider, CIProviderDetector}, }, config::Config, @@ -129,8 +129,8 @@ impl CIProvider for GitHubActionsProvider { "github-actions" } - fn get_provider_metadata(&self) -> Result { - Ok(ProviderMetadata { + fn get_ci_provider_metadata(&self) -> Result { + Ok(CIProviderMetadata { base_ref: self.base_ref.clone(), head_ref: self.head_ref.clone(), event: self.event.clone(), @@ -244,7 +244,7 @@ mod tests { ..Config::test() }; let github_actions_provider = GitHubActionsProvider::try_from(&config).unwrap(); - let provider_metadata = github_actions_provider.get_provider_metadata().unwrap(); + let provider_metadata = github_actions_provider.get_ci_provider_metadata().unwrap(); assert_json_snapshot!(provider_metadata, { ".runner.version" => insta::dynamic_redaction(|value,_path| { @@ -288,7 +288,7 @@ mod tests { ..Config::test() }; let github_actions_provider = GitHubActionsProvider::try_from(&config).unwrap(); - let provider_metadata = github_actions_provider.get_provider_metadata().unwrap(); + let provider_metadata = github_actions_provider.get_ci_provider_metadata().unwrap(); assert_eq!(provider_metadata.owner, "my-org"); assert_eq!(provider_metadata.repository, "adrien-python-test"); diff --git a/src/run/ci_provider/interfaces.rs b/src/run/ci_provider/interfaces.rs index 584451b..b00e19c 100644 --- a/src/run/ci_provider/interfaces.rs +++ b/src/run/ci_provider/interfaces.rs @@ -2,7 +2,7 @@ use serde::{Deserialize, Serialize}; #[derive(Deserialize, Serialize, Debug)] #[serde(rename_all = "camelCase")] -pub struct ProviderMetadata { +pub struct CIProviderMetadata { #[serde(rename = "ref")] pub ref_: String, pub head_ref: Option, diff --git a/src/run/ci_provider/local/provider.rs b/src/run/ci_provider/local/provider.rs index f0cbf71..a87e558 100644 --- a/src/run/ci_provider/local/provider.rs +++ b/src/run/ci_provider/local/provider.rs @@ -6,7 +6,7 @@ use crate::local_logger::get_local_logger; use crate::prelude::*; use crate::run::{ ci_provider::{ - interfaces::{ProviderMetadata, RunEvent}, + interfaces::{CIProviderMetadata, RunEvent}, provider::{CIProvider, CIProviderDetector}, }, config::Config, @@ -110,8 +110,8 @@ impl CIProvider for LocalProvider { "local" } - fn get_provider_metadata(&self) -> Result { - Ok(ProviderMetadata { + fn get_ci_provider_metadata(&self) -> Result { + Ok(CIProviderMetadata { base_ref: self.base_ref.clone(), head_ref: self.head_ref.clone(), event: self.event.clone(), diff --git a/src/run/ci_provider/provider.rs b/src/run/ci_provider/provider.rs index 7d00997..6cfd60b 100644 --- a/src/run/ci_provider/provider.rs +++ b/src/run/ci_provider/provider.rs @@ -7,7 +7,7 @@ use crate::run::config::Config; use crate::run::runner::ExecutorName; use crate::run::uploader::{Runner, UploadMetadata}; -use super::interfaces::ProviderMetadata; +use super::interfaces::CIProviderMetadata; pub trait CIProviderDetector { /// Detects if the current environment is running inside the CI provider. @@ -55,7 +55,7 @@ pub trait CIProvider { fn get_provider_slug(&self) -> &'static str; /// Returns the metadata related to the CI provider. - fn get_provider_metadata(&self) -> Result; + fn get_ci_provider_metadata(&self) -> Result; /// Returns the metadata necessary for uploading results to CodSpeed. /// @@ -80,14 +80,14 @@ pub trait CIProvider { archive_hash: &str, executor_name: ExecutorName, ) -> Result { - let provider_metadata = self.get_provider_metadata()?; + let ci_provider_metadata = self.get_ci_provider_metadata()?; - let commit_hash = get_commit_hash(&provider_metadata.repository_root_path)?; + let commit_hash = get_commit_hash(&ci_provider_metadata.repository_root_path)?; Ok(UploadMetadata { version: Some(4), tokenless: config.token.is_none(), - provider_metadata, + ci_provider_metadata, profile_md5: archive_hash.into(), commit_hash, runner: Runner { diff --git a/src/run/poll_results.rs b/src/run/poll_results.rs index cc97922..76907a9 100644 --- a/src/run/poll_results.rs +++ b/src/run/poll_results.rs @@ -20,9 +20,9 @@ pub async fn poll_results( run_id: String, ) -> Result<()> { let start = Instant::now(); - let provider_metadata = provider.get_provider_metadata()?; - let owner = provider_metadata.owner; - let name = provider_metadata.repository; + let ci_provider_metadata = provider.get_ci_provider_metadata()?; + let owner = ci_provider_metadata.owner; + let name = ci_provider_metadata.repository; let fetch_local_run_report_vars = FetchLocalRunReportVars { owner: owner.clone(), name: name.clone(), diff --git a/src/run/uploader/interfaces.rs b/src/run/uploader/interfaces.rs index bc56bbd..8362771 100644 --- a/src/run/uploader/interfaces.rs +++ b/src/run/uploader/interfaces.rs @@ -1,7 +1,7 @@ use serde::{Deserialize, Serialize}; use crate::run::{ - check_system::SystemInfo, ci_provider::interfaces::ProviderMetadata, + check_system::SystemInfo, ci_provider::interfaces::CIProviderMetadata, instruments::InstrumentName, runner::ExecutorName, }; @@ -15,7 +15,7 @@ pub struct UploadMetadata { pub platform: String, pub commit_hash: String, #[serde(flatten)] - pub provider_metadata: ProviderMetadata, + pub ci_provider_metadata: CIProviderMetadata, } #[derive(Deserialize, Serialize, Debug)] diff --git a/src/run/uploader/upload.rs b/src/run/uploader/upload.rs index a36d86d..b02375a 100644 --- a/src/run/uploader/upload.rs +++ b/src/run/uploader/upload.rs @@ -113,7 +113,8 @@ pub async fn upload( "Linked repository: {}\n", style(format!( "{}/{}", - upload_metadata.provider_metadata.owner, upload_metadata.provider_metadata.repository + upload_metadata.ci_provider_metadata.owner, + upload_metadata.ci_provider_metadata.repository )) .bold(), ); diff --git a/src/run/uploader/upload_metadata.rs b/src/run/uploader/upload_metadata.rs index 1e3c19e..dd8c7ec 100644 --- a/src/run/uploader/upload_metadata.rs +++ b/src/run/uploader/upload_metadata.rs @@ -15,7 +15,7 @@ mod tests { use crate::run::{ check_system::SystemInfo, - ci_provider::interfaces::{GhData, ProviderMetadata, RunEvent, Sender}, + ci_provider::interfaces::{CIProviderMetadata, GhData, RunEvent, Sender}, instruments::InstrumentName, runner::ExecutorName, uploader::{Runner, UploadMetadata}, @@ -36,7 +36,7 @@ mod tests { }, platform: "github-actions".into(), commit_hash: "5bd77cb0da72bef094893ed45fb793ff16ecfbe3".into(), - provider_metadata: ProviderMetadata { + ci_provider_metadata: CIProviderMetadata { ref_: "refs/pull/29/merge".into(), head_ref: Some("chore/native-action-runner".into()), base_ref: Some("main".into()), From 0fd64bf48e70ef835299cb686b4a2309eda5982b Mon Sep 17 00:00:00 2001 From: fargito Date: Tue, 29 Oct 2024 09:59:32 +0100 Subject: [PATCH 6/8] refactor: move sender out of ghdata --- src/run/ci_provider/buildkite/provider.rs | 15 ++++++------ ...tests__pull_request_provider_metadata.snap | 1 + .../ci_provider/github_actions/provider.rs | 23 ++++++++----------- ...__fork_pull_request_provider_metadata.snap | 10 ++++---- ...tests__pull_request_provider_metadata.snap | 10 ++++---- src/run/ci_provider/interfaces.rs | 4 ++-- src/run/ci_provider/local/provider.rs | 1 + ...ad_metadata__tests__get_metadata_hash.snap | 12 +++++----- src/run/uploader/upload_metadata.rs | 12 +++++----- 9 files changed, 43 insertions(+), 45 deletions(-) diff --git a/src/run/ci_provider/buildkite/provider.rs b/src/run/ci_provider/buildkite/provider.rs index 256016f..0acbfaa 100644 --- a/src/run/ci_provider/buildkite/provider.rs +++ b/src/run/ci_provider/buildkite/provider.rs @@ -18,13 +18,13 @@ use super::logger::BuildkiteLogger; #[derive(Debug)] pub struct BuildkiteProvider { - pub owner: String, - pub repository: String, - pub ref_: String, - pub head_ref: Option, - pub base_ref: Option, - pub event: RunEvent, - pub repository_root_path: String, + owner: String, + repository: String, + ref_: String, + head_ref: Option, + base_ref: Option, + event: RunEvent, + repository_root_path: String, } lazy_static! { @@ -155,6 +155,7 @@ impl CIProvider for BuildkiteProvider { ref_: self.ref_.clone(), repository_root_path: self.repository_root_path.clone(), gh_data: None, + sender: None, }) } } diff --git a/src/run/ci_provider/buildkite/snapshots/codspeed__run__ci_provider__buildkite__provider__tests__pull_request_provider_metadata.snap b/src/run/ci_provider/buildkite/snapshots/codspeed__run__ci_provider__buildkite__provider__tests__pull_request_provider_metadata.snap index 28f1e6b..f0619f9 100644 --- a/src/run/ci_provider/buildkite/snapshots/codspeed__run__ci_provider__buildkite__provider__tests__pull_request_provider_metadata.snap +++ b/src/run/ci_provider/buildkite/snapshots/codspeed__run__ci_provider__buildkite__provider__tests__pull_request_provider_metadata.snap @@ -9,6 +9,7 @@ expression: provider_metadata "owner": "my-org", "repository": "adrien-python-test", "event": "pull_request", + "sender": null, "ghData": null, "repositoryRootPath": "/buildkite/builds/7b10eca7600b-1/my-org/buildkite-test/" } diff --git a/src/run/ci_provider/github_actions/provider.rs b/src/run/ci_provider/github_actions/provider.rs index fc5e900..9c22aef 100644 --- a/src/run/ci_provider/github_actions/provider.rs +++ b/src/run/ci_provider/github_actions/provider.rs @@ -23,6 +23,7 @@ pub struct GitHubActionsProvider { pub ref_: String, pub head_ref: Option, pub base_ref: Option, + pub sender: Option, pub gh_data: GhData, pub event: RunEvent, pub repository_root_path: String, @@ -96,13 +97,11 @@ impl TryFrom<&Config> for GitHubActionsProvider { gh_data: GhData { job: get_env_variable("GITHUB_JOB")?, run_id: get_env_variable("GITHUB_RUN_ID")?, - sender: Some(Sender { - login: get_env_variable("GITHUB_ACTOR")?, - id: get_env_variable("GITHUB_ACTOR_ID")? - .parse() - .context("Failed to parse GITHUB_ACTOR_ID into an integer")?, - }), }, + sender: Some(Sender { + login: get_env_variable("GITHUB_ACTOR")?, + id: get_env_variable("GITHUB_ACTOR_ID")?, + }), base_ref: get_env_variable("GITHUB_BASE_REF").ok(), repository_root_path, }) @@ -135,6 +134,7 @@ impl CIProvider for GitHubActionsProvider { head_ref: self.head_ref.clone(), event: self.event.clone(), gh_data: Some(self.gh_data.clone()), + sender: self.sender.clone(), owner: self.owner.clone(), repository: self.repository.clone(), ref_: self.ref_.clone(), @@ -196,17 +196,12 @@ mod tests { assert_eq!(github_actions_provider.gh_data.job, "job"); assert_eq!(github_actions_provider.gh_data.run_id, "1234567890"); assert_eq!( - github_actions_provider - .gh_data - .sender - .as_ref() - .unwrap() - .login, + github_actions_provider.sender.as_ref().unwrap().login, "actor" ); assert_eq!( - github_actions_provider.gh_data.sender.as_ref().unwrap().id, - 1234567890 + github_actions_provider.sender.as_ref().unwrap().id, + "1234567890" ); }, ) diff --git a/src/run/ci_provider/github_actions/snapshots/codspeed__run__ci_provider__github_actions__provider__tests__fork_pull_request_provider_metadata.snap b/src/run/ci_provider/github_actions/snapshots/codspeed__run__ci_provider__github_actions__provider__tests__fork_pull_request_provider_metadata.snap index 1a78a2c..3449174 100644 --- a/src/run/ci_provider/github_actions/snapshots/codspeed__run__ci_provider__github_actions__provider__tests__fork_pull_request_provider_metadata.snap +++ b/src/run/ci_provider/github_actions/snapshots/codspeed__run__ci_provider__github_actions__provider__tests__fork_pull_request_provider_metadata.snap @@ -9,13 +9,13 @@ expression: provider_metadata "owner": "my-org", "repository": "adrien-python-test", "event": "pull_request", + "sender": { + "id": "19605940", + "login": "adriencaccia" + }, "ghData": { "runId": "6957110437", - "job": "log-env", - "sender": { - "id": 19605940, - "login": "adriencaccia" - } + "job": "log-env" }, "repositoryRootPath": "/home/runner/work/adrien-python-test/adrien-python-test/" } diff --git a/src/run/ci_provider/github_actions/snapshots/codspeed__run__ci_provider__github_actions__provider__tests__pull_request_provider_metadata.snap b/src/run/ci_provider/github_actions/snapshots/codspeed__run__ci_provider__github_actions__provider__tests__pull_request_provider_metadata.snap index 7925682..6233b72 100644 --- a/src/run/ci_provider/github_actions/snapshots/codspeed__run__ci_provider__github_actions__provider__tests__pull_request_provider_metadata.snap +++ b/src/run/ci_provider/github_actions/snapshots/codspeed__run__ci_provider__github_actions__provider__tests__pull_request_provider_metadata.snap @@ -9,13 +9,13 @@ expression: provider_metadata "owner": "my-org", "repository": "adrien-python-test", "event": "pull_request", + "sender": { + "id": "19605940", + "login": "adriencaccia" + }, "ghData": { "runId": "6957110437", - "job": "log-env", - "sender": { - "id": 19605940, - "login": "adriencaccia" - } + "job": "log-env" }, "repositoryRootPath": "/home/runner/work/adrien-python-test/adrien-python-test/" } diff --git a/src/run/ci_provider/interfaces.rs b/src/run/ci_provider/interfaces.rs index b00e19c..1731094 100644 --- a/src/run/ci_provider/interfaces.rs +++ b/src/run/ci_provider/interfaces.rs @@ -10,6 +10,7 @@ pub struct CIProviderMetadata { pub owner: String, pub repository: String, pub event: RunEvent, + pub sender: Option, pub gh_data: Option, pub repository_root_path: String, } @@ -29,12 +30,11 @@ pub enum RunEvent { pub struct GhData { pub run_id: String, pub job: String, - pub sender: Option, } #[derive(Deserialize, Serialize, Debug, Clone, PartialEq)] #[serde(rename_all = "camelCase")] pub struct Sender { - pub id: u64, + pub id: String, pub login: String, } diff --git a/src/run/ci_provider/local/provider.rs b/src/run/ci_provider/local/provider.rs index a87e558..57d71e0 100644 --- a/src/run/ci_provider/local/provider.rs +++ b/src/run/ci_provider/local/provider.rs @@ -116,6 +116,7 @@ impl CIProvider for LocalProvider { head_ref: self.head_ref.clone(), event: self.event.clone(), gh_data: None, + sender: None, owner: self.owner.clone(), repository: self.repository.clone(), ref_: self.ref_.clone(), diff --git a/src/run/uploader/snapshots/codspeed__run__uploader__upload_metadata__tests__get_metadata_hash.snap b/src/run/uploader/snapshots/codspeed__run__uploader__upload_metadata__tests__get_metadata_hash.snap index 555f4bf..588d111 100644 --- a/src/run/uploader/snapshots/codspeed__run__uploader__upload_metadata__tests__get_metadata_hash.snap +++ b/src/run/uploader/snapshots/codspeed__run__uploader__upload_metadata__tests__get_metadata_hash.snap @@ -3,7 +3,7 @@ source: src/run/uploader/upload_metadata.rs expression: upload_metadata --- { - "version": 4, + "version": 5, "tokenless": true, "profileMd5": "jp/k05RKuqP3ERQuIIvx4Q==", "runner": { @@ -32,13 +32,13 @@ expression: upload_metadata "owner": "CodSpeedHQ", "repository": "codspeed-node", "event": "pull_request", + "sender": { + "id": "19605940", + "login": "adriencaccia" + }, "ghData": { "runId": "7044765741", - "job": "codspeed", - "sender": { - "id": 19605940, - "login": "adriencaccia" - } + "job": "codspeed" }, "repositoryRootPath": "/home/runner/work/codspeed-node/codspeed-node/" } diff --git a/src/run/uploader/upload_metadata.rs b/src/run/uploader/upload_metadata.rs index dd8c7ec..daeb26b 100644 --- a/src/run/uploader/upload_metadata.rs +++ b/src/run/uploader/upload_metadata.rs @@ -24,7 +24,7 @@ mod tests { #[test] fn test_get_metadata_hash() { let upload_metadata = UploadMetadata { - version: Some(4), + version: Some(5), tokenless: true, profile_md5: "jp/k05RKuqP3ERQuIIvx4Q==".into(), runner: Runner { @@ -46,10 +46,10 @@ mod tests { gh_data: Some(GhData { run_id: "7044765741".into(), job: "codspeed".into(), - sender: Some(Sender { - id: 19605940, - login: "adriencaccia".into(), - }), + }), + sender: Some(Sender { + id: "19605940".into(), + login: "adriencaccia".into(), }), repository_root_path: "/home/runner/work/codspeed-node/codspeed-node/".into(), }, @@ -58,7 +58,7 @@ mod tests { let hash = upload_metadata.get_hash(); assert_eq!( hash, - "71edde76c402f43b357dd816fa08421130e0ac1d634a43fdb61c5070f831052a" + "cd7779a9392b7da0a9ac6c1c83b490fa40cadc5e7937f50d1a71663bc20679f2" ); assert_json_snapshot!(upload_metadata); } From 358e68c455634a8e13353ce8e02a8315ed5698e9 Mon Sep 17 00:00:00 2001 From: fargito Date: Mon, 28 Oct 2024 17:59:36 +0100 Subject: [PATCH 7/8] feat: add repository provider to upload metadata --- src/run/ci_provider/buildkite/provider.rs | 6 +- .../ci_provider/github_actions/provider.rs | 6 +- src/run/ci_provider/interfaces.rs | 7 ++ src/run/ci_provider/local/provider.rs | 75 +++++++++++++++---- src/run/ci_provider/provider.rs | 8 +- src/run/uploader/interfaces.rs | 7 +- ...ad_metadata__tests__get_metadata_hash.snap | 1 + src/run/uploader/upload_metadata.rs | 7 +- 8 files changed, 94 insertions(+), 23 deletions(-) diff --git a/src/run/ci_provider/buildkite/provider.rs b/src/run/ci_provider/buildkite/provider.rs index 0acbfaa..00ef6c9 100644 --- a/src/run/ci_provider/buildkite/provider.rs +++ b/src/run/ci_provider/buildkite/provider.rs @@ -7,7 +7,7 @@ use simplelog::SharedLogger; use crate::prelude::*; use crate::run::{ ci_provider::{ - interfaces::{CIProviderMetadata, RunEvent}, + interfaces::{CIProviderMetadata, RepositoryProvider, RunEvent}, provider::{CIProvider, CIProviderDetector}, }, config::Config, @@ -133,6 +133,10 @@ impl CIProviderDetector for BuildkiteProvider { } impl CIProvider for BuildkiteProvider { + fn get_repository_provider(&self) -> RepositoryProvider { + RepositoryProvider::GitHub + } + fn get_logger(&self) -> Box { Box::new(BuildkiteLogger::new()) } diff --git a/src/run/ci_provider/github_actions/provider.rs b/src/run/ci_provider/github_actions/provider.rs index 9c22aef..12540fd 100644 --- a/src/run/ci_provider/github_actions/provider.rs +++ b/src/run/ci_provider/github_actions/provider.rs @@ -7,7 +7,7 @@ use std::{env, fs}; use crate::prelude::*; use crate::run::{ ci_provider::{ - interfaces::{CIProviderMetadata, GhData, RunEvent, Sender}, + interfaces::{CIProviderMetadata, GhData, RepositoryProvider, RunEvent, Sender}, provider::{CIProvider, CIProviderDetector}, }, config::Config, @@ -116,6 +116,10 @@ impl CIProviderDetector for GitHubActionsProvider { } impl CIProvider for GitHubActionsProvider { + fn get_repository_provider(&self) -> RepositoryProvider { + RepositoryProvider::GitHub + } + fn get_logger(&self) -> Box { Box::new(GithubActionLogger) } diff --git a/src/run/ci_provider/interfaces.rs b/src/run/ci_provider/interfaces.rs index 1731094..bddf7ae 100644 --- a/src/run/ci_provider/interfaces.rs +++ b/src/run/ci_provider/interfaces.rs @@ -1,5 +1,12 @@ use serde::{Deserialize, Serialize}; +#[derive(Deserialize, Serialize, Debug, Clone, PartialEq)] +#[serde(rename_all = "UPPERCASE")] +pub enum RepositoryProvider { + GitLab, + GitHub, +} + #[derive(Deserialize, Serialize, Debug)] #[serde(rename_all = "camelCase")] pub struct CIProviderMetadata { diff --git a/src/run/ci_provider/local/provider.rs b/src/run/ci_provider/local/provider.rs index 57d71e0..7efd259 100644 --- a/src/run/ci_provider/local/provider.rs +++ b/src/run/ci_provider/local/provider.rs @@ -6,7 +6,7 @@ use crate::local_logger::get_local_logger; use crate::prelude::*; use crate::run::{ ci_provider::{ - interfaces::{CIProviderMetadata, RunEvent}, + interfaces::{CIProviderMetadata, RepositoryProvider, RunEvent}, provider::{CIProvider, CIProviderDetector}, }, config::Config, @@ -15,6 +15,7 @@ use crate::run::{ #[derive(Debug)] pub struct LocalProvider { + repository_provider: RepositoryProvider, pub ref_: String, pub owner: String, pub repository: String, @@ -27,11 +28,15 @@ pub struct LocalProvider { impl LocalProvider {} lazy_static! { - static ref REMOTE_REGEX: regex::Regex = - regex::Regex::new(r"[:/](?P[^/]+)/(?P[^/]+)\.git").unwrap(); + static ref REMOTE_REGEX: regex::Regex = regex::Regex::new( + r"(?P[^/@\.]+)\.\w+[:/](?P[^/]+)/(?P[^/]+)\.git" + ) + .unwrap(); } -fn extract_owner_and_repository_from_remote_url(remote_url: &str) -> Result<(String, String)> { +fn extract_provider_owner_and_repository_from_remote_url( + remote_url: &str, +) -> Result<(RepositoryProvider, String, String)> { let captures = REMOTE_REGEX.captures(remote_url).ok_or_else(|| { anyhow!( "Could not extract owner and repository from remote url: {}", @@ -39,10 +44,20 @@ fn extract_owner_and_repository_from_remote_url(remote_url: &str) -> Result<(Str ) })?; + let domain = captures.name("domain").unwrap().as_str(); + let repository_provider = serde_json::from_str(&format!("\"{}\"", domain.to_uppercase())) + .context(format!( + "Repository provider {} is not supported by CodSpeed", + domain + ))?; let owner = captures.name("owner").unwrap().as_str(); let repository = captures.name("repository").unwrap().as_str(); - Ok((owner.to_string(), repository.to_string())) + Ok(( + repository_provider, + owner.to_string(), + repository.to_string(), + )) } impl TryFrom<&Config> for LocalProvider { @@ -63,8 +78,8 @@ impl TryFrom<&Config> for LocalProvider { ))?; let remote = git_repository.find_remote("origin")?; - let (owner, repository) = - extract_owner_and_repository_from_remote_url(remote.url().unwrap())?; + let (repository_provider, owner, repository) = + extract_provider_owner_and_repository_from_remote_url(remote.url().unwrap())?; let head = git_repository.head().context("Failed to get HEAD")?; let ref_ = head @@ -80,6 +95,7 @@ impl TryFrom<&Config> for LocalProvider { }; Ok(Self { + repository_provider, ref_, head_ref, base_ref: None, @@ -98,6 +114,10 @@ impl CIProviderDetector for LocalProvider { } impl CIProvider for LocalProvider { + fn get_repository_provider(&self) -> RepositoryProvider { + self.repository_provider.clone() + } + fn get_logger(&self) -> Box { get_local_logger() } @@ -133,16 +153,41 @@ mod tests { use super::*; #[test] - fn test_extract_owner_and_repository_from_remote_url() { + fn test_extract_provider_owner_and_repository_from_remote_url() { let remote_urls = [ - "git@github.com:CodSpeedHQ/runner.git", - "https://github.com/CodSpeedHQ/runner.git", + ( + "git@github.com:CodSpeedHQ/runner.git", + RepositoryProvider::GitHub, + "CodSpeedHQ", + "runner", + ), + ( + "https://github.com/CodSpeedHQ/runner.git", + RepositoryProvider::GitHub, + "CodSpeedHQ", + "runner", + ), + ( + "git@gitlab.com:codspeed/runner.git", + RepositoryProvider::GitLab, + "codspeed", + "runner", + ), + ( + "https://gitlab.com/codspeed/runner.git", + RepositoryProvider::GitLab, + "codspeed", + "runner", + ), ]; - for remote_url in remote_urls.iter() { - let (owner, repository) = - extract_owner_and_repository_from_remote_url(remote_url).unwrap(); - assert_eq!(owner, "CodSpeedHQ"); - assert_eq!(repository, "runner"); + for (remote_url, expected_provider, expected_owner, expected_repository) in + remote_urls.into_iter() + { + let (repository_provider, owner, repository) = + extract_provider_owner_and_repository_from_remote_url(remote_url).unwrap(); + assert_eq!(repository_provider, expected_provider); + assert_eq!(owner, expected_owner); + assert_eq!(repository, expected_repository); } } diff --git a/src/run/ci_provider/provider.rs b/src/run/ci_provider/provider.rs index 6cfd60b..c9df098 100644 --- a/src/run/ci_provider/provider.rs +++ b/src/run/ci_provider/provider.rs @@ -7,7 +7,7 @@ use crate::run::config::Config; use crate::run::runner::ExecutorName; use crate::run::uploader::{Runner, UploadMetadata}; -use super::interfaces::CIProviderMetadata; +use super::interfaces::{CIProviderMetadata, RepositoryProvider}; pub trait CIProviderDetector { /// Detects if the current environment is running inside the CI provider. @@ -34,6 +34,9 @@ pub trait CIProvider { /// Returns the logger for the CI provider. fn get_logger(&self) -> Box; + /// Returns the repository provider for this CI provider + fn get_repository_provider(&self) -> RepositoryProvider; + /// Returns the name of the CI provider. /// /// # Example @@ -85,8 +88,9 @@ pub trait CIProvider { let commit_hash = get_commit_hash(&ci_provider_metadata.repository_root_path)?; Ok(UploadMetadata { - version: Some(4), + version: Some(5), tokenless: config.token.is_none(), + repository_provider: self.get_repository_provider(), ci_provider_metadata, profile_md5: archive_hash.into(), commit_hash, diff --git a/src/run/uploader/interfaces.rs b/src/run/uploader/interfaces.rs index 8362771..ebaa1d5 100644 --- a/src/run/uploader/interfaces.rs +++ b/src/run/uploader/interfaces.rs @@ -1,13 +1,16 @@ use serde::{Deserialize, Serialize}; use crate::run::{ - check_system::SystemInfo, ci_provider::interfaces::CIProviderMetadata, - instruments::InstrumentName, runner::ExecutorName, + check_system::SystemInfo, + ci_provider::interfaces::{CIProviderMetadata, RepositoryProvider}, + instruments::InstrumentName, + runner::ExecutorName, }; #[derive(Deserialize, Serialize, Debug)] #[serde(rename_all = "camelCase")] pub struct UploadMetadata { + pub repository_provider: RepositoryProvider, pub version: Option, pub tokenless: bool, pub profile_md5: String, diff --git a/src/run/uploader/snapshots/codspeed__run__uploader__upload_metadata__tests__get_metadata_hash.snap b/src/run/uploader/snapshots/codspeed__run__uploader__upload_metadata__tests__get_metadata_hash.snap index 588d111..5c67c61 100644 --- a/src/run/uploader/snapshots/codspeed__run__uploader__upload_metadata__tests__get_metadata_hash.snap +++ b/src/run/uploader/snapshots/codspeed__run__uploader__upload_metadata__tests__get_metadata_hash.snap @@ -3,6 +3,7 @@ source: src/run/uploader/upload_metadata.rs expression: upload_metadata --- { + "repositoryProvider": "GITHUB", "version": 5, "tokenless": true, "profileMd5": "jp/k05RKuqP3ERQuIIvx4Q==", diff --git a/src/run/uploader/upload_metadata.rs b/src/run/uploader/upload_metadata.rs index daeb26b..fdbee67 100644 --- a/src/run/uploader/upload_metadata.rs +++ b/src/run/uploader/upload_metadata.rs @@ -15,7 +15,9 @@ mod tests { use crate::run::{ check_system::SystemInfo, - ci_provider::interfaces::{CIProviderMetadata, GhData, RunEvent, Sender}, + ci_provider::interfaces::{ + CIProviderMetadata, GhData, RepositoryProvider, RunEvent, Sender, + }, instruments::InstrumentName, runner::ExecutorName, uploader::{Runner, UploadMetadata}, @@ -24,6 +26,7 @@ mod tests { #[test] fn test_get_metadata_hash() { let upload_metadata = UploadMetadata { + repository_provider: RepositoryProvider::GitHub, version: Some(5), tokenless: true, profile_md5: "jp/k05RKuqP3ERQuIIvx4Q==".into(), @@ -58,7 +61,7 @@ mod tests { let hash = upload_metadata.get_hash(); assert_eq!( hash, - "cd7779a9392b7da0a9ac6c1c83b490fa40cadc5e7937f50d1a71663bc20679f2" + "254024ed5eadbd4d1ece631a69e4f28f6f2837435f71e5a1994f37e31c138c2d" ); assert_json_snapshot!(upload_metadata); } From 9ce6a78920d4dda296b899f1de8429452e007ae5 Mon Sep 17 00:00:00 2001 From: fargito Date: Thu, 24 Oct 2024 14:33:28 +0200 Subject: [PATCH 8/8] feat(gitlab): implement gitlab ci provider --- src/run/ci_provider/buildkite/provider.rs | 1 + ...tests__pull_request_provider_metadata.snap | 1 + .../ci_provider/github_actions/provider.rs | 1 + ...__fork_pull_request_provider_metadata.snap | 1 + ...tests__pull_request_provider_metadata.snap | 1 + src/run/ci_provider/gitlab_ci/logger.rs | 152 +++++++++ src/run/ci_provider/gitlab_ci/mod.rs | 4 + src/run/ci_provider/gitlab_ci/provider.rs | 295 ++++++++++++++++++ ..._fork_merge_request_provider_metadata.snap | 22 ++ ...ests__merge_request_provider_metadata.snap | 22 ++ ...r__tests__push_main_provider_metadata.snap | 22 ++ src/run/ci_provider/interfaces.rs | 8 + src/run/ci_provider/local/provider.rs | 1 + src/run/ci_provider/mod.rs | 7 + ...ad_metadata__tests__get_metadata_hash.snap | 1 + src/run/uploader/upload_metadata.rs | 3 +- 16 files changed, 541 insertions(+), 1 deletion(-) create mode 100644 src/run/ci_provider/gitlab_ci/logger.rs create mode 100644 src/run/ci_provider/gitlab_ci/mod.rs create mode 100644 src/run/ci_provider/gitlab_ci/provider.rs create mode 100644 src/run/ci_provider/gitlab_ci/snapshots/codspeed__run__ci_provider__gitlab_ci__provider__tests__fork_merge_request_provider_metadata.snap create mode 100644 src/run/ci_provider/gitlab_ci/snapshots/codspeed__run__ci_provider__gitlab_ci__provider__tests__merge_request_provider_metadata.snap create mode 100644 src/run/ci_provider/gitlab_ci/snapshots/codspeed__run__ci_provider__gitlab_ci__provider__tests__push_main_provider_metadata.snap diff --git a/src/run/ci_provider/buildkite/provider.rs b/src/run/ci_provider/buildkite/provider.rs index 00ef6c9..f719f0f 100644 --- a/src/run/ci_provider/buildkite/provider.rs +++ b/src/run/ci_provider/buildkite/provider.rs @@ -159,6 +159,7 @@ impl CIProvider for BuildkiteProvider { ref_: self.ref_.clone(), repository_root_path: self.repository_root_path.clone(), gh_data: None, + gl_data: None, sender: None, }) } diff --git a/src/run/ci_provider/buildkite/snapshots/codspeed__run__ci_provider__buildkite__provider__tests__pull_request_provider_metadata.snap b/src/run/ci_provider/buildkite/snapshots/codspeed__run__ci_provider__buildkite__provider__tests__pull_request_provider_metadata.snap index f0619f9..24d10f6 100644 --- a/src/run/ci_provider/buildkite/snapshots/codspeed__run__ci_provider__buildkite__provider__tests__pull_request_provider_metadata.snap +++ b/src/run/ci_provider/buildkite/snapshots/codspeed__run__ci_provider__buildkite__provider__tests__pull_request_provider_metadata.snap @@ -11,5 +11,6 @@ expression: provider_metadata "event": "pull_request", "sender": null, "ghData": null, + "glData": null, "repositoryRootPath": "/buildkite/builds/7b10eca7600b-1/my-org/buildkite-test/" } diff --git a/src/run/ci_provider/github_actions/provider.rs b/src/run/ci_provider/github_actions/provider.rs index 12540fd..eeb66d6 100644 --- a/src/run/ci_provider/github_actions/provider.rs +++ b/src/run/ci_provider/github_actions/provider.rs @@ -138,6 +138,7 @@ impl CIProvider for GitHubActionsProvider { head_ref: self.head_ref.clone(), event: self.event.clone(), gh_data: Some(self.gh_data.clone()), + gl_data: None, sender: self.sender.clone(), owner: self.owner.clone(), repository: self.repository.clone(), diff --git a/src/run/ci_provider/github_actions/snapshots/codspeed__run__ci_provider__github_actions__provider__tests__fork_pull_request_provider_metadata.snap b/src/run/ci_provider/github_actions/snapshots/codspeed__run__ci_provider__github_actions__provider__tests__fork_pull_request_provider_metadata.snap index 3449174..fe6e8dc 100644 --- a/src/run/ci_provider/github_actions/snapshots/codspeed__run__ci_provider__github_actions__provider__tests__fork_pull_request_provider_metadata.snap +++ b/src/run/ci_provider/github_actions/snapshots/codspeed__run__ci_provider__github_actions__provider__tests__fork_pull_request_provider_metadata.snap @@ -17,5 +17,6 @@ expression: provider_metadata "runId": "6957110437", "job": "log-env" }, + "glData": null, "repositoryRootPath": "/home/runner/work/adrien-python-test/adrien-python-test/" } diff --git a/src/run/ci_provider/github_actions/snapshots/codspeed__run__ci_provider__github_actions__provider__tests__pull_request_provider_metadata.snap b/src/run/ci_provider/github_actions/snapshots/codspeed__run__ci_provider__github_actions__provider__tests__pull_request_provider_metadata.snap index 6233b72..48065dc 100644 --- a/src/run/ci_provider/github_actions/snapshots/codspeed__run__ci_provider__github_actions__provider__tests__pull_request_provider_metadata.snap +++ b/src/run/ci_provider/github_actions/snapshots/codspeed__run__ci_provider__github_actions__provider__tests__pull_request_provider_metadata.snap @@ -17,5 +17,6 @@ expression: provider_metadata "runId": "6957110437", "job": "log-env" }, + "glData": null, "repositoryRootPath": "/home/runner/work/adrien-python-test/adrien-python-test/" } diff --git a/src/run/ci_provider/gitlab_ci/logger.rs b/src/run/ci_provider/gitlab_ci/logger.rs new file mode 100644 index 0000000..6171ee5 --- /dev/null +++ b/src/run/ci_provider/gitlab_ci/logger.rs @@ -0,0 +1,152 @@ +use console::style; +use lazy_static::lazy_static; +use log::{Level, LevelFilter, Log}; +use regex::Regex; +use simplelog::SharedLogger; +use std::{ + env, + io::Write, + sync::Mutex, + time::{SystemTime, UNIX_EPOCH}, +}; + +use crate::{ + logger::{get_group_event, GroupEvent}, + run::ci_provider::logger::should_provider_logger_handle_record, +}; + +lazy_static! { + static ref GITLAB_SECTION_ID_SANITIZE_REGEX: Regex = + Regex::new(r"[^\d\w\-_]").expect("Failed to compile GitLab SectionId regex"); +} + +/// Unicode Escape character +/// +/// https://gist.github.com/fnky/458719343aabd01cfb17a3a4f7296797#general-ascii-codes +const U_ESC: char = '\x1B'; + +/// Unicode Carriage Return character +/// +/// https://gist.github.com/fnky/458719343aabd01cfb17a3a4f7296797#general-ascii-codes +const U_CR: char = '\x0D'; + +/// Reset color mode +/// +/// https://gist.github.com/fnky/458719343aabd01cfb17a3a4f7296797#colors--graphics-mode +const COLOR_RESET: &str = "\x1B[0m"; + +/// Erase cursor till end of line +/// +/// https://gist.github.com/fnky/458719343aabd01cfb17a3a4f7296797#erase-functions +const ERASE_CURSOR: &str = "\x1B[0K"; + +/// A logger that prints log in the format expected by GitLab CI +/// +/// See https://docs.gitlab.com/ee/ci/yaml/script.html +pub struct GitLabCILogger { + log_level: LevelFilter, + section_id: Mutex>, +} + +impl GitLabCILogger { + pub fn new() -> Self { + // force activation of colors, because GitlabCI does not + // respect the CLICOLORS spec. + // https://gitlab.com/gitlab-org/gitlab/-/issues/28598 + console::set_colors_enabled(true); + + let log_level = env::var("CODSPEED_LOG") + .ok() + .and_then(|log_level| log_level.parse::().ok()) + .unwrap_or(log::LevelFilter::Info); + Self { + log_level, + section_id: Mutex::new(None), + } + } +} + +impl Log for GitLabCILogger { + fn enabled(&self, _metadata: &log::Metadata) -> bool { + true + } + + fn log(&self, record: &log::Record) { + if !should_provider_logger_handle_record(record) { + return; + } + + let level = record.level(); + let message = record.args(); + + if let Some(group_event) = get_group_event(record) { + let now = SystemTime::now(); + let timestamp = now.duration_since(UNIX_EPOCH).unwrap().as_secs(); + let mut section_id = self.section_id.lock().unwrap(); + + match group_event { + GroupEvent::Start(name) | GroupEvent::StartOpened(name) => { + let new_section_id = GITLAB_SECTION_ID_SANITIZE_REGEX + .replace_all(&name, "_") + .to_ascii_lowercase(); + + *section_id = Some(new_section_id.to_string()); + + // https://docs.gitlab.com/ee/ci/yaml/script.html#custom-collapsible-sections + println!("{ERASE_CURSOR}section_start:{timestamp}:{new_section_id}{U_CR}{ERASE_CURSOR}{U_ESC}[36;1m{name}{COLOR_RESET}"); + } + GroupEvent::End => { + // do not fail if there is no current section + let current_section_id = section_id.clone().unwrap_or("".to_string()); + + // https://docs.gitlab.com/ee/ci/yaml/script.html#custom-collapsible-sections + println!("{ERASE_CURSOR}section_end:{timestamp}:{current_section_id}{U_CR}{ERASE_CURSOR}"); + + *section_id = None; + } + } + return; + } + + if level > self.log_level { + return; + } + + // set log colors. See https://gist.github.com/fnky/458719343aabd01cfb17a3a4f7296797#colors--graphics-mode + match level { + Level::Error => { + println!("{}", style(message).red()); + } + Level::Warn => { + println!("{}", style(message).yellow()); + } + Level::Info => { + println!("{message}"); + } + Level::Debug => { + println!("{}", style(message).cyan()); + } + Level::Trace => { + println!("{}", style(message).magenta()); + } + }; + } + + fn flush(&self) { + std::io::stdout().flush().unwrap(); + } +} + +impl SharedLogger for GitLabCILogger { + fn level(&self) -> LevelFilter { + self.log_level + } + + fn config(&self) -> Option<&simplelog::Config> { + None + } + + fn as_log(self: Box) -> Box { + Box::new(*self) + } +} diff --git a/src/run/ci_provider/gitlab_ci/mod.rs b/src/run/ci_provider/gitlab_ci/mod.rs new file mode 100644 index 0000000..d019f26 --- /dev/null +++ b/src/run/ci_provider/gitlab_ci/mod.rs @@ -0,0 +1,4 @@ +mod logger; +mod provider; + +pub use provider::GitLabCIProvider; diff --git a/src/run/ci_provider/gitlab_ci/provider.rs b/src/run/ci_provider/gitlab_ci/provider.rs new file mode 100644 index 0000000..31f22a8 --- /dev/null +++ b/src/run/ci_provider/gitlab_ci/provider.rs @@ -0,0 +1,295 @@ +use simplelog::SharedLogger; +use std::env; + +use crate::prelude::*; +use crate::run::ci_provider::interfaces::{ + CIProviderMetadata, GlData, RepositoryProvider, RunEvent, Sender, +}; +use crate::run::ci_provider::provider::CIProviderDetector; +use crate::run::ci_provider::CIProvider; +use crate::run::config::Config; +use crate::run::helpers::get_env_variable; + +use super::logger::GitLabCILogger; + +#[derive(Debug)] +pub struct GitLabCIProvider { + owner: String, + repository: String, + ref_: String, + head_ref: Option, + base_ref: Option, + gl_data: GlData, + sender: Sender, + event: RunEvent, + repository_root_path: String, +} + +impl TryFrom<&Config> for GitLabCIProvider { + type Error = Error; + fn try_from(_config: &Config) -> Result { + let owner = get_env_variable("CI_PROJECT_NAMESPACE")?; + let repository = get_env_variable("CI_PROJECT_NAME")?; + + let ci_pipeline_source = get_env_variable("CI_PIPELINE_SOURCE")?; + let branch_name = get_env_variable("CI_COMMIT_REF_NAME")?; + let branch_ref = format!("refs/heads/{branch_name}"); + + // https://docs.gitlab.com/ee/ci/jobs/job_rules.html#ci_pipeline_source-predefined-variable + let (event, ref_, base_ref, head_ref) = match ci_pipeline_source.as_str() { + // For pipelines created when a merge request is created or updated. Required to enable merge request pipelines, merged results pipelines, and merge trains. + // https://docs.gitlab.com/ee/ci/variables/predefined_variables.html#predefined-variables-for-merge-request-pipelines + "merge_request_event" => { + let merge_request_id = get_env_variable("CI_MERGE_REQUEST_IID")?; + let target_branch_name = get_env_variable("CI_MERGE_REQUEST_TARGET_BRANCH_NAME")?; + let source_branch_name = get_env_variable("CI_MERGE_REQUEST_SOURCE_BRANCH_NAME")?; + + // check if the merge request is from a fork + let ci_project_path = get_env_variable("CI_PROJECT_PATH")?; + let ci_merge_request_source_project_path = + get_env_variable("CI_MERGE_REQUEST_SOURCE_PROJECT_PATH")?; + + if ci_project_path != ci_merge_request_source_project_path { + let fork_owner = ci_merge_request_source_project_path + .split('/') + .next() + .expect("Malformed Source Project Path"); + + ( + RunEvent::PullRequest, + format!("refs/pull/{merge_request_id}/merge"), + Some(target_branch_name), + Some(format!("{fork_owner}:{source_branch_name}")), + ) + } else { + ( + RunEvent::PullRequest, + format!("refs/pull/{merge_request_id}/merge"), + Some(target_branch_name), + Some(source_branch_name), + ) + } + } + + // For pipelines triggered by a Git push event, including for branches and tags. + "push" => (RunEvent::Push, branch_ref, Some(branch_name), None), + + // For scheduled pipelines. + "schedule" => (RunEvent::Schedule, branch_ref, Some(branch_name), None), + + // For pipelines created by using a trigger token or created via the GitLab UI. + "trigger" | "web" => ( + RunEvent::WorkflowDispatch, + branch_ref, + Some(branch_name), + None, + ), + + _ => bail!("Event {} is not supported by CodSpeed", ci_pipeline_source), + }; + + let run_id = get_env_variable("CI_JOB_ID")?; + let job = get_env_variable("CI_JOB_NAME")?; + + let gitlab_user_id = get_env_variable("GITLAB_USER_ID")?; + let gitlab_user_login = get_env_variable("GITLAB_USER_LOGIN")?; + + let gl_data = GlData { run_id, job }; + let sender = Sender { + id: gitlab_user_id, + login: gitlab_user_login, + }; + + let repository_root_path = get_env_variable("CI_PROJECT_DIR")?; + + Ok(Self { + owner, + repository, + ref_, + head_ref, + base_ref, + gl_data, + sender, + event, + repository_root_path, + }) + } +} + +impl CIProviderDetector for GitLabCIProvider { + fn detect() -> bool { + // check if the GITLAB_CI environment variable is set and the value is truthy + env::var("GITLAB_CI") == Ok("true".into()) + } +} + +impl CIProvider for GitLabCIProvider { + fn get_logger(&self) -> Box { + Box::new(GitLabCILogger::new()) + } + + fn get_repository_provider(&self) -> RepositoryProvider { + RepositoryProvider::GitLab + } + + fn get_provider_name(&self) -> &'static str { + "GitLab CI" + } + + fn get_provider_slug(&self) -> &'static str { + "gitlab-ci" + } + + fn get_ci_provider_metadata(&self) -> Result { + Ok(CIProviderMetadata { + base_ref: self.base_ref.clone(), + head_ref: self.head_ref.clone(), + event: self.event.clone(), + gh_data: None, + gl_data: Some(self.gl_data.clone()), + sender: Some(self.sender.clone()), + owner: self.owner.clone(), + repository: self.repository.clone(), + ref_: self.ref_.clone(), + repository_root_path: self.repository_root_path.clone(), + }) + } +} + +#[cfg(test)] +mod tests { + use insta::assert_json_snapshot; + use temp_env::{with_var, with_vars}; + + use crate::VERSION; + + use super::*; + + #[test] + fn test_detect() { + with_var("GITLAB_CI", Some("true"), || { + assert!(GitLabCIProvider::detect()); + }); + } + + #[test] + fn test_push_main_provider_metadata() { + with_vars( + [ + ("GITLAB_CI", Some("true")), + ("CI_PROJECT_DIR", Some("/builds/owner/repository")), + ("GITLAB_USER_ID", Some("1234567890")), + ("GITLAB_USER_LOGIN", Some("actor")), + ("CI_PROJECT_NAME", Some("repository")), + ("CI_PROJECT_NAMESPACE", Some("owner")), + ("CI_JOB_NAME", Some("job")), + ("CI_JOB_ID", Some("1234567890")), + ("CI_PIPELINE_SOURCE", Some("push")), + ("CI_COMMIT_REF_NAME", Some("main")), + ], + || { + let config = Config { + token: Some("token".into()), + ..Config::test() + }; + let gitlab_ci_provider = GitLabCIProvider::try_from(&config).unwrap(); + let provider_metadata = gitlab_ci_provider.get_ci_provider_metadata().unwrap(); + + assert_json_snapshot!(provider_metadata, { + ".runner.version" => insta::dynamic_redaction(|value,_path| { + assert_eq!(value.as_str().unwrap(), VERSION.to_string()); + "[version]" + }), + }); + }, + ) + } + + #[test] + fn test_merge_request_provider_metadata() { + with_vars( + [ + ("GITLAB_CI", Some("true")), + ("CI_PROJECT_DIR", Some("/builds/owner/repository")), + ("GITLAB_USER_ID", Some("19605940")), + ("GITLAB_USER_LOGIN", Some("actor")), + ("CI_PROJECT_NAME", Some("repository")), + ("CI_PROJECT_NAMESPACE", Some("owner")), + ("CI_JOB_NAME", Some("build-job")), + ("CI_JOB_ID", Some("6957110437")), + ("CI_PIPELINE_SOURCE", Some("merge_request_event")), + ("CI_COMMIT_REF_NAME", Some("main")), + ("CI_MERGE_REQUEST_IID", Some("5")), + ("CI_MERGE_REQUEST_TARGET_BRANCH_NAME", Some("main")), + ( + "CI_MERGE_REQUEST_SOURCE_BRANCH_NAME", + Some("feat/awesome-feature"), + ), + ("CI_PROJECT_PATH", Some("owner/repository")), + ( + "CI_MERGE_REQUEST_SOURCE_PROJECT_PATH", + Some("owner/repository"), + ), + ], + || { + let config = Config { + token: Some("token".into()), + ..Config::test() + }; + let gitlab_ci_provider = GitLabCIProvider::try_from(&config).unwrap(); + let provider_metadata = gitlab_ci_provider.get_ci_provider_metadata().unwrap(); + + assert_json_snapshot!(provider_metadata, { + ".runner.version" => insta::dynamic_redaction(|value,_path| { + assert_eq!(value.as_str().unwrap(), VERSION.to_string()); + "[version]" + }), + }); + }, + ); + } + + #[test] + fn test_fork_merge_request_provider_metadata() { + with_vars( + [ + ("GITLAB_CI", Some("true")), + ("CI_PROJECT_DIR", Some("/builds/owner/repository")), + ("GITLAB_USER_ID", Some("19605940")), + ("GITLAB_USER_LOGIN", Some("actor")), + ("CI_PROJECT_NAME", Some("repository")), + ("CI_PROJECT_NAMESPACE", Some("owner")), + ("CI_JOB_NAME", Some("build-job")), + ("CI_JOB_ID", Some("6957110437")), + ("CI_PIPELINE_SOURCE", Some("merge_request_event")), + ("CI_COMMIT_REF_NAME", Some("main")), + ("CI_MERGE_REQUEST_IID", Some("5")), + ("CI_MERGE_REQUEST_TARGET_BRANCH_NAME", Some("main")), + ( + "CI_MERGE_REQUEST_SOURCE_BRANCH_NAME", + Some("feat/awesome-feature"), + ), + ("CI_PROJECT_PATH", Some("owner/repository")), + ( + "CI_MERGE_REQUEST_SOURCE_PROJECT_PATH", + Some("fork-owner/fork-repository"), + ), + ], + || { + let config = Config { + token: Some("token".into()), + ..Config::test() + }; + let gitlab_ci_provider = GitLabCIProvider::try_from(&config).unwrap(); + let provider_metadata = gitlab_ci_provider.get_ci_provider_metadata().unwrap(); + + assert_json_snapshot!(provider_metadata, { + ".runner.version" => insta::dynamic_redaction(|value,_path| { + assert_eq!(value.as_str().unwrap(), VERSION.to_string()); + "[version]" + }), + }); + }, + ); + } +} diff --git a/src/run/ci_provider/gitlab_ci/snapshots/codspeed__run__ci_provider__gitlab_ci__provider__tests__fork_merge_request_provider_metadata.snap b/src/run/ci_provider/gitlab_ci/snapshots/codspeed__run__ci_provider__gitlab_ci__provider__tests__fork_merge_request_provider_metadata.snap new file mode 100644 index 0000000..97a35ae --- /dev/null +++ b/src/run/ci_provider/gitlab_ci/snapshots/codspeed__run__ci_provider__gitlab_ci__provider__tests__fork_merge_request_provider_metadata.snap @@ -0,0 +1,22 @@ +--- +source: src/run/ci_provider/gitlab_ci/provider.rs +expression: provider_metadata +--- +{ + "ref": "refs/pull/5/merge", + "headRef": "fork-owner:feat/awesome-feature", + "baseRef": "main", + "owner": "owner", + "repository": "repository", + "event": "pull_request", + "sender": { + "id": "19605940", + "login": "actor" + }, + "ghData": null, + "glData": { + "runId": "6957110437", + "job": "build-job" + }, + "repositoryRootPath": "/builds/owner/repository" +} diff --git a/src/run/ci_provider/gitlab_ci/snapshots/codspeed__run__ci_provider__gitlab_ci__provider__tests__merge_request_provider_metadata.snap b/src/run/ci_provider/gitlab_ci/snapshots/codspeed__run__ci_provider__gitlab_ci__provider__tests__merge_request_provider_metadata.snap new file mode 100644 index 0000000..a8f496c --- /dev/null +++ b/src/run/ci_provider/gitlab_ci/snapshots/codspeed__run__ci_provider__gitlab_ci__provider__tests__merge_request_provider_metadata.snap @@ -0,0 +1,22 @@ +--- +source: src/run/ci_provider/gitlab_ci/provider.rs +expression: provider_metadata +--- +{ + "ref": "refs/pull/5/merge", + "headRef": "feat/awesome-feature", + "baseRef": "main", + "owner": "owner", + "repository": "repository", + "event": "pull_request", + "sender": { + "id": "19605940", + "login": "actor" + }, + "ghData": null, + "glData": { + "runId": "6957110437", + "job": "build-job" + }, + "repositoryRootPath": "/builds/owner/repository" +} diff --git a/src/run/ci_provider/gitlab_ci/snapshots/codspeed__run__ci_provider__gitlab_ci__provider__tests__push_main_provider_metadata.snap b/src/run/ci_provider/gitlab_ci/snapshots/codspeed__run__ci_provider__gitlab_ci__provider__tests__push_main_provider_metadata.snap new file mode 100644 index 0000000..58dcef0 --- /dev/null +++ b/src/run/ci_provider/gitlab_ci/snapshots/codspeed__run__ci_provider__gitlab_ci__provider__tests__push_main_provider_metadata.snap @@ -0,0 +1,22 @@ +--- +source: src/run/ci_provider/gitlab_ci/provider.rs +expression: provider_metadata +--- +{ + "ref": "refs/heads/main", + "headRef": null, + "baseRef": "main", + "owner": "owner", + "repository": "repository", + "event": "push", + "sender": { + "id": "1234567890", + "login": "actor" + }, + "ghData": null, + "glData": { + "runId": "1234567890", + "job": "job" + }, + "repositoryRootPath": "/builds/owner/repository" +} diff --git a/src/run/ci_provider/interfaces.rs b/src/run/ci_provider/interfaces.rs index bddf7ae..ff59bd5 100644 --- a/src/run/ci_provider/interfaces.rs +++ b/src/run/ci_provider/interfaces.rs @@ -19,6 +19,7 @@ pub struct CIProviderMetadata { pub event: RunEvent, pub sender: Option, pub gh_data: Option, + pub gl_data: Option, pub repository_root_path: String, } @@ -39,6 +40,13 @@ pub struct GhData { pub job: String, } +#[derive(Deserialize, Serialize, Debug, Clone)] +#[serde(rename_all = "camelCase")] +pub struct GlData { + pub run_id: String, + pub job: String, +} + #[derive(Deserialize, Serialize, Debug, Clone, PartialEq)] #[serde(rename_all = "camelCase")] pub struct Sender { diff --git a/src/run/ci_provider/local/provider.rs b/src/run/ci_provider/local/provider.rs index 7efd259..f6cb84c 100644 --- a/src/run/ci_provider/local/provider.rs +++ b/src/run/ci_provider/local/provider.rs @@ -136,6 +136,7 @@ impl CIProvider for LocalProvider { head_ref: self.head_ref.clone(), event: self.event.clone(), gh_data: None, + gl_data: None, sender: None, owner: self.owner.clone(), repository: self.repository.clone(), diff --git a/src/run/ci_provider/mod.rs b/src/run/ci_provider/mod.rs index ae06ed8..9d7e154 100644 --- a/src/run/ci_provider/mod.rs +++ b/src/run/ci_provider/mod.rs @@ -1,9 +1,11 @@ +mod gitlab_ci; pub mod interfaces; pub mod logger; mod provider; use buildkite::BuildkiteProvider; use github_actions::GitHubActionsProvider; +use gitlab_ci::GitLabCIProvider; use local::LocalProvider; use provider::CIProviderDetector; @@ -28,6 +30,11 @@ pub fn get_provider(config: &Config) -> Result> { return Ok(Box::new(provider)); } + if GitLabCIProvider::detect() { + let provider = GitLabCIProvider::try_from(config)?; + return Ok(Box::new(provider)); + } + if LocalProvider::detect() { let provider = LocalProvider::try_from(config)?; return Ok(Box::new(provider)); diff --git a/src/run/uploader/snapshots/codspeed__run__uploader__upload_metadata__tests__get_metadata_hash.snap b/src/run/uploader/snapshots/codspeed__run__uploader__upload_metadata__tests__get_metadata_hash.snap index 5c67c61..777124f 100644 --- a/src/run/uploader/snapshots/codspeed__run__uploader__upload_metadata__tests__get_metadata_hash.snap +++ b/src/run/uploader/snapshots/codspeed__run__uploader__upload_metadata__tests__get_metadata_hash.snap @@ -41,5 +41,6 @@ expression: upload_metadata "runId": "7044765741", "job": "codspeed" }, + "glData": null, "repositoryRootPath": "/home/runner/work/codspeed-node/codspeed-node/" } diff --git a/src/run/uploader/upload_metadata.rs b/src/run/uploader/upload_metadata.rs index fdbee67..3f33d31 100644 --- a/src/run/uploader/upload_metadata.rs +++ b/src/run/uploader/upload_metadata.rs @@ -54,6 +54,7 @@ mod tests { id: "19605940".into(), login: "adriencaccia".into(), }), + gl_data: None, repository_root_path: "/home/runner/work/codspeed-node/codspeed-node/".into(), }, }; @@ -61,7 +62,7 @@ mod tests { let hash = upload_metadata.get_hash(); assert_eq!( hash, - "254024ed5eadbd4d1ece631a69e4f28f6f2837435f71e5a1994f37e31c138c2d" + "161a1a3eeea6d988909142e1e7bae3339b3698aaeb025641aa63809895336ae7" ); assert_json_snapshot!(upload_metadata); }