summaryrefslogtreecommitdiff
path: root/ci
diff options
context:
space:
mode:
authorckonstanski <carlos.konstanski@olo.com>2025-11-16 11:16:00 -0700
committerckonstanski <carlos.konstanski@olo.com>2025-11-16 11:16:00 -0700
commit313fb607c03082750fbde9135cadf4a35db9d5b4 (patch)
tree7299ff89c1e24568f401296b13d213ed1f0d98fb /ci
parent4f709f16c98624cae548d2516749bf7c6da903e8 (diff)
move CI to docker-compose
Diffstat (limited to 'ci')
-rw-r--r--ci/.gitignore2
-rw-r--r--ci/Dockerfile13
-rw-r--r--ci/data/bogenherr-starter.lisp7
-rw-r--r--ci/data/etc/bogenherr/figwheel-main.edn34
-rw-r--r--ci/data/etc/bogenherr/options.lisp15
-rw-r--r--ci/data/etc/sbclrc6
-rwxr-xr-xci/data/install-root.sh30
-rwxr-xr-xci/data/install-user-sbcl.sh10
-rwxr-xr-xci/data/start_app.sh49
-rwxr-xr-xci/docker-build.sh26
-rw-r--r--ci/docker-compose.yaml.example71
-rwxr-xr-xci/docker-run.sh7
-rw-r--r--ci/env.sh4
13 files changed, 274 insertions, 0 deletions
diff --git a/ci/.gitignore b/ci/.gitignore
new file mode 100644
index 0000000..416ae59
--- /dev/null
+++ b/ci/.gitignore
@@ -0,0 +1,2 @@
+tmp
+docker-compose.yaml
diff --git a/ci/Dockerfile b/ci/Dockerfile
new file mode 100644
index 0000000..18a0dab
--- /dev/null
+++ b/ci/Dockerfile
@@ -0,0 +1,13 @@
+FROM ubuntu:noble
+MAINTAINER Carlos Konstanski
+ADD tmp/docker-start.tar.xz /
+ARG OLO_USERNAME=root
+ARG OLO_GROUPNAME=root
+ARG OLO_UID=0
+ARG OLO_GID=0
+RUN data/install-root.sh
+USER ${OLO_UID}:${OLO_GID}
+RUN data/install-user-sbcl.sh
+ENTRYPOINT [ "data/start_app.sh" ]
+#ENTRYPOINT [ "/bin/bash", "-l", "-c" ]
+CMD []
diff --git a/ci/data/bogenherr-starter.lisp b/ci/data/bogenherr-starter.lisp
new file mode 100644
index 0000000..1b95947
--- /dev/null
+++ b/ci/data/bogenherr-starter.lisp
@@ -0,0 +1,7 @@
+(load "/etc/sbclrc")
+(asdf:operate 'asdf:load-op 'swank)
+(setf swank::*loopback-interface* "0.0.0.0")
+(swank:create-server :port 4110 :dont-close t)
+(asdf:operate 'asdf:load-op 'bogenherr)
+(in-package :bogenherr)
+(bogenherr)
diff --git a/ci/data/etc/bogenherr/figwheel-main.edn b/ci/data/etc/bogenherr/figwheel-main.edn
new file mode 100644
index 0000000..864266c
--- /dev/null
+++ b/ci/data/etc/bogenherr/figwheel-main.edn
@@ -0,0 +1,34 @@
+;; Figwheel-main configuration options see: https://figwheel.org/config-options
+;; these will be overriden by the metadata config options in dev.cljs.edn build file
+{
+ ;; Set the server port https://figwheel.org/config-options#ring-server-options
+ ;; :ring-server-options {:port 9500}
+
+ ;; Change the target directory from the "target" to "resources"
+ ;; https://figwheel.org/config-options#target-dir
+ ;; :target-dir "resources"
+
+ ;; Server Ring Handler (optional) https://figwheel.org/docs/ring-handler.html
+ ;; If you want to embed a ring handler into the figwheel server, this
+ ;; is for simple ring servers
+ ;; :ring-handler hello_world.server/handler
+
+ ;; To be able to open files in your editor from the heads up display
+ ;; you will need to put a script on your path. This script will have
+ ;; to take a file path and a line number ie.
+ ;; in ~/bin/myfile-opener:
+ ;;
+ ;; #! /bin/sh
+ ;; emacsclient -n +$2:$3 $1
+ ;;
+ ;; :open-file-command "myfile-opener"
+
+ ;; if you are using emacsclient you can just use
+ ;; :open-file-command "emacsclient"
+
+ ;; Logging output gets printed to the REPL, if you want to redirect it to a file:
+ ;; :log-file "figwheel-main.log"
+
+ :target-dir "resources"
+ :open-url false
+}
diff --git a/ci/data/etc/bogenherr/options.lisp b/ci/data/etc/bogenherr/options.lisp
new file mode 100644
index 0000000..25f2ec2
--- /dev/null
+++ b/ci/data/etc/bogenherr/options.lisp
@@ -0,0 +1,15 @@
+(:name "bogenherr"
+ :scheme "http"
+ :url "www.bogenherr.org"
+ :document-root "bogenherr"
+ :title "Bogenherr Violin and Viola Lessons"
+ :meta-description "Bogenherr Violin and Viola Lessons written in Common Lisp/Hunchentoot and ClojureScript."
+ :databases (:db-bogenherr ("bogenherr" "bogenherr" "neweboy" "127.0.0.1"))
+ :mail-mx "mail.bogenherr.org"
+ :mail-from "postmaster@bogenherr.org"
+ :mail-postmaster "postmaster@bogenherr.org"
+ :mail-webmaster "webmaster@bogenherr.org"
+ :mail-info "postmaster@bogenherr.org"
+ :mail-login-notify "postmaster@bogenherr.org"
+ :mail-authentication (:login "me@ckons.org" "ayluvmiym")
+ :mail-ssl :starttls)
diff --git a/ci/data/etc/sbclrc b/ci/data/etc/sbclrc
new file mode 100644
index 0000000..3a931d0
--- /dev/null
+++ b/ci/data/etc/sbclrc
@@ -0,0 +1,6 @@
+;;; The following lines added by ql:add-to-init-file:
+#-quicklisp
+(let ((quicklisp-init (merge-pathnames "quicklisp/setup.lisp"
+ (user-homedir-pathname))))
+ (when (probe-file quicklisp-init)
+ (load quicklisp-init)))
diff --git a/ci/data/install-root.sh b/ci/data/install-root.sh
new file mode 100755
index 0000000..be226f0
--- /dev/null
+++ b/ci/data/install-root.sh
@@ -0,0 +1,30 @@
+#!/bin/bash
+
+echo 'APT::Acquire::Retries "3";' > /etc/apt/apt.conf.d/80-retries
+export DEBIAN_FRONTEND=noninteractive
+apt-get update
+apt-get -y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" dist-upgrade
+apt-get -y install -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" aptitude
+aptitude -y install -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" apt-transport-https ca-certificates software-properties-common language-pack-de
+update-ca-certificates
+aptitude update
+aptitude -y install -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" sbcl sbcl-source leiningen dnsutils bind9-host vim curl wget rlwrap pass rsync sudo jq lsof zip unzip
+
+rsync -av /data/ /
+
+if (( OLO_UID != 0 )); then
+ userdel ubuntu || true
+ groupdel ubuntu || true
+ rm -rf /home/ubuntu || true
+ export HOMEDIR="/home/${OLO_USERNAME}"
+ groupadd -g "${OLO_GID}" "${OLO_GROUPNAME}" || OLO_GROUPNAME=$(grep -F "x:${OLO_GID}:" /etc/group | awk -F: '{print $1}')
+ useradd -s /bin/bash -m -u "${OLO_UID}" -g "${OLO_GROUPNAME}" "${OLO_USERNAME}" || OLO_USERNAME=$(grep -F "x:${OLO_UID}:" /etc/passwd | awk -F: '{print $1}')
+ SUDOERS_FILENAME="${OLO_USERNAME//\./_}"
+ echo "${OLO_USERNAME} ALL=(ALL) NOPASSWD: ALL" > "/etc/sudoers.d/${SUDOERS_FILENAME}"
+ chmod 0440 "/etc/sudoers.d/${SUDOERS_FILENAME}"
+ mkdir -p "${HOMEDIR}/.gnupg"
+ chown "${OLO_USERNAME}":"${OLO_GROUPNAME}" "${HOMEDIR}/.gnupg"
+ chmod 0700 "${HOMEDIR}/.gnupg"
+fi
+
+exit 0
diff --git a/ci/data/install-user-sbcl.sh b/ci/data/install-user-sbcl.sh
new file mode 100755
index 0000000..e9d03ff
--- /dev/null
+++ b/ci/data/install-user-sbcl.sh
@@ -0,0 +1,10 @@
+#!/bin/bash
+
+curl -o ~/quicklisp.lisp https://beta.quicklisp.org/quicklisp.lisp
+sbcl --load ~/quicklisp.lisp --eval "(quicklisp-quickstart:install)" --eval "(sb-ext:exit)"
+sbcl --eval "(loop for pkg in '(cl-ppcre cl-smtp hunchentoot cl-log ironclad cl-markdown tmpdir swank net-telent-date uffi drakma cl-json postmodern fiveam local-time trivial-octet-streams cl-ppcre) do (ql:quickload (symbol-name pkg)))" --eval "(sb-ext:exit)"
+
+mkdir -p ~/.config/common-lisp
+echo "(:source-registry (:tree (:home \"common-lisp/systems\")) :inherit-configuration)" | tee ~/.config/common-lisp/source-registry.conf
+
+exit 0
diff --git a/ci/data/start_app.sh b/ci/data/start_app.sh
new file mode 100755
index 0000000..e357751
--- /dev/null
+++ b/ci/data/start_app.sh
@@ -0,0 +1,49 @@
+#!/bin/bash
+
+mkdir -p ~/common-lisp/systems ~/opt
+cd ~/opt
+git clone -b master git@ns:repos/bogenherr.git
+git clone -b master git@github.com:ckonstanski/org-ckons-cljs.form.git
+git clone -b master git@github.com:ckonstanski/org-ckons-cljs.notifications
+git clone -b master git@github.com:ckonstanski/org-ckons-condition
+git clone -b master git@github.com:ckonstanski/org-ckons-core
+git clone -b master git@github.com:ckonstanski/org-ckons-file
+git clone -b master git@github.com:ckonstanski/org-ckons-http
+git clone -b master git@github.com:ckonstanski/org-ckons-json
+git clone -b master git@github.com:ckonstanski/org-ckons-serializable
+git clone -b master git@github.com:ckonstanski/org-ckons-session
+git clone -b master git@github.com:ckonstanski/org-ckons-sql
+
+logdir="/var/log/lisp"
+mv ${logdir}/bogenherr.log.1 ${logdir}/bogenherr.log.2
+mv ${logdir}/${APPNAME}bogenherr.log ${logdir}/bogenherr.log.1
+
+pushd ~/common-lisp/systems
+ln -s ~/opt/bogenherr/lisp/bogenherr.asd bogenherr.asd
+ln -s ~/opt/org-ckons-condition/org-ckons-condition.asd org-ckons-condition.asd
+ln -s ~/opt/org-ckons-core/org-ckons-core.asd org-ckons-core.asd
+ln -s ~/opt/org-ckons-file/org-ckons-file.asd org-ckons-file.asd
+ln -s ~/opt/org-ckons-http/org-ckons-http.asd org-ckons-http.asd
+ln -s ~/opt/org-ckons-json/org-ckons-json.asd org-ckons-json.asd
+ln -s ~/opt/org-ckons-serializable/org-ckons-serializable.asd org-ckons-serializable.asd
+ln -s ~/opt/org-ckons-session/org-ckons-session.asd org-ckons-session.asd
+ln -s ~/opt/org-ckons-sql/org-ckons-sql.asd org-ckons-sql.asd
+popd
+
+pushd ~/opt/bogenherr/lisp/webapps/bogenherr/conf
+ln -s /etc/bogenherr/options.lisp options.lisp
+popd
+
+pushd ~/opt/bogenherr/lisp/webapps/bogenherr/clojurescript/bogenherr
+ln -s /etc/bogenherr/figwheel-main.edn figwheel-main.edn
+mkdir checkouts
+pushd checkouts
+ln -s ~/opt/org-ckons-cljs.form org-ckons-cljs.form
+ln -s ~/opt/org-ckons-cljs.notifications org-ckons-cljs.notifications
+popd
+
+lein clean
+lein fig:build | tee /tmp/bogenherr/lein.log &
+popd
+
+SBCL_HOME=/usr/lib/sbcl SBCL_SOURCE_ROOT=/usr/lib/sbcl/src exec sbcl --dynamic-space-size 2048 --userinit /data/bogenherr-starter.lisp | tee /tmp/bogenherr/sbcl.log
diff --git a/ci/docker-build.sh b/ci/docker-build.sh
new file mode 100755
index 0000000..64d7a4d
--- /dev/null
+++ b/ci/docker-build.sh
@@ -0,0 +1,26 @@
+#!/bin/bash -e
+
+. env.sh
+
+builddir='tmp'
+container='bogenherr'
+
+rm -rf ${builddir}
+mkdir ${builddir}
+rsync -aq data ${builddir}
+pushd ${builddir} 2>/dev/null
+
+tar Jcvf docker-start.tar.xz data/
+docker stop ${container} || true
+docker container prune -f
+docker rmi --force ${container}
+
+DOCKER_BUILDKIT=0 docker compose --ansi "never" build \
+ --no-cache \
+ --pull \
+ --progress "plain"
+
+popd 2>/dev/null
+rm -rf tmp
+
+exit 0
diff --git a/ci/docker-compose.yaml.example b/ci/docker-compose.yaml.example
new file mode 100644
index 0000000..df0c581
--- /dev/null
+++ b/ci/docker-compose.yaml.example
@@ -0,0 +1,71 @@
+services:
+ bogenherr:
+ image: bogenherr:v0.1
+ tty: true
+ build:
+ context: .
+ args:
+ OLO_USERNAME: ${OLO_USERNAME}
+ OLO_GROUPNAME: ${OLO_GROUPNAME}
+ OLO_UID: ${OLO_UID}
+ OLO_GID: ${OLO_GID}
+ network_mode: "host"
+ container_name: bogenherr
+ volumes:
+ # - type: bind
+ # source: /tmp/bogenherr
+ # target: /tmp/bogenherr
+ - type: bind
+ source: ${OLO_PROJECT_HOME}
+ target: ${OLO_PROJECT_HOME}
+ - type: bind
+ source: ~/.m2
+ target: /home/${OLO_USERNAME}/.m2
+ - type: bind
+ source: ~/.bashrc
+ target: /home/${OLO_USERNAME}/.bashrc
+ - type: bind
+ source: ~/.bash_history
+ target: /home/${OLO_USERNAME}/.bash_history
+ - type: bind
+ source: ~/.vimrc
+ target: /home/${OLO_USERNAME}/.vimrc
+ - type: bind
+ source: ~/.emacs.d
+ target: /home/${OLO_USERNAME}/.emacs.d
+ - type: bind
+ source: ~/.gitconfig
+ target: /home/${OLO_USERNAME}/.gitconfig
+ - type: bind
+ source: ~/.ssh
+ target: /home/${OLO_USERNAME}/.ssh
+ - type: bind
+ source: ~/.password-store
+ target: /home/${OLO_USERNAME}/.password-store
+ - type: bind
+ source: ~/.gnupg
+ target: /home/${OLO_USERNAME}/.gnupg
+ - type: bind
+ source: /run/user/${OLO_UID}
+ target: /run/user/${OLO_UID}
+ - type: bind
+ source: /run/user/${OLO_UID}/gnupg/S.gpg-agent
+ target: /home/${OLO_USERNAME}/.gnupg/S.gpg-agent
+ - type: bind
+ source: /etc/hosts
+ target: /etc/hosts
+ - type: bind
+ source: /etc/ssh
+ target: /etc/ssh
+ - type: bind
+ source: /var/log/lisp
+ target: /var/log/lisp
+ environment:
+ - TERM=xterm-256color
+ - AWS_SDK_LOAD_CONFIG=1
+ - https_proxy=${https_proxy}
+ - http_proxy=${http_proxy}
+ - no_proxy=${no_proxy}
+ - GITHUB_TOKEN=${GITHUB_TOKEN}
+ - GPG_AGENT_INFO=/home/${OLO_USERNAME}/.gnupg/S.gpg-agent:0:1
+ command: [ "/bin/bash -l -c" ]
diff --git a/ci/docker-run.sh b/ci/docker-run.sh
new file mode 100755
index 0000000..c368224
--- /dev/null
+++ b/ci/docker-run.sh
@@ -0,0 +1,7 @@
+#!/bin/bash -e
+
+. env.sh
+
+docker compose --ansi "never" up -d
+
+exit 0
diff --git a/ci/env.sh b/ci/env.sh
new file mode 100644
index 0000000..a49fb54
--- /dev/null
+++ b/ci/env.sh
@@ -0,0 +1,4 @@
+export OLO_USERNAME=$(id -un)
+export OLO_GROUPNAME=$(id -gn)
+export OLO_UID=$(id -u)
+export OLO_GID=$(id -g)