| use std::sync::atomic::{AtomicBool, Ordering}; |
| use std::sync::Once; |
| |
| static INIT: Once = Once::new(); |
| static IS_CI: AtomicBool = AtomicBool::new(false); |
| |
| /// Returns true if the current environment is found to probably be a CI |
| /// environment or service. That's it, that's all it does. |
| #[deprecated(since = "1.1.0", note = "Use `cached` or `uncached` instead")] |
| pub fn is_ci() -> bool { |
| uncached() |
| } |
| |
| /// Returns true if the current environment is found to probably be a CI |
| /// environment or service, and caches the result for future calls. If you |
| /// expect the environment to change, use [uncached]. |
| pub fn cached() -> bool { |
| INIT.call_once(|| IS_CI.store(uncached(), Ordering::Relaxed)); |
| IS_CI.load(Ordering::Relaxed) |
| } |
| |
| /// Returns true if the current environment is found to probably be a CI |
| /// environment or service. If you expect to call this multiple times without |
| /// the environment changing, use [cached]. |
| pub fn uncached() -> bool { |
| let ci_var = std::env::var("CI"); |
| ci_var == Ok("true".into()) |
| || ci_var == Ok("1".into()) |
| || check("CI_NAME") |
| || check("GITHUB_ACTION") |
| || check("GITLAB_CI") |
| || check("NETLIFY") |
| || check("TRAVIS") |
| || matches!(std::env::var("NODE"), Ok(node) if node.ends_with("//heroku/node/bin/node")) |
| || check("CODEBUILD_SRC_DIR") |
| || check("BUILDER_OUTPUT") |
| || check("GITLAB_DEPLOYMENT") |
| || check("NOW_GITHUB_DEPLOYMENT") |
| || check("NOW_BUILDER") |
| || check("BITBUCKET_DEPLOYMENT") |
| || check("GERRIT_PROJECT") |
| || check("SYSTEM_TEAMFOUNDATIONCOLLECTIONURI") |
| || check("BITRISE_IO") |
| || check("BUDDY_WORKSPACE_ID") |
| || check("BUILDKITE") |
| || check("CIRRUS_CI") |
| || check("APPVEYOR") |
| || check("CIRCLECI") |
| || check("SEMAPHORE") |
| || check("DRONE") |
| || check("DSARI") |
| || check("TDDIUM") |
| || check("STRIDER") |
| || check("TASKCLUSTER_ROOT_URL") |
| || check("JENKINS_URL") |
| || check("bamboo.buildKey") |
| || check("GO_PIPELINE_NAME") |
| || check("HUDSON_URL") |
| || check("WERCKER") |
| || check("MAGNUM") |
| || check("NEVERCODE") |
| || check("RENDER") |
| || check("SAIL_CI") |
| || check("SHIPPABLE") |
| } |
| |
| fn check(name: &str) -> bool { |
| std::env::var(name).is_ok() |
| } |