use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum CiPlatform {
GithubActions,
GitlabCi,
CircleCi,
Generic,
Local,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CiEnvironment {
pub platform: CiPlatform,
#[serde(skip_serializing_if = "Option::is_none")]
pub workflow_ref: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub run_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub actor: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub runner_os: Option<String>,
}
#[allow(clippy::disallowed_methods)] pub fn detect_ci_environment() -> Option<CiEnvironment> {
if std::env::var("GITHUB_ACTIONS").ok().as_deref() == Some("true") {
return Some(CiEnvironment {
platform: CiPlatform::GithubActions,
workflow_ref: std::env::var("GITHUB_WORKFLOW").ok(),
run_id: std::env::var("GITHUB_RUN_ID").ok(),
actor: std::env::var("GITHUB_ACTOR").ok(),
runner_os: std::env::var("RUNNER_OS").ok(),
});
}
if std::env::var("GITLAB_CI").is_ok() {
return Some(CiEnvironment {
platform: CiPlatform::GitlabCi,
workflow_ref: std::env::var("CI_CONFIG_PATH").ok(),
run_id: std::env::var("CI_PIPELINE_ID").ok(),
actor: std::env::var("GITLAB_USER_LOGIN").ok(),
runner_os: None,
});
}
if std::env::var("CIRCLECI").is_ok() {
return Some(CiEnvironment {
platform: CiPlatform::CircleCi,
workflow_ref: std::env::var("CIRCLE_WORKFLOW_ID").ok(),
run_id: std::env::var("CIRCLE_BUILD_NUM").ok(),
actor: std::env::var("CIRCLE_USERNAME").ok(),
runner_os: None,
});
}
if std::env::var("CI").is_ok() {
return Some(CiEnvironment {
platform: CiPlatform::Generic,
workflow_ref: None,
run_id: None,
actor: None,
runner_os: None,
});
}
None
}