summaryrefslogtreecommitdiff
path: root/worker/scripts/ansible_playbook.ts
diff options
context:
space:
mode:
authorElizabeth Hunt <me@liz.coffee>2025-06-20 14:53:38 -0700
committerElizabeth Hunt <me@liz.coffee>2025-06-20 14:53:38 -0700
commitd4791f3d357634daf506fb8f91cc5332a794c421 (patch)
tree1bb01d2d4d8fa74d83bb6f99f2c8aa4146ca2d11 /worker/scripts/ansible_playbook.ts
parentd7e8d31c94cd713a2f4cf799e20e993acc69e361 (diff)
downloadci-d4791f3d357634daf506fb8f91cc5332a794c421.tar.gz
ci-d4791f3d357634daf506fb8f91cc5332a794c421.zip
Move to nodejs
Diffstat (limited to 'worker/scripts/ansible_playbook.ts')
-rwxr-xr-xworker/scripts/ansible_playbook.ts193
1 files changed, 90 insertions, 103 deletions
diff --git a/worker/scripts/ansible_playbook.ts b/worker/scripts/ansible_playbook.ts
index 0879dc5..c6d8f2c 100755
--- a/worker/scripts/ansible_playbook.ts
+++ b/worker/scripts/ansible_playbook.ts
@@ -1,113 +1,100 @@
-#!/usr/bin/env -S deno run --allow-env --allow-net --allow-run --allow-read --allow-write
+#!/usr/bin/env node
import {
- Either,
- getRequiredEnvVars,
- getStdout,
- type IEither,
- LogTraceable,
- LogMetricTraceable,
- Metric,
- prependWith,
- TraceUtil,
-} from "@emprespresso/pengueno";
-import type { AnsiblePlaybookJob } from "@emprespresso/ci_model";
-import { Bitwarden, type SecureNote } from "@emprespresso/ci_worker";
+ Either,
+ getRequiredEnvVars,
+ getStdout,
+ type IEither,
+ LogTraceable,
+ LogMetricTraceable,
+ Metric,
+ prependWith,
+ TraceUtil,
+} from '@emprespresso/pengueno';
+import type { AnsiblePlaybookJob } from '@emprespresso/ci_model';
+import { Bitwarden, type SecureNote } from '@emprespresso/ci_worker';
+import { writeFile, mkdtemp } from 'fs/promises';
+import { join } from 'path';
+import { tmpdir } from 'os';
-const eitherJob = getRequiredEnvVars([
- "path",
- "playbooks",
-])
- .mapRight((baseArgs) => (
- <AnsiblePlaybookJob> {
- type: "ansible_playbook.ts",
- arguments: baseArgs,
- }
- ));
+const eitherJob = getRequiredEnvVars(['path', 'playbooks']).mapRight(
+ (baseArgs) =>
+ <AnsiblePlaybookJob>{
+ type: 'ansible_playbook.ts',
+ arguments: baseArgs,
+ },
+);
-const eitherVault = Bitwarden.getConfigFromEnvironment()
- .mapRight((config) => new Bitwarden(config));
+const eitherVault = Bitwarden.getConfigFromEnvironment().mapRight((config) => new Bitwarden(config));
-const playbookMetric = Metric.fromName("ansiblePlaybook.playbook");
-const _logJob = LogTraceable.of(eitherJob).bimap(TraceUtil.withTrace("ansible_playbook"));
-await LogMetricTraceable.ofLogTraceable(_logJob).bimap(TraceUtil.withMetricTrace(playbookMetric))
- .peek((tEitherJob) =>
- tEitherJob.trace.trace("starting ansible playbook job! (⑅˘꒳˘)")
- )
- .map((tEitherJob) =>
- tEitherJob.get().flatMapAsync((job) =>
- eitherVault.flatMapAsync(async (vault) => {
- const eitherKey = await vault.unlock(tEitherJob);
- return eitherKey.mapRight((key) => ({ job, key, vault }));
- })
+const playbookMetric = Metric.fromName('ansiblePlaybook.playbook');
+const _logJob = LogTraceable.of(eitherJob).bimap(TraceUtil.withTrace('ansible_playbook'));
+await LogMetricTraceable.ofLogTraceable(_logJob)
+ .bimap(TraceUtil.withMetricTrace(playbookMetric))
+ .peek((tEitherJob) => tEitherJob.trace.trace('starting ansible playbook job! (⑅˘꒳˘)'))
+ .map((tEitherJob) =>
+ tEitherJob.get().flatMapAsync((job) =>
+ eitherVault.flatMapAsync(async (vault) => {
+ const eitherKey = await vault.unlock(tEitherJob);
+ return eitherKey.mapRight((key) => ({ job, key, vault }));
+ }),
+ ),
)
- )
- .map(async (tEitherJobVault) => {
- tEitherJobVault.trace.trace(
- "getting ansible secwets uwu~",
- );
- const eitherJobVault = await tEitherJobVault.get();
-
- const eitherSshKey = await eitherJobVault
- .flatMapAsync(({ key, vault }) =>
- vault.fetchSecret<SecureNote>(tEitherJobVault, key, "ssh_key")
- );
- const eitherSshKeyFile = await eitherSshKey.mapRight(({ notes }) => notes)
- .flatMapAsync(saveToTempFile);
- const eitherAnsibleSecrets = await eitherJobVault
- .flatMapAsync(({ key, vault }) =>
- vault.fetchSecret<SecureNote>(tEitherJobVault, key, "ansible_playbooks")
- );
- const eitherAnsibleSecretsFile = await eitherAnsibleSecrets.mapRight((
- { notes },
- ) => notes).flatMapAsync(saveToTempFile);
+ .map(async (tEitherJobVault) => {
+ tEitherJobVault.trace.trace('getting ansible secwets uwu~');
+ const eitherJobVault = await tEitherJobVault.get();
- return eitherJobVault.flatMapAsync(async ({ job, vault, key }) => {
- const eitherLocked = await vault.lock(tEitherJobVault, key);
- return eitherLocked.flatMap((_locked) =>
- eitherSshKeyFile.flatMap((sshKeyFile) =>
- eitherAnsibleSecretsFile.mapRight((secretsFile) => ({
- job,
- sshKeyFile,
- secretsFile,
- }))
- )
- );
- });
- })
- .map(async (tEitherJobAndSecrets) => {
- const eitherJobAndSecrets = await tEitherJobAndSecrets.get();
- return eitherJobAndSecrets.flatMapAsync(
- ({ job, sshKeyFile, secretsFile }) => {
- const volumes = [
- `${job.arguments.path}:/ansible`,
- `${sshKeyFile}:/root/id_rsa`,
- `${secretsFile}:/ansible/secrets.yml`,
- ];
- const playbookCmd =
- `ansible-playbook -e @secrets.yml ${job.arguments.playbooks}`;
- const deployCmd = [
- "docker",
- "run",
- ...prependWith(volumes, "-v"),
- "willhallonline/ansible:latest",
- ...playbookCmd.split(" "),
- ];
- tEitherJobAndSecrets.trace.trace(
- `running ansible magic~ (◕ᴗ◕✿) ${deployCmd}`,
+ const eitherSshKey = await eitherJobVault.flatMapAsync(({ key, vault }) =>
+ vault.fetchSecret<SecureNote>(tEitherJobVault, key, 'ssh_key'),
);
- return tEitherJobAndSecrets.move(deployCmd).map(getStdout).get();
- },
- );
- })
- .get();
+ const eitherSshKeyFile = await eitherSshKey.mapRight(({ notes }) => notes).flatMapAsync(saveToTempFile);
+ const eitherAnsibleSecrets = await eitherJobVault.flatMapAsync(({ key, vault }) =>
+ vault.fetchSecret<SecureNote>(tEitherJobVault, key, 'ansible_playbooks'),
+ );
+ const eitherAnsibleSecretsFile = await eitherAnsibleSecrets
+ .mapRight(({ notes }) => notes)
+ .flatMapAsync(saveToTempFile);
+
+ return eitherJobVault.flatMapAsync(async ({ job, vault, key }) => {
+ const eitherLocked = await vault.lock(tEitherJobVault, key);
+ return eitherLocked.flatMap((_locked) =>
+ eitherSshKeyFile.flatMap((sshKeyFile) =>
+ eitherAnsibleSecretsFile.mapRight((secretsFile) => ({
+ job,
+ sshKeyFile,
+ secretsFile,
+ })),
+ ),
+ );
+ });
+ })
+ .map(async (tEitherJobAndSecrets) => {
+ const eitherJobAndSecrets = await tEitherJobAndSecrets.get();
+ return eitherJobAndSecrets.flatMapAsync(({ job, sshKeyFile, secretsFile }) => {
+ const volumes = [
+ `${job.arguments.path}:/ansible`,
+ `${sshKeyFile}:/root/id_rsa`,
+ `${secretsFile}:/ansible/secrets.yml`,
+ ];
+ const playbookCmd = `ansible-playbook -e @secrets.yml ${job.arguments.playbooks}`;
+ const deployCmd = [
+ 'docker',
+ 'run',
+ ...prependWith(volumes, '-v'),
+ 'willhallonline/ansible:latest',
+ ...playbookCmd.split(' '),
+ ];
+ tEitherJobAndSecrets.trace.trace(`running ansible magic~ (◕ᴗ◕✿) ${deployCmd}`);
+ return tEitherJobAndSecrets.move(deployCmd).map(getStdout).get();
+ });
+ })
+ .get();
const saveToTempFile = (text: string): Promise<IEither<Error, string>> =>
- Either.fromFailableAsync(
- () => Deno.makeTempDir({ dir: Deno.cwd() })
- .then((dir) => Deno.makeTempFile({ dir }))
- .then(async (f) => {
- await Deno.writeTextFile(f, text);
- return f;
- }),
- );
+ Either.fromFailableAsync(() =>
+ mkdtemp(join(tmpdir(), 'ci-')).then(async (dir) => {
+ const filePath = join(dir, 'temp-file');
+ await writeFile(filePath, text);
+ return filePath;
+ }),
+ );