Skip to repository content185 lines · 6.9 KB · rust
tenant.openagents/omega
No repository description is available.
OpenAgents Git authority 2026-07-28T06:49:00.358Z Public web read
NIP-34 coordinate
30617:7649603503856e5148d571eac2766b288a8ff1e9e35d380337a1d2b0015b4f92:omegaMaintainersHidden in public view
References2 branches · 1 tag
Read-only clone
git clone https://openagents.com/git/tenant.openagents/omega.gitBrowse files
deploy_collab.rs
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