Skip to repository content

tenant.openagents/omega

No repository description is available.

OpenAgents Git authority 2026-07-28T05:40:03.436Z Public web read
NIP-34 coordinate30617:7649603503856e5148d571eac2766b288a8ff1e9e35d380337a1d2b0015b4f92:omega
MaintainersHidden in public view
References2 branches · 1 tag
Read-only clonegit clone https://openagents.com/git/tenant.openagents/omega.git
Browse files

deploy_collab.rs

185 lines · 6.9 KB · rust
1use gh_workflow::{Container, Event, Port, Push, Run, Step, Use, Workflow};
2use indoc::indoc;
3
4use crate::tasks::workflows::runners::{self, Platform};
5use crate::tasks::workflows::steps::{
6    self, CommonJobConditions, CommonPermissionSets, FluentBuilder as _, NamedJob, dependant_job,
7    named, use_clang,
8};
9use crate::tasks::workflows::vars;
10
11pub(crate) fn deploy_collab() -> Workflow {
12    let style = style();
13    let tests = tests(&[&style]);
14    let publish = publish(&[&style, &tests]);
15    let deploy = deploy(&[&publish]);
16
17    named::workflow()
18        .with_minimal_permissions()
19        .on(Event::default().push(Push::default().add_tag("collab-production")))
20        .add_env(("DOCKER_BUILDKIT", "1"))
21        .add_job(style.name, style.job)
22        .add_job(tests.name, tests.job)
23        .add_job(publish.name, publish.job)
24        .add_job(deploy.name, deploy.job)
25}
26
27fn style() -> NamedJob {
28    named::job(use_clang(
29        dependant_job(&[])
30            .name("Check formatting and Clippy lints")
31            .with_repository_owner_guard()
32            .runs_on(runners::LINUX_XL)
33            .add_step(steps::checkout_repo().with_full_history())
34            .add_step(steps::setup_cargo_config(Platform::Linux))
35            .add_step(steps::cache_rust_dependencies_namespace())
36            .map(steps::install_linux_dependencies)
37            .add_step(steps::cargo_fmt())
38            .add_step(steps::clippy(Platform::Linux, None)),
39    ))
40}
41
42fn tests(deps: &[&NamedJob]) -> NamedJob {
43    fn run_collab_tests() -> Step<Run> {
44        named::bash("cargo nextest run --package collab --no-fail-fast")
45    }
46
47    named::job(use_clang(
48        dependant_job(deps)
49            .name("Run tests")
50            .runs_on(runners::LINUX_XL)
51            .add_service(
52                "postgres",
53                Container::new("postgres:15@sha256:1b92e7a80c021647bf70f5d3eb66066a998e4f5cf43c07bb9dc9f729782cf88e")
54                    .add_env(("POSTGRES_HOST_AUTH_METHOD", "trust"))
55                    .ports(vec![Port::Name("5432:5432".into())])
56                    .options(
57                        "--health-cmd pg_isready \
58                         --health-interval 500ms \
59                         --health-timeout 5s \
60                         --health-retries 10",
61                    ),
62            )
63            .add_step(steps::checkout_repo().with_full_history())
64            .add_step(steps::setup_cargo_config(Platform::Linux))
65            .add_step(steps::cache_rust_dependencies_namespace())
66            .map(steps::install_linux_dependencies)
67            .add_step(steps::cargo_install_nextest())
68            .add_step(steps::clear_target_dir_if_large(Platform::Linux))
69            .add_step(run_collab_tests()),
70    ))
71}
72
73fn publish(deps: &[&NamedJob]) -> NamedJob {
74    fn install_doctl() -> Step<Use> {
75        named::uses(
76            "digitalocean",
77            "action-doctl",
78            "3cb3953159719656269e044e0e24ca16dd2a690f", // v2.5.2
79        )
80        .add_with(("token", vars::DIGITALOCEAN_ACCESS_TOKEN))
81    }
82
83    fn sign_into_registry() -> Step<Run> {
84        named::bash("doctl registry login")
85    }
86
87    fn build_docker_image() -> Step<Run> {
88        named::bash(indoc! {r#"
89            docker build -f Dockerfile-collab \
90              --build-arg "GITHUB_SHA=$GITHUB_SHA" \
91              --tag "registry.digitalocean.com/zed/collab:$GITHUB_SHA" \
92              .
93        "#})
94    }
95
96    fn publish_docker_image() -> Step<Run> {
97        named::bash(r#"docker push "registry.digitalocean.com/zed/collab:${GITHUB_SHA}""#)
98    }
99
100    fn prune_docker_system() -> Step<Run> {
101        named::bash("docker system prune --filter 'until=72h' -f")
102    }
103
104    named::job(
105        dependant_job(deps)
106            .name("Publish collab server image")
107            .runs_on(runners::LINUX_XL)
108            .add_step(install_doctl())
109            .add_step(sign_into_registry())
110            .add_step(steps::checkout_repo())
111            .add_step(build_docker_image())
112            .add_step(publish_docker_image())
113            .add_step(prune_docker_system()),
114    )
115}
116
117fn deploy(deps: &[&NamedJob]) -> NamedJob {
118    fn install_doctl() -> Step<Use> {
119        named::uses(
120            "digitalocean",
121            "action-doctl",
122            "3cb3953159719656269e044e0e24ca16dd2a690f", // v2.5.2
123        )
124        .add_with(("token", vars::DIGITALOCEAN_ACCESS_TOKEN))
125    }
126
127    fn sign_into_kubernetes() -> Step<Run> {
128        named::bash(
129            r#"doctl kubernetes cluster kubeconfig save --expiry-seconds 600 "$CLUSTER_NAME""#,
130        )
131        .add_env(("CLUSTER_NAME", vars::CLUSTER_NAME))
132    }
133
134    fn start_rollout() -> Step<Run> {
135        named::bash(indoc! {r#"
136            set -eu
137            if [[ $GITHUB_REF_NAME = "collab-production" ]]; then
138              export ZED_KUBE_NAMESPACE=production
139              export ZED_COLLAB_LOAD_BALANCER_SIZE_UNIT=10
140              export ZED_API_LOAD_BALANCER_SIZE_UNIT=2
141            elif [[ $GITHUB_REF_NAME = "collab-staging" ]]; then
142              export ZED_KUBE_NAMESPACE=staging
143              export ZED_COLLAB_LOAD_BALANCER_SIZE_UNIT=1
144              export ZED_API_LOAD_BALANCER_SIZE_UNIT=1
145            else
146              echo "cowardly refusing to deploy from an unknown branch"
147              exit 1
148            fi
149
150            echo "Deploying collab:$GITHUB_SHA to $ZED_KUBE_NAMESPACE"
151
152            source script/lib/deploy-helpers.sh
153            export_vars_for_environment "$ZED_KUBE_NAMESPACE"
154
155            ZED_DO_CERTIFICATE_ID="$(doctl compute certificate list --format ID --no-header)"
156            export ZED_DO_CERTIFICATE_ID
157            export ZED_IMAGE_ID="registry.digitalocean.com/zed/collab:${GITHUB_SHA}"
158
159            export ZED_SERVICE_NAME=collab
160            export ZED_LOAD_BALANCER_SIZE_UNIT=$ZED_COLLAB_LOAD_BALANCER_SIZE_UNIT
161            export DATABASE_MAX_CONNECTIONS=850
162            envsubst < crates/collab/k8s/collab.template.yml | kubectl apply -f -
163            kubectl -n "$ZED_KUBE_NAMESPACE" rollout status "deployment/$ZED_SERVICE_NAME" --watch
164            echo "deployed ${ZED_SERVICE_NAME} to ${ZED_KUBE_NAMESPACE}"
165
166            export ZED_SERVICE_NAME=api
167            export ZED_LOAD_BALANCER_SIZE_UNIT=$ZED_API_LOAD_BALANCER_SIZE_UNIT
168            export DATABASE_MAX_CONNECTIONS=60
169            envsubst < crates/collab/k8s/collab.template.yml | kubectl apply -f -
170            kubectl -n "$ZED_KUBE_NAMESPACE" rollout status "deployment/$ZED_SERVICE_NAME" --watch
171            echo "deployed ${ZED_SERVICE_NAME} to ${ZED_KUBE_NAMESPACE}"
172        "#})
173    }
174
175    named::job(
176        dependant_job(deps)
177            .name("Deploy new server image")
178            .runs_on(runners::LINUX_XL)
179            .add_step(steps::checkout_repo())
180            .add_step(install_doctl())
181            .add_step(sign_into_kubernetes())
182            .add_step(start_rollout()),
183    )
184}
185
Served at tenant.openagents/omega Member data and write actions are omitted.