1# Generated from xtask::workflows::deploy_collab
2# Rebuild with `cargo xtask workflows`.
3name: deploy_collab
4env:
5 DOCKER_BUILDKIT: '1'
6on:
7 push:
8 tags:
9 - collab-production
10jobs:
11 style:
12 if: (github.repository_owner == 'zed-industries' || github.repository_owner == 'zed-extensions')
13 name: Check formatting and Clippy lints
14 runs-on: namespace-profile-16x32-ubuntu-2204
15 steps:
16 - name: steps::checkout_repo
17 uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
18 with:
19 clean: false
20 fetch-depth: 0
21 - name: steps::setup_cargo_config
22 run: |
23 mkdir -p ./../.cargo
24 cp ./.cargo/ci-config.toml ./../.cargo/config.toml
25 - name: steps::cache_rust_dependencies_namespace
26 uses: namespacelabs/nscloud-cache-action@v1
27 with:
28 cache: rust
29 path: ~/.rustup
30 - name: steps::setup_linux
31 run: ./script/linux
32 - name: steps::install_mold
33 run: ./script/install-mold
34 - name: steps::download_wasi_sdk
35 run: ./script/download-wasi-sdk
36 - name: steps::cargo_fmt
37 run: cargo fmt --all -- --check
38 - name: steps::clippy
39 run: ./script/clippy
40 tests:
41 needs:
42 - style
43 name: Run tests
44 runs-on: namespace-profile-16x32-ubuntu-2204
45 steps:
46 - name: steps::checkout_repo
47 uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
48 with:
49 clean: false
50 fetch-depth: 0
51 - name: steps::setup_cargo_config
52 run: |
53 mkdir -p ./../.cargo
54 cp ./.cargo/ci-config.toml ./../.cargo/config.toml
55 - name: steps::cache_rust_dependencies_namespace
56 uses: namespacelabs/nscloud-cache-action@v1
57 with:
58 cache: rust
59 path: ~/.rustup
60 - name: steps::setup_linux
61 run: ./script/linux
62 - name: steps::install_mold
63 run: ./script/install-mold
64 - name: steps::download_wasi_sdk
65 run: ./script/download-wasi-sdk
66 - name: steps::cargo_install_nextest
67 uses: taiki-e/install-action@nextest
68 - name: steps::clear_target_dir_if_large
69 run: ./script/clear-target-dir-if-larger-than 250
70 - name: deploy_collab::tests::run_collab_tests
71 run: cargo nextest run --package collab --no-fail-fast
72 services:
73 postgres:
74 image: postgres:15
75 env:
76 POSTGRES_HOST_AUTH_METHOD: trust
77 ports:
78 - 5432:5432
79 options: --health-cmd pg_isready --health-interval 500ms --health-timeout 5s --health-retries 10
80 publish:
81 needs:
82 - style
83 - tests
84 name: Publish collab server image
85 runs-on: namespace-profile-16x32-ubuntu-2204
86 steps:
87 - name: deploy_collab::publish::install_doctl
88 uses: digitalocean/action-doctl@v2
89 with:
90 token: ${{ secrets.DIGITALOCEAN_ACCESS_TOKEN }}
91 - name: deploy_collab::publish::sign_into_registry
92 run: doctl registry login
93 - name: steps::checkout_repo
94 uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
95 with:
96 clean: false
97 - name: deploy_collab::publish::build_docker_image
98 run: |
99 docker build -f Dockerfile-collab \
100 --build-arg "GITHUB_SHA=$GITHUB_SHA" \
101 --tag "registry.digitalocean.com/zed/collab:$GITHUB_SHA" \
102 .
103 - name: deploy_collab::publish::publish_docker_image
104 run: docker push "registry.digitalocean.com/zed/collab:${GITHUB_SHA}"
105 - name: deploy_collab::publish::prune_docker_system
106 run: docker system prune --filter 'until=72h' -f
107 deploy:
108 needs:
109 - publish
110 name: Deploy new server image
111 runs-on: namespace-profile-16x32-ubuntu-2204
112 steps:
113 - name: steps::checkout_repo
114 uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
115 with:
116 clean: false
117 - name: deploy_collab::deploy::install_doctl
118 uses: digitalocean/action-doctl@v2
119 with:
120 token: ${{ secrets.DIGITALOCEAN_ACCESS_TOKEN }}
121 - name: deploy_collab::deploy::sign_into_kubernetes
122 run: |
123 doctl kubernetes cluster kubeconfig save --expiry-seconds 600 ${{ secrets.CLUSTER_NAME }}
124 - name: deploy_collab::deploy::start_rollout
125 run: |
126 set -eu
127 if [[ $GITHUB_REF_NAME = "collab-production" ]]; then
128 export ZED_KUBE_NAMESPACE=production
129 export ZED_COLLAB_LOAD_BALANCER_SIZE_UNIT=10
130 export ZED_API_LOAD_BALANCER_SIZE_UNIT=2
131 elif [[ $GITHUB_REF_NAME = "collab-staging" ]]; then
132 export ZED_KUBE_NAMESPACE=staging
133 export ZED_COLLAB_LOAD_BALANCER_SIZE_UNIT=1
134 export ZED_API_LOAD_BALANCER_SIZE_UNIT=1
135 else
136 echo "cowardly refusing to deploy from an unknown branch"
137 exit 1
138 fi
139
140 echo "Deploying collab:$GITHUB_SHA to $ZED_KUBE_NAMESPACE"
141
142 source script/lib/deploy-helpers.sh
143 export_vars_for_environment $ZED_KUBE_NAMESPACE
144
145 ZED_DO_CERTIFICATE_ID="$(doctl compute certificate list --format ID --no-header)"
146 export ZED_DO_CERTIFICATE_ID
147 export ZED_IMAGE_ID="registry.digitalocean.com/zed/collab:${GITHUB_SHA}"
148
149 export ZED_SERVICE_NAME=collab
150 export ZED_LOAD_BALANCER_SIZE_UNIT=$ZED_COLLAB_LOAD_BALANCER_SIZE_UNIT
151 export DATABASE_MAX_CONNECTIONS=850
152 envsubst < crates/collab/k8s/collab.template.yml | kubectl apply -f -
153 kubectl -n "$ZED_KUBE_NAMESPACE" rollout status deployment/$ZED_SERVICE_NAME --watch
154 echo "deployed ${ZED_SERVICE_NAME} to ${ZED_KUBE_NAMESPACE}"
155
156 export ZED_SERVICE_NAME=api
157 export ZED_LOAD_BALANCER_SIZE_UNIT=$ZED_API_LOAD_BALANCER_SIZE_UNIT
158 export DATABASE_MAX_CONNECTIONS=60
159 envsubst < crates/collab/k8s/collab.template.yml | kubectl apply -f -
160 kubectl -n "$ZED_KUBE_NAMESPACE" rollout status deployment/$ZED_SERVICE_NAME --watch
161 echo "deployed ${ZED_SERVICE_NAME} to ${ZED_KUBE_NAMESPACE}"
162defaults:
163 run:
164 shell: bash -euxo pipefail {0}