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
22pub fn is_cd() -> bool {
24 !matches!(detect_provider(), CdProvider::Unknown)
25}
26
27static PROVIDER: OnceLock<CdProvider> = OnceLock::new();
28
29pub 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 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
67pub 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}