aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulien Dessaux2022-10-19 23:20:56 +0200
committerJulien Dessaux2022-10-20 00:10:18 +0200
commit28424a589d111ae62810eb22e142f01c89586ed8 (patch)
tree465bc471ef32f424562723f5d197eb23d7ef5991
parentAdded makefile (diff)
downloadgrenade-brothers-28424a589d111ae62810eb22e142f01c89586ed8.tar.gz
grenade-brothers-28424a589d111ae62810eb22e142f01c89586ed8.tar.bz2
grenade-brothers-28424a589d111ae62810eb22e142f01c89586ed8.zip
Added build with buildah and deploy to kubernetes
-rw-r--r--.gitignore1
-rw-r--r--GNUmakefile22
-rwxr-xr-xdeploy/build-image.sh45
-rw-r--r--deploy/kubernetes.yaml84
4 files changed, 148 insertions, 4 deletions
diff --git a/.gitignore b/.gitignore
index 6380ab0..8aa18a8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,4 @@
kcov-output/
+node_modules/
zig-cache
zig-out
diff --git a/GNUmakefile b/GNUmakefile
index aa000bc..e749412 100644
--- a/GNUmakefile
+++ b/GNUmakefile
@@ -1,20 +1,34 @@
SHELL:=bash
+REVISION=$(shell git rev-parse HEAD)
.PHONY: build
-build: ## make build # Builds a cartridge
- zig build
+build: ## make build # Builds a cartridge
+ zig build -Drelease-small=true
+
+.PHONY: buildah
+buildah: ## make buildah # Builds the container image
+ deploy/build-image.sh
+
+.PHONY: deploy
+deploy: ## make deploy # deploy the cartridge the active kubernetes context
+ sed -i deploy/kubernetes.yaml -e 's/^\(\s*image:[^:]*:\).*$$/\1$(REVISION)/'
+ kubectl apply -f deploy/kubernetes.yaml
.PHONY: help
help:
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}'
.PHONY: init
-init: ## make init # initialize project dependencies
+init: ## make init # initialize project dependencies
npm install wasm4
rm package.json package-lock.json # w4 will think it is an AssemblyScript game if we leave these files
+.PHONY: push
+push: ## make push # push the built image to quay.io
+ buildah push adyxax/grenade-brothers quay.io/adyxax/grenade-brothers:$(REVISION)
+
.PHONY: serve
-serve: ## make serve # run a nodejs web server
+serve: ## make serve # run a nodejs web server
node_modules/.bin/w4 watch --no-open --no-qr
.DEFAULT_GOAL := help
diff --git a/deploy/build-image.sh b/deploy/build-image.sh
new file mode 100755
index 0000000..8f61282
--- /dev/null
+++ b/deploy/build-image.sh
@@ -0,0 +1,45 @@
+#!/usr/bin/env bash
+set -euo pipefail
+
+zig build -Drelease-small=true
+
+ret=0; buildah images adyxax/alpine &>/dev/null || ret=$?
+if [[ "${ret}" != 0 ]]; then
+ buildah rmi --all
+ ALPINE_LATEST=$(curl --silent https://dl-cdn.alpinelinux.org/alpine/latest-stable/releases/x86_64/ |
+ perl -lane '$latest = $1 if $_ =~ /^<a href="(alpine-minirootfs-\d+\.\d+\.\d+-x86_64\.tar\.gz)">/; END {print $latest}'
+ )
+ if [ ! -e "./${ALPINE_LATEST}" ]; then
+ echo "Fetching ${ALPINE_LATEST}..."
+ curl --silent "https://dl-cdn.alpinelinux.org/alpine/latest-stable/releases/x86_64/${ALPINE_LATEST}" \
+ --output "./${ALPINE_LATEST}"
+ fi
+
+ ctr=$(buildah from scratch)
+ buildah add "${ctr}" "${ALPINE_LATEST}" /
+ buildah run "${ctr}" /bin/sh -c 'apk upgrade --no-cache'
+ buildah run "${ctr}" /bin/sh -c 'apk add --no-cache pcre sqlite-libs'
+ buildah commit "${ctr}" adyxax/alpine
+ buildah rm "${ctr}"
+fi
+
+ret=0; buildah images adyxax/wasm4 &>/dev/null || ret=$?
+if [[ "${ret}" != 0 ]]; then
+ wasm4=$(buildah from adyxax/alpine)
+ buildah run "${wasm4}" /bin/sh -c 'apk add --no-cache nodejs-current npm'
+ buildah run "${wasm4}" /bin/sh -c 'npm install -g wasm4'
+ buildah commit "${wasm4}" adyxax/wasm4
+else
+ wasm4=$(buildah from adyxax/wasm4)
+fi
+
+buildah copy "${wasm4}" zig-out/lib/cart.wasm /
+
+buildah config \
+ --author 'Julien Dessaux' \
+ --cmd "w4 run --port 80 --no-open --no-qr /cart.wasm" \
+ --port 80 \
+ "${wasm4}"
+
+buildah commit "${wasm4}" adyxax/grenade-brothers
+buildah rm "${wasm4}"
diff --git a/deploy/kubernetes.yaml b/deploy/kubernetes.yaml
new file mode 100644
index 0000000..28ebd80
--- /dev/null
+++ b/deploy/kubernetes.yaml
@@ -0,0 +1,84 @@
+apiVersion: v1
+kind: Namespace
+metadata:
+ name: grenade-brothers
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ namespace: grenade-brothers
+ name: grenade-brothers
+ labels:
+ app: grenade-brothers
+spec:
+ replicas: 1
+ strategy:
+ rollingUpdate:
+ maxSurge: 1
+ maxUnavailable: 0
+ type: RollingUpdate
+ selector:
+ matchLabels:
+ app: grenade-brothers
+ template:
+ metadata:
+ labels:
+ app: grenade-brothers
+ spec:
+ containers:
+ - name: grenade-brothers
+ image: quay.io/adyxax/grenade-brothers:08da31f2e79f87a93281afe8f13eaa700d57708a
+ ports:
+ - containerPort: 80
+ readinessProbe:
+ httpGet:
+ path: '/'
+ port: 80
+ initialDelaySeconds: 1
+ timeoutSeconds: 1
+ livenessProbe:
+ httpGet:
+ path: '/'
+ port: 80
+ initialDelaySeconds: 1
+ timeoutSeconds: 1
+ lifecycle:
+ preStop:
+ exec:
+ command: ["/bin/sh", "-c", "sleep 10"]
+---
+apiVersion: v1
+kind: Service
+metadata:
+ namespace: grenade-brothers
+ name: grenade-brothers
+spec:
+ type: ClusterIP
+ selector:
+ app: grenade-brothers
+ ports:
+ - protocol: TCP
+ port: 80
+ targetPort: 80
+ name: grenade-brothers
+---
+apiVersion: networking.k8s.io/v1
+kind: Ingress
+metadata:
+ namespace: grenade-brothers
+ name: grenade-brothers
+spec:
+ ingressClassName: nginx
+ tls:
+ - secretName: wildcard-adyxax-org
+ rules:
+ - host: grenade-brothers.adyxax.org
+ http:
+ paths:
+ - path: '/'
+ pathType: Prefix
+ backend:
+ service:
+ name: grenade-brothers
+ port:
+ number: 80