mirror of
https://github.com/zed-industries/zed.git
synced 2024-12-24 17:28:40 +00:00
Publish collab docker images on CI, deploy pre-built images
This commit is contained in:
parent
efa6745035
commit
9952f08cce
3 changed files with 79 additions and 22 deletions
46
.github/workflows/publish_collab_image.yml
vendored
Normal file
46
.github/workflows/publish_collab_image.yml
vendored
Normal file
|
@ -0,0 +1,46 @@
|
|||
name: Publish Collab Server Image
|
||||
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- collab-v*
|
||||
|
||||
env:
|
||||
DOCKER_BUILDKIT: 1
|
||||
DIGITALOCEAN_ACCESS_TOKEN: ${{ secrets.DIGITALOCEAN_ACCESS_TOKEN }}
|
||||
|
||||
jobs:
|
||||
publish:
|
||||
name: Publish collab server image
|
||||
runs-on:
|
||||
- self-hosted
|
||||
- deploy
|
||||
steps:
|
||||
- name: Add Rust to the PATH
|
||||
run: echo "$HOME/.cargo/bin" >> $GITHUB_PATH
|
||||
|
||||
- name: Sign into DigitalOcean docker registry
|
||||
run: doctl registry login
|
||||
|
||||
- name: Checkout repo
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
clean: false
|
||||
|
||||
- name: Check that tag version matches package version
|
||||
run: |
|
||||
set -eu
|
||||
package_version=$(cargo metadata --no-deps --format-version=1 | jq --raw-output '.packages[] | select(.name == "collab") | .version')
|
||||
tag_version=$(echo $GITHUB_REF_NAME | sed -e 's/collab-v//')
|
||||
if [[ $tag_version != $package_version ]]; then
|
||||
echo "collab package version $package_version does not match git tag version $tag_version"
|
||||
exit 1
|
||||
fi
|
||||
echo "Publishing image version: $package_version"
|
||||
echo "COLLAB_VERSION=$package_version" >> $GITHUB_ENV
|
||||
|
||||
- name: Build docker image
|
||||
run: docker build . --tag registry.digitalocean.com/zed/collab:v${COLLAB_VERSION}
|
||||
|
||||
- name: Publish docker image
|
||||
run: docker push registry.digitalocean.com/zed/collab:v${COLLAB_VERSION}
|
|
@ -9,7 +9,7 @@ mod db_tests;
|
|||
#[cfg(test)]
|
||||
mod integration_tests;
|
||||
|
||||
use axum::{body::Body, Router};
|
||||
use axum::{routing::get, Router};
|
||||
use collab::{Error, Result};
|
||||
use db::{Db, PostgresDb};
|
||||
use serde::Deserialize;
|
||||
|
@ -22,6 +22,8 @@ use tracing_log::LogTracer;
|
|||
use tracing_subscriber::{filter::EnvFilter, fmt::format::JsonFields, Layer};
|
||||
use util::ResultExt;
|
||||
|
||||
const VERSION: &'static str = env!("CARGO_PKG_VERSION");
|
||||
|
||||
#[derive(Default, Deserialize)]
|
||||
pub struct Config {
|
||||
pub http_port: u16,
|
||||
|
@ -67,9 +69,9 @@ async fn main() -> Result<()> {
|
|||
|
||||
rpc_server.start_recording_project_activity(Duration::from_secs(5 * 60), rpc::RealExecutor);
|
||||
|
||||
let app = Router::<Body>::new()
|
||||
.merge(api::routes(&rpc_server, state.clone()))
|
||||
.merge(rpc::routes(rpc_server));
|
||||
let app = api::routes(&rpc_server, state.clone())
|
||||
.merge(rpc::routes(rpc_server))
|
||||
.merge(Router::new().route("/", get(handle_root)));
|
||||
|
||||
axum::Server::from_tcp(listener)?
|
||||
.serve(app.into_make_service_with_connect_info::<SocketAddr>())
|
||||
|
@ -78,6 +80,10 @@ async fn main() -> Result<()> {
|
|||
Ok(())
|
||||
}
|
||||
|
||||
async fn handle_root() -> String {
|
||||
format!("collab v{VERSION}")
|
||||
}
|
||||
|
||||
pub fn init_tracing(config: &Config) -> Option<()> {
|
||||
use std::str::FromStr;
|
||||
use tracing_subscriber::layer::SubscriberExt;
|
||||
|
|
|
@ -2,36 +2,41 @@
|
|||
|
||||
# Prerequisites:
|
||||
#
|
||||
# - Log in to the DigitalOcean docker registry
|
||||
# doctl registry login
|
||||
#
|
||||
# - Target the `zed-1` kubernetes cluster
|
||||
# doctl kubernetes cluster kubeconfig save zed-1
|
||||
# - Log in to the DigitalOcean API, either interactively, by running
|
||||
# `doctl auth init`, or by setting the `DIGITALOCEAN_ACCESS_TOKEN`
|
||||
# environment variable.
|
||||
|
||||
set -eu
|
||||
|
||||
if [[ $# < 1 ]]; then
|
||||
echo "Usage: $0 [production|staging|...]"
|
||||
if [[ $# < 2 ]]; then
|
||||
echo "Usage: $0 <production|staging|preview> <tag-name>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
export ZED_KUBE_NAMESPACE=$1
|
||||
COLLAB_VERSION=$2
|
||||
|
||||
ENV_FILE="crates/collab/k8s/environments/${ZED_KUBE_NAMESPACE}.sh"
|
||||
if [[ ! -f $ENV_FILE ]]; then
|
||||
echo "Invalid environment name '${ZED_KUBE_NAMESPACE}'"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ $ZED_KUBE_NAMESPACE == "production" && -n $(git status --short) ]]; then
|
||||
echo "Cannot deploy uncommited changes to production"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
git_sha=$(git rev-parse HEAD)
|
||||
export ZED_IMAGE_ID="registry.digitalocean.com/zed/collab:${ZED_KUBE_NAMESPACE}-${git_sha}"
|
||||
export $(cat $ENV_FILE)
|
||||
|
||||
docker build . --tag "$ZED_IMAGE_ID"
|
||||
docker push "$ZED_IMAGE_ID"
|
||||
if [[ ! $COLLAB_VERSION =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
|
||||
echo "Invalid version number '$COLLAB_VERSION'"
|
||||
exit 1
|
||||
fi
|
||||
TAG_NAMES=$(doctl registry repository list-tags collab --no-header --format Tag)
|
||||
if ! $(echo "${TAG_NAMES}" | grep -Fqx v${COLLAB_VERSION}); then
|
||||
echo "No such image tag: 'zed/collab:v${COLLAB_VERSION}'"
|
||||
echo "Found tags"
|
||||
echo "${TAG_NAMES}"
|
||||
exit 1
|
||||
fi
|
||||
export ZED_IMAGE_ID="registry.digitalocean.com/zed/collab:v${COLLAB_VERSION}"
|
||||
|
||||
if [[ $(kubectl config current-context 2> /dev/null) != do-nyc1-zed-1 ]]; then
|
||||
doctl kubernetes cluster kubeconfig save zed-1
|
||||
fi
|
||||
|
||||
envsubst < crates/collab/k8s/manifest.template.yml | kubectl apply -f -
|
||||
|
|
Loading…
Reference in a new issue