feat: add workflow for env variables in deploy.toml
This commit is contained in:
+37
-6
@@ -1,10 +1,11 @@
|
||||
use std::collections::BTreeMap;
|
||||
use std::path::Path;
|
||||
use std::process::Command;
|
||||
|
||||
use anyhow::{Context, Result, bail};
|
||||
use std::fs;
|
||||
|
||||
pub fn execute(cmd: &str, workdir: &Path) -> Result<()> {
|
||||
pub fn execute(cmd: &str, workdir: &Path, extra_env: &BTreeMap<String, String>) -> Result<()> {
|
||||
let mut command = shell_command(cmd);
|
||||
command.current_dir(workdir);
|
||||
for (key, value) in load_dotenv(workdir)? {
|
||||
@@ -12,6 +13,9 @@ pub fn execute(cmd: &str, workdir: &Path) -> Result<()> {
|
||||
command.env(key, value);
|
||||
}
|
||||
}
|
||||
for (key, value) in extra_env {
|
||||
command.env(key, value);
|
||||
}
|
||||
|
||||
let status = command
|
||||
.status()
|
||||
@@ -125,8 +129,8 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
fn successful_commands_pass_silently() {
|
||||
execute(&ok_cmd(), Path::new(".")).unwrap();
|
||||
execute(&ok_cmd(), Path::new(".")).unwrap();
|
||||
execute(&ok_cmd(), Path::new("."), &BTreeMap::new()).unwrap();
|
||||
execute(&ok_cmd(), Path::new("."), &BTreeMap::new()).unwrap();
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -140,7 +144,7 @@ mod tests {
|
||||
];
|
||||
let err = cmds
|
||||
.iter()
|
||||
.map(|cmd| execute(cmd, &workdir))
|
||||
.map(|cmd| execute(cmd, &workdir, &BTreeMap::new()))
|
||||
.collect::<Result<Vec<_>>>()
|
||||
.unwrap_err();
|
||||
assert!(err.to_string().contains("exit code 7"), "{err:#}");
|
||||
@@ -155,7 +159,7 @@ mod tests {
|
||||
#[test]
|
||||
fn commands_run_in_workdir() {
|
||||
let workdir = tmpdir("workdir");
|
||||
execute(&marker_cmd("in-workdir.txt"), &workdir).unwrap();
|
||||
execute(&marker_cmd("in-workdir.txt"), &workdir, &BTreeMap::new()).unwrap();
|
||||
assert!(workdir.join("in-workdir.txt").exists());
|
||||
let _ = fs::remove_dir_all(workdir);
|
||||
}
|
||||
@@ -164,7 +168,7 @@ mod tests {
|
||||
fn missing_workdir_is_contextual_error() {
|
||||
let missing = tmpdir("gone");
|
||||
fs::remove_dir(&missing).unwrap();
|
||||
let err = execute(&ok_cmd(), &missing).unwrap_err();
|
||||
let err = execute(&ok_cmd(), &missing, &BTreeMap::new()).unwrap_err();
|
||||
assert!(err.to_string().contains("failed to spawn"), "{err:#}");
|
||||
}
|
||||
|
||||
@@ -224,4 +228,31 @@ mod tests {
|
||||
assert!(String::from_utf8_lossy(&out.stdout).contains("hello-env"));
|
||||
let _ = fs::remove_dir_all(workdir);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn config_env_overrides_dotenv() {
|
||||
let workdir = tmpdir("dotenv-precedence");
|
||||
let echo_var = if cfg!(windows) {
|
||||
"echo %XBP_P_VAR%"
|
||||
} else {
|
||||
"echo $XBP_P_VAR"
|
||||
};
|
||||
fs::write(workdir.join(".env"), "XBP_P_VAR=from-dotenv\n").unwrap();
|
||||
let mut extra = BTreeMap::new();
|
||||
extra.insert("XBP_P_VAR".to_string(), "from-config".to_string());
|
||||
let mut command = shell_command(echo_var);
|
||||
command.current_dir(&workdir);
|
||||
for (k, v) in load_dotenv(&workdir).unwrap() {
|
||||
if std::env::var_os(&k).is_none() {
|
||||
command.env(k, v);
|
||||
}
|
||||
}
|
||||
for (k, v) in &extra {
|
||||
command.env(k, v);
|
||||
}
|
||||
let out = command.output().unwrap();
|
||||
assert!(String::from_utf8_lossy(&out.stdout).contains("from-config"));
|
||||
assert!(!String::from_utf8_lossy(&out.stdout).contains("from-dotenv"));
|
||||
let _ = fs::remove_dir_all(workdir);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user