| @@ -1,146 +1,152 @@ |
| 1 | | −name: Publish Collab Server Image |
| 2 | | − |
| 1 | +# Generated from xtask::workflows::deploy_collab |
| 2 | +# Rebuild with `cargo xtask workflows`. |
| 3 | +name: deploy_collab |
| 4 | +env: |
| 5 | + DOCKER_BUILDKIT: '1' |
| 3 | 6 | on: |
| 4 | 7 | push: |
| 5 | 8 | tags: |
| 6 | | − - collab-production |
| 7 | | − - collab-staging |
| 8 | | − |
| 9 | | −env: |
| 10 | | − DOCKER_BUILDKIT: 1 |
| 11 | | − |
| 9 | + - collab-production |
| 12 | 10 | jobs: |
| 13 | 11 | style: |
| 12 | + if: (github.repository_owner == 'zed-industries' || github.repository_owner == 'zed-extensions') |
| 14 | 13 | name: Check formatting and Clippy lints |
| 15 | | − if: github.repository_owner == 'zed-industries' |
| 16 | | − runs-on: |
| 17 | | − - namespace-profile-16x32-ubuntu-2204 |
| 14 | + runs-on: namespace-profile-16x32-ubuntu-2204 |
| 18 | 15 | steps: |
| 19 | | − - name: Checkout repo |
| 20 | | − uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 |
| 21 | | − with: |
| 22 | | − clean: false |
| 23 | | − fetch-depth: 0 |
| 24 | | − |
| 25 | | − - name: Run style checks |
| 26 | | − uses: ./.github/actions/check_style |
| 27 | | − |
| 28 | | − - name: Run clippy |
| 29 | | − run: ./script/clippy |
| 30 | | − |
| 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 |
| 31 | 34 | tests: |
| 35 | + needs: |
| 36 | + - style |
| 32 | 37 | name: Run tests |
| 33 | | − runs-on: |
| 34 | | − - namespace-profile-16x32-ubuntu-2204 |
| 35 | | − needs: style |
| 38 | + runs-on: namespace-profile-16x32-ubuntu-2204 |
| 36 | 39 | steps: |
| 37 | | − - name: Checkout repo |
| 38 | | − uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 |
| 39 | | − with: |
| 40 | | − clean: false |
| 41 | | − fetch-depth: 0 |
| 42 | | − |
| 43 | | − - name: Install cargo nextest |
| 44 | | − uses: taiki-e/install-action@nextest |
| 45 | | − |
| 46 | | − - name: Limit target directory size |
| 47 | | − shell: bash -euxo pipefail {0} |
| 48 | | − run: script/clear-target-dir-if-larger-than 300 |
| 49 | | − |
| 50 | | − - name: Run tests |
| 51 | | − shell: bash -euxo pipefail {0} |
| 52 | | − run: cargo nextest run --package collab --no-fail-fast |
| 53 | | − |
| 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 |
| 54 | 68 | publish: |
| 55 | | − name: Publish collab server image |
| 56 | 69 | needs: |
| 57 | | − - style |
| 58 | | − - tests |
| 59 | | − runs-on: |
| 60 | | − - namespace-profile-16x32-ubuntu-2204 |
| 70 | + - style |
| 71 | + - tests |
| 72 | + name: Publish collab server image |
| 73 | + runs-on: namespace-profile-16x32-ubuntu-2204 |
| 61 | 74 | steps: |
| 62 | | − - name: Install doctl |
| 63 | | − uses: digitalocean/action-doctl@v2 |
| 64 | | − with: |
| 65 | | − token: ${{ secrets.DIGITALOCEAN_ACCESS_TOKEN }} |
| 66 | | − |
| 67 | | − - name: Sign into DigitalOcean docker registry |
| 68 | | − run: doctl registry login |
| 69 | | − |
| 70 | | − - name: Checkout repo |
| 71 | | − uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 |
| 72 | | − with: |
| 73 | | − clean: false |
| 74 | | − |
| 75 | | − - name: Build docker image |
| 76 | | − run: | |
| 77 | | − docker build -f Dockerfile-collab \ |
| 78 | | − --build-arg "GITHUB_SHA=$GITHUB_SHA" \ |
| 79 | | − --tag "registry.digitalocean.com/zed/collab:$GITHUB_SHA" \ |
| 80 | | − . |
| 81 | | − |
| 82 | | − - name: Publish docker image |
| 83 | | − run: docker push "registry.digitalocean.com/zed/collab:${GITHUB_SHA}" |
| 84 | | − |
| 85 | | − - name: Prune Docker system |
| 86 | | − run: docker system prune --filter 'until=72h' -f |
| 87 | | − |
| 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 |
| 88 | 95 | deploy: |
| 89 | | − name: Deploy new server image |
| 90 | 96 | needs: |
| 91 | | − - publish |
| 92 | | − runs-on: |
| 93 | | − - namespace-profile-16x32-ubuntu-2204 |
| 94 | | − |
| 97 | + - publish |
| 98 | + name: Deploy new server image |
| 99 | + runs-on: namespace-profile-16x32-ubuntu-2204 |
| 95 | 100 | steps: |
| 96 | | − - name: Checkout repo |
| 97 | | − uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 |
| 98 | | − with: |
| 99 | | − clean: false |
| 100 | | − |
| 101 | | − - name: Install doctl |
| 102 | | − uses: digitalocean/action-doctl@v2 |
| 103 | | − with: |
| 104 | | − token: ${{ secrets.DIGITALOCEAN_ACCESS_TOKEN }} |
| 105 | | − |
| 106 | | − - name: Sign into Kubernetes |
| 107 | | − run: doctl kubernetes cluster kubeconfig save --expiry-seconds 600 ${{ secrets.CLUSTER_NAME }} |
| 108 | | − |
| 109 | | − - name: Start rollout |
| 110 | | − run: | |
| 111 | | − set -eu |
| 112 | | − if [[ $GITHUB_REF_NAME = "collab-production" ]]; then |
| 113 | | − export ZED_KUBE_NAMESPACE=production |
| 114 | | − export ZED_COLLAB_LOAD_BALANCER_SIZE_UNIT=10 |
| 115 | | − export ZED_API_LOAD_BALANCER_SIZE_UNIT=2 |
| 116 | | − elif [[ $GITHUB_REF_NAME = "collab-staging" ]]; then |
| 117 | | − export ZED_KUBE_NAMESPACE=staging |
| 118 | | − export ZED_COLLAB_LOAD_BALANCER_SIZE_UNIT=1 |
| 119 | | − export ZED_API_LOAD_BALANCER_SIZE_UNIT=1 |
| 120 | | − else |
| 121 | | − echo "cowardly refusing to deploy from an unknown branch" |
| 122 | | − exit 1 |
| 123 | | − fi |
| 124 | | − |
| 125 | | − echo "Deploying collab:$GITHUB_SHA to $ZED_KUBE_NAMESPACE" |
| 126 | | − |
| 127 | | − source script/lib/deploy-helpers.sh |
| 128 | | − export_vars_for_environment $ZED_KUBE_NAMESPACE |
| 129 | | − |
| 130 | | − ZED_DO_CERTIFICATE_ID="$(doctl compute certificate list --format ID --no-header)" |
| 131 | | − export ZED_DO_CERTIFICATE_ID |
| 132 | | − export ZED_IMAGE_ID="registry.digitalocean.com/zed/collab:${GITHUB_SHA}" |
| 133 | | − |
| 134 | | − export ZED_SERVICE_NAME=collab |
| 135 | | − export ZED_LOAD_BALANCER_SIZE_UNIT=$ZED_COLLAB_LOAD_BALANCER_SIZE_UNIT |
| 136 | | − export DATABASE_MAX_CONNECTIONS=850 |
| 137 | | − envsubst < crates/collab/k8s/collab.template.yml | kubectl apply -f - |
| 138 | | − kubectl -n "$ZED_KUBE_NAMESPACE" rollout status deployment/$ZED_SERVICE_NAME --watch |
| 139 | | − echo "deployed ${ZED_SERVICE_NAME} to ${ZED_KUBE_NAMESPACE}" |
| 140 | | − |
| 141 | | − export ZED_SERVICE_NAME=api |
| 142 | | − export ZED_LOAD_BALANCER_SIZE_UNIT=$ZED_API_LOAD_BALANCER_SIZE_UNIT |
| 143 | | − export DATABASE_MAX_CONNECTIONS=60 |
| 144 | | − envsubst < crates/collab/k8s/collab.template.yml | kubectl apply -f - |
| 145 | | − kubectl -n "$ZED_KUBE_NAMESPACE" rollout status deployment/$ZED_SERVICE_NAME --watch |
| 146 | | − echo "deployed ${ZED_SERVICE_NAME} to ${ZED_KUBE_NAMESPACE}" |
| 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}" |
| 150 | +defaults: |
| 151 | + run: |
| 152 | + shell: bash -euxo pipefail {0} |