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