feat(integrations): New CircleCI Context Sync

This commit is contained in:
McPizza
2024-12-10 20:07:23 +01:00
parent c648235390
commit cc3d132f5d
16 changed files with 633 additions and 2 deletions
@@ -2343,6 +2343,89 @@ const syncSecretsCircleCI = async ({
);
};
/**
* Sync/push [secrets] to CircleCI Context
*/
const syncSecretsCircleCIContext = async ({
integration,
secrets,
accessToken
}: {
integration: TIntegrations;
secrets: Record<string, { value: string; comment?: string }>;
accessToken: string;
}) => {
// sync secrets to CircleCI
await Promise.all(
Object.keys(secrets).map(async (key) =>
request.put(
`${IntegrationUrls.CIRCLECI_API_URL}/v2/context/${integration.appId}/environment-variable/${key}`,
{
value: secrets[key].value
},
{
headers: {
"Circle-Token": accessToken,
"Content-Type": "application/json"
}
}
)
)
);
// get secrets from CircleCI
const getSecretsRes = async () => {
type EnvVars = {
variable: string;
created_at: string;
updated_at: string;
context_id: string;
};
type ResponseSchema = {
items: EnvVars[];
next_page_token: string | null;
};
let nextPageToken: string | null | undefined;
const envVars: EnvVars[] = [];
while (nextPageToken !== null) {
const res = await request.get<ResponseSchema>(
`${IntegrationUrls.CIRCLECI_API_URL}/v2/context/${integration.appId}/environment-variable`,
{
headers: {
"Circle-Token": accessToken,
"Accept-Encoding": "application/json"
}
}
);
envVars.push(...res.data.items);
nextPageToken = res.data.next_page_token;
}
return envVars;
};
// delete secrets from CircleCI
await Promise.all(
(await getSecretsRes()).map(async (sec) => {
if (!(sec.variable in secrets)) {
return request.delete(
`${IntegrationUrls.CIRCLECI_API_URL}/v2/context/${integration.appId}/environment-variable/${sec.variable}`,
{
headers: {
"Circle-Token": accessToken,
"Content-Type": "application/json"
}
}
);
}
})
);
};
/**
* Sync/push [secrets] to Databricks project
*/
@@ -4433,6 +4516,13 @@ export const syncIntegrationSecrets = async ({
accessToken
});
break;
case Integrations.CIRCLECI_CONTEXT:
await syncSecretsCircleCIContext({
integration,
secrets,
accessToken
});
break;
case Integrations.DATABRICKS:
await syncSecretsDatabricks({
integration,