diff options
author | Elizabeth Alexander Hunt <me@liz.coffee> | 2025-05-10 16:57:03 -0700 |
---|---|---|
committer | Elizabeth Alexander Hunt <me@liz.coffee> | 2025-05-10 16:57:03 -0700 |
commit | fa8f3f9465e87d499f7d6428323f496a884b7818 (patch) | |
tree | ab477dfa52ef30282029c4f136bf605cb24d67a9 /.ci | |
download | ci-fa8f3f9465e87d499f7d6428323f496a884b7818.tar.gz ci-fa8f3f9465e87d499f7d6428323f496a884b7818.zip |
initial commit
Diffstat (limited to '.ci')
-rw-r--r-- | .ci/ci.json | 3 | ||||
-rw-r--r-- | .ci/ci.ts | 82 |
2 files changed, 85 insertions, 0 deletions
diff --git a/.ci/ci.json b/.ci/ci.json new file mode 100644 index 0000000..dc29f8d --- /dev/null +++ b/.ci/ci.json @@ -0,0 +1,3 @@ +{ + "pipeline": ".ci/ci.ts" +} diff --git a/.ci/ci.ts b/.ci/ci.ts new file mode 100644 index 0000000..c876762 --- /dev/null +++ b/.ci/ci.ts @@ -0,0 +1,82 @@ +#!/usr/bin/env -S deno run --allow-env + +import { + BuildDockerImageJob, + DefaultGitHookPipelineBuilder, +} from "@liz-ci/model"; +import { AnsiblePlaybookJob, FetchCodeJob } from "../model/job.ts"; + +const REGISTRY = "oci.liz.coffee"; +const NAMESPACE = "img"; +const IMG = "liz-ci"; + +const getPipeline = () => { + const gitHookPipeline = new DefaultGitHookPipelineBuilder(); + const branch = gitHookPipeline.getBranch(); + if (!branch) return gitHookPipeline.build(); + + const commonBuildArgs = { + registry: REGISTRY, + namespace: NAMESPACE, + imageTag: branch, + }; + + const ciPackageBuild: BuildDockerImageJob = { + type: "build_docker_image", + arguments: { + ...commonBuildArgs, + context: gitHookPipeline.getSourceDestination(), + repository: IMG, + buildTarget: IMG, + dockerfile: "Dockerfile", + }, + }; + gitHookPipeline.addStage({ + parallelJobs: [ciPackageBuild], + }); + + const subPackages = [ + "worker", + "hooks", + ].map((_package) => ({ + type: "build_docker_image", + arguments: { + ...commonBuildArgs, + repository: `${IMG}-${_package}`, + buildTarget: _package, + dockerfile: `${_package}/Dockerfile`, + }, + })); + gitHookPipeline.addStage({ + parallelJobs: subPackages, + }); + + const isRelease = branch === "release"; + if (!isRelease) { + return gitHookPipeline.build(); + } + + const fetchAnsibleCode: FetchCodeJob = { + type: "fetch_code", + arguments: { + remoteUrl: "ssh://src.liz.coffee:2222/infra", + checkout: "main", + path: "infra", + }, + }; + const thenDeploy: AnsiblePlaybookJob = { + type: "ansible_playbook", + arguments: { + playbooks: "playbooks/ci.yml", + }, + }; + [fetchAnsibleCode, thenDeploy].forEach((deploymentStage) => + gitHookPipeline.addStage({ parallelJobs: [deploymentStage] }) + ); + + return gitHookPipeline.build(); +}; + +if (import.meta.main) { + console.log(getPipeline().serialize()); +} |