From 211d89cae0d9f729b4c9e00ce11ccf54348d026f Mon Sep 17 00:00:00 2001 From: Anthony LC Date: Mon, 3 Jun 2024 10:05:45 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=A8(CI)=20add=20Tilt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Tilt is a tool for local Kubernetes development. It makes it easy to see your changes as you make them, and it rebuilds and redeploys your app as you change it. --- Dockerfile | 8 +- Makefile | 9 ++ bin/Tiltfile | 71 ++++++++++++++ bin/start-kind.sh | 102 +++++++++++++++++++++ src/helm/env.d/dev/values.desk.yaml.gotmpl | 16 ++++ src/helm/helmfile.yaml | 1 + 6 files changed, 204 insertions(+), 3 deletions(-) create mode 100644 bin/Tiltfile create mode 100644 bin/start-kind.sh diff --git a/Dockerfile b/Dockerfile index 10e3fab..22c02ed 100644 --- a/Dockerfile +++ b/Dockerfile @@ -24,8 +24,8 @@ COPY ./src/frontend/packages/eslint-config-people/package.json ./packages/eslint RUN yarn --frozen-lockfile -### ---- Front-end builder image ---- -FROM node:20 as frontend-builder +### ---- Front-end builder dev image ---- +FROM node:20 as frontend-builder-dev WORKDIR /builder @@ -34,8 +34,10 @@ COPY ./src/frontend . WORKDIR ./apps/desk -RUN yarn build +### ---- Front-end builder image ---- +FROM frontend-builder-dev as frontend-builder +RUN yarn build # ---- Front-end image ---- FROM nginxinc/nginx-unprivileged:1.25 as frontend-production diff --git a/Makefile b/Makefile index 0903578..3ce4ea2 100644 --- a/Makefile +++ b/Makefile @@ -323,3 +323,12 @@ frontend-i18n-generate: \ frontend-i18n-compile: ## Format the crowin json files used deploy to the apps cd $(PATH_FRONT) && yarn i18n:deploy .PHONY: frontend-i18n-compile + +# -- K8S +start-kind: ## Create the kubernetes cluster + ./bin/start-kind.sh +.PHONY: start-kind + +tilt-up: ## start tilt - k8s local development + tilt up -f ./bin/Tiltfile +.PHONY: tilt-up diff --git a/bin/Tiltfile b/bin/Tiltfile new file mode 100644 index 0000000..a3beba2 --- /dev/null +++ b/bin/Tiltfile @@ -0,0 +1,71 @@ +load('ext://uibutton', 'cmd_button', 'bool_input', 'location') +load('ext://namespace', 'namespace_create', 'namespace_inject') +namespace_create('desk') + +docker_build( + 'localhost:5001/people-backend:latest', + context='..', + dockerfile='../Dockerfile', + only=['./src/backend', './src/mail', './docker'], + target = 'backend-production', + live_update=[ + sync('../src/backend', '/app'), + run( + 'pip install -r /app/requirements.txt', + trigger=['./api/requirements.txt'] + ) + ] +) + +docker_build( + 'localhost:5001/people-frontend:latest', + context='..', + dockerfile='../Dockerfile', + build_args={'ENV': 'dev'}, + only=['./src/frontend', './src/mail', './docker'], + target = 'frontend-builder-dev', + live_update=[ + sync('../src/frontend', '/builder'), + ] +) + +k8s_yaml(local('cd ../src/helm && helmfile -n desk -e dev template .')) + +migration = ''' +set -eu +# get k8s pod name from tilt resource name +POD_NAME="$(tilt get kubernetesdiscovery desk-backend -ojsonpath='{.status.pods[0].name}')" +kubectl -n desk exec "$POD_NAME" -- python manage.py makemigrations +''' +cmd_button('Make migration', + argv=['sh', '-c', migration], + resource='desk-backend', + icon_name='developer_board', + text='Run makemigration', +) + +pod_migrate = ''' +set -eu +# get k8s pod name from tilt resource name +POD_NAME="$(tilt get kubernetesdiscovery desk-backend -ojsonpath='{.status.pods[0].name}')" +kubectl -n desk exec "$POD_NAME" -- python manage.py migrate --no-input +''' +cmd_button('Migrate db', + argv=['sh', '-c', pod_migrate], + resource='desk-backend', + icon_name='developer_board', + text='Run database migration', +) + +pod_add_admin = ''' +set -eu +# get k8s pod name from tilt resource name +POD_NAME="$(tilt get kubernetesdiscovery desk-backend -ojsonpath='{.status.pods[0].name}')" +kubectl -n desk exec "$POD_NAME" -- python manage.py createsuperuser --password admin --admin_email admin@example.com +''' +cmd_button('Add admin', + argv=['sh', '-c', pod_add_admin], + resource='desk-backend', + icon_name='developer_board', + text='Create superadmin', +) diff --git a/bin/start-kind.sh b/bin/start-kind.sh new file mode 100644 index 0000000..9ff239c --- /dev/null +++ b/bin/start-kind.sh @@ -0,0 +1,102 @@ +#!/bin/sh +set -o errexit + +CURRENT_DIR=$(pwd) + +# 0. Create ca +echo "0. Create ca" +mkcert -install +cd /tmp +mkcert "127.0.0.1.nip.io" "*.127.0.0.1.nip.io" +cd $CURRENT_DIR + +# 1. Create registry container unless it already exists +echo "1. Create registry container unless it already exists" +reg_name='kind-registry' +reg_port='5001' +if [ "$(docker inspect -f '{{.State.Running}}' "${reg_name}" 2>/dev/null || true)" != 'true' ]; then + docker run \ + -d --restart=always -p "127.0.0.1:${reg_port}:5000" --network bridge --name "${reg_name}" \ + registry:2 +fi + +# 2. Create kind cluster with containerd registry config dir enabled +echo "2. Create kind cluster with containerd registry config dir enabled" +# TODO: kind will eventually enable this by default and this patch will +# be unnecessary. +# +# See: +# https://github.com/kubernetes-sigs/kind/issues/2875 +# https://github.com/containerd/containerd/blob/main/docs/cri/config.md#registry-configuration +# See: https://github.com/containerd/containerd/blob/main/docs/hosts.md +cat <