cd_env/
lib.rs

1mod api;
2mod aws_codedeploy;
3mod digital_ocean;
4mod fly;
5mod go_cd;
6mod google_appengine;
7mod google_cloud_run;
8mod harness;
9mod heroku;
10mod netlify;
11mod octopus;
12mod railway;
13mod release;
14mod render;
15mod seed;
16mod vercel;
17
18pub use api::*;
19use std::env;
20use std::sync::OnceLock;
21
22/// Returns true if in a CD environment by checking for the existence of a deploy provider environment variable.
23pub fn is_cd() -> bool {
24    !matches!(detect_provider(), CdProvider::Unknown)
25}
26
27static PROVIDER: OnceLock<CdProvider> = OnceLock::new();
28
29/// Detects the CD provider by checking for the existence of environment variables specific to each provider. Returns `Unknown` if no provider is detected.
30pub fn detect_provider() -> CdProvider {
31    *PROVIDER.get_or_init(|| {
32        for (key, value) in env::vars() {
33            if value.is_empty() {
34                continue;
35            }
36
37            return match key.as_str() {
38                "DEPLOYMENT_GROUP_NAME" => CdProvider::AwsCodedeploy,
39                "FLY_APP_NAME" => CdProvider::Fly,
40                "GAE_SERVICE" => CdProvider::GoogleAppEngine,
41                "GO_PIPELINE_NAME" | "GO_PIPELINE_LABEL" => CdProvider::GoCD,
42                "HARNESS_BUILD_ID" => CdProvider::Harness,
43                "HEROKU_APP_ID" | "DYNO" => CdProvider::Heroku,
44                "K_SERVICE" | "CLOUD_RUN_JOB" => CdProvider::GoogleCloudRun,
45                "NETLIFY" => CdProvider::Netlify,
46                "OCTOPUS_RELEASE_ID" => CdProvider::Octopus,
47                "RAILWAY_STATIC_URL" => CdProvider::Railway,
48                "RELEASE_BUILD_ID" => CdProvider::Release,
49                "RENDER" => CdProvider::Render,
50                "SEED_APP_NAME" => CdProvider::Seed,
51                "VERCEL" => CdProvider::Vercel,
52                _ => {
53                    continue;
54                }
55            };
56        }
57
58        // Not sure if correct...
59        if env::var("COMMIT_HASH").is_ok() && env::var("PUBLIC_URL").is_ok() {
60            return CdProvider::DigitalOceanAppPlatform;
61        }
62
63        CdProvider::Unknown
64    })
65}
66
67/// Returns metadata and information about the current deploy environment and CD provider.
68pub fn get_environment() -> Option<CdEnvironment> {
69    let environment = match detect_provider() {
70        CdProvider::AwsCodedeploy => aws_codedeploy::create_environment(),
71        CdProvider::DigitalOceanAppPlatform => digital_ocean::create_environment(),
72        CdProvider::Fly => fly::create_environment(),
73        CdProvider::GoCD => go_cd::create_environment(),
74        CdProvider::GoogleAppEngine => google_appengine::create_environment(),
75        CdProvider::GoogleCloudRun => google_cloud_run::create_environment(),
76        CdProvider::Harness => harness::create_environment(),
77        CdProvider::Heroku => heroku::create_environment(),
78        CdProvider::Netlify => netlify::create_environment(),
79        CdProvider::Octopus => octopus::create_environment(),
80        CdProvider::Railway => railway::create_environment(),
81        CdProvider::Release => release::create_environment(),
82        CdProvider::Render => render::create_environment(),
83        CdProvider::Seed => seed::create_environment(),
84        CdProvider::Vercel => vercel::create_environment(),
85        CdProvider::Unknown => {
86            return None;
87        }
88    };
89
90    Some(environment)
91}