#!/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}"