deploy_collab.yml

  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}