feat(ci): support explicit runtime secret mapping #3

Merged
vadimenovikau merged 3 commits from codex/minio-runtime-secrets into main 2026-08-21 13:32:11 +00:00
Showing only changes of commit 97bdc4692c - Show all commits
+33 -3
View File
@@ -87,6 +87,33 @@ export function mergeEnvironment(source, overrides = {}) {
return rows.map((row) => row.raw ?? `${row.key}=${row.value}`).join("\n");
}
export function resolveSecretEnvironment(secretEnvironment = {}, environment = process.env) {
if (
secretEnvironment === null ||
typeof secretEnvironment !== "object" ||
Array.isArray(secretEnvironment)
) {
throw new Error("secretEnvironment must be an object.");
}
const resolved = {};
for (const [runtimeKey, rawSecretName] of Object.entries(secretEnvironment)) {
if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(runtimeKey)) {
throw new Error(`Invalid secret environment key ${runtimeKey}.`);
}
const secretName = String(rawSecretName);
if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(secretName)) {
throw new Error(`Invalid Actions secret name for ${runtimeKey}.`);
}
const value = environment[secretName];
if (value === undefined || String(value).length === 0) {
throw new Error(`Missing Actions secret ${secretName} for runtime environment ${runtimeKey}.`);
}
resolved[runtimeKey] = String(value);
}
return resolved;
}
async function readBody(response) {
const text = await response.text();
if (!text) return null;
@@ -605,9 +632,12 @@ function promoteArtifactAliases(artifacts, releaseTag, options) {
async function deployApplications({ applications, artifacts, sha, client }) {
for (const application of applications) {
const artifact = artifacts.get(application.artifact);
const environment = Object.fromEntries(
Object.entries(application.environment ?? {}).map(([key, value]) => [key, expandTokens(value, { sha })]),
);
const environment = {
...Object.fromEntries(
Object.entries(application.environment ?? {}).map(([key, value]) => [key, expandTokens(value, { sha })]),
),
...resolveSecretEnvironment(application.secretEnvironment),
};
const result = await deployExactImage({
client,
appId: application.appId,