116 lines
3.8 KiB
Bash
Executable File
116 lines
3.8 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
IMAGE_REPO="${IMAGE_REPO:-localhost/kubeviz}"
|
|
IMAGE_TAG="${IMAGE_TAG:-prod}"
|
|
SERVICE_NAME="${SERVICE_NAME:-kubeviz.service}"
|
|
SYSTEMD_SCOPE="${SYSTEMD_SCOPE:-user}"
|
|
INSTALL_QUADLET="${INSTALL_QUADLET:-true}"
|
|
QUADLET_SRC="${QUADLET_SRC:-deploy/quadlet/kubeviz-traefik.container}"
|
|
USER_QUADLET_DIR="${USER_QUADLET_DIR:-${HOME}/.config/containers/systemd}"
|
|
SYSTEM_QUADLET_DIR="${SYSTEM_QUADLET_DIR:-/etc/containers/systemd}"
|
|
PODMAN_USE_SUDO="${PODMAN_USE_SUDO:-}"
|
|
|
|
if [ -z "${REGISTRY_AUTH_FILE:-}" ]; then
|
|
if [ -n "${XDG_RUNTIME_DIR:-}" ] && [ -f "${XDG_RUNTIME_DIR}/containers/auth.json" ]; then
|
|
REGISTRY_AUTH_FILE="${XDG_RUNTIME_DIR}/containers/auth.json"
|
|
elif [ -f "${HOME}/.config/containers/auth.json" ]; then
|
|
REGISTRY_AUTH_FILE="${HOME}/.config/containers/auth.json"
|
|
fi
|
|
fi
|
|
|
|
if [ -z "${PODMAN_USE_SUDO}" ]; then
|
|
if [ "${SYSTEMD_SCOPE}" = "system" ]; then
|
|
PODMAN_USE_SUDO="true"
|
|
else
|
|
PODMAN_USE_SUDO="false"
|
|
fi
|
|
fi
|
|
|
|
PODMAN_CMD=(podman)
|
|
SYSTEMCTL_CMD=(systemctl --user)
|
|
if [ "${PODMAN_USE_SUDO}" = "true" ]; then
|
|
PODMAN_CMD=(sudo podman)
|
|
fi
|
|
if [ "${SYSTEMD_SCOPE}" = "system" ]; then
|
|
SYSTEMCTL_CMD=(sudo systemctl)
|
|
QUADLET_TARGET_DIR="${SYSTEM_QUADLET_DIR}"
|
|
else
|
|
SYSTEMCTL_CMD=(systemctl --user)
|
|
QUADLET_TARGET_DIR="${USER_QUADLET_DIR}"
|
|
if [ -z "${XDG_RUNTIME_DIR:-}" ]; then
|
|
export XDG_RUNTIME_DIR="/run/user/$(id -u)"
|
|
fi
|
|
if [ -z "${DBUS_SESSION_BUS_ADDRESS:-}" ]; then
|
|
export DBUS_SESSION_BUS_ADDRESS="unix:path=${XDG_RUNTIME_DIR}/bus"
|
|
fi
|
|
fi
|
|
|
|
if [ -n "${REGISTRY_AUTH_FILE:-}" ] && [ -f "${REGISTRY_AUTH_FILE}" ]; then
|
|
export REGISTRY_AUTH_FILE
|
|
if [ "${PODMAN_USE_SUDO}" = "true" ]; then
|
|
PODMAN_CMD=(sudo --preserve-env=REGISTRY_AUTH_FILE podman)
|
|
else
|
|
PODMAN_CMD=(podman)
|
|
fi
|
|
echo "Using registry auth file: ${REGISTRY_AUTH_FILE}"
|
|
else
|
|
echo "Warning: no REGISTRY_AUTH_FILE found; private base image pulls may fail."
|
|
fi
|
|
|
|
if git rev-parse --short=12 HEAD >/dev/null 2>&1; then
|
|
BUILD_ID="$(git rev-parse --short=12 HEAD)"
|
|
else
|
|
BUILD_ID="$(date +%s)"
|
|
fi
|
|
|
|
SOURCE_IMAGE="${IMAGE_REPO}:ci-${BUILD_ID}"
|
|
RELEASE_IMAGE="${IMAGE_REPO}:${IMAGE_TAG}"
|
|
QUADLET_IMAGE="${QUADLET_IMAGE:-${RELEASE_IMAGE}}"
|
|
|
|
echo "Building ${SOURCE_IMAGE}"
|
|
"${PODMAN_CMD[@]}" build --pull=always -t "${SOURCE_IMAGE}" .
|
|
|
|
echo "Tagging ${RELEASE_IMAGE}"
|
|
"${PODMAN_CMD[@]}" tag "${SOURCE_IMAGE}" "${RELEASE_IMAGE}"
|
|
|
|
if [ "${INSTALL_QUADLET}" = "true" ]; then
|
|
if [ ! -f "${QUADLET_SRC}" ]; then
|
|
echo "Quadlet source not found: ${QUADLET_SRC}"
|
|
exit 1
|
|
fi
|
|
echo "Installing quadlet ${QUADLET_SRC} -> ${QUADLET_TARGET_DIR}/kubeviz.container"
|
|
if [ "${SYSTEMD_SCOPE}" = "system" ]; then
|
|
sudo mkdir -p "${QUADLET_TARGET_DIR}"
|
|
sudo cp "${QUADLET_SRC}" "${QUADLET_TARGET_DIR}/kubeviz.container"
|
|
sudo sed -i \
|
|
-e "s#^Image=.*#Image=${QUADLET_IMAGE}#" \
|
|
-e "s#^Pull=.*#Pull=never#" \
|
|
"${QUADLET_TARGET_DIR}/kubeviz.container"
|
|
else
|
|
mkdir -p "${QUADLET_TARGET_DIR}"
|
|
cp "${QUADLET_SRC}" "${QUADLET_TARGET_DIR}/kubeviz.container"
|
|
sed -i \
|
|
-e "s#^Image=.*#Image=${QUADLET_IMAGE}#" \
|
|
-e "s#^Pull=.*#Pull=never#" \
|
|
"${QUADLET_TARGET_DIR}/kubeviz.container"
|
|
fi
|
|
fi
|
|
|
|
echo "Reloading ${SYSTEMD_SCOPE} systemd and restarting ${SERVICE_NAME}"
|
|
"${SYSTEMCTL_CMD[@]}" daemon-reload
|
|
"${SYSTEMCTL_CMD[@]}" enable --now "${SERVICE_NAME}"
|
|
"${SYSTEMCTL_CMD[@]}" restart "${SERVICE_NAME}"
|
|
if ! "${SYSTEMCTL_CMD[@]}" is-active --quiet "${SERVICE_NAME}"; then
|
|
echo "Service ${SERVICE_NAME} is not active. Showing diagnostics..."
|
|
"${SYSTEMCTL_CMD[@]}" status "${SERVICE_NAME}" || true
|
|
if [ "${SYSTEMD_SCOPE}" = "system" ]; then
|
|
sudo journalctl -u "${SERVICE_NAME}" -n 200 --no-pager || true
|
|
else
|
|
journalctl --user -u "${SERVICE_NAME}" -n 200 --no-pager || true
|
|
fi
|
|
exit 1
|
|
fi
|
|
|
|
echo "Deployment successful: ${RELEASE_IMAGE}"
|