From 25f05c6a170b99ef0efac4f3d1fc8d3c97253b30 Mon Sep 17 00:00:00 2001 From: Michael Schiemer Date: Sat, 1 Nov 2025 23:06:54 +0100 Subject: [PATCH] ci: improve stack path handling in staging deployment - Simplify local stack path normalization - Enhance remote shell path resolution to handle user-specific paths (e.g. ~username/path) - Better handling of escaped tilde paths in SSH heredoc --- .gitea/workflows/build-image.yml | 63 ++++++++++++++++++++------------ 1 file changed, 39 insertions(+), 24 deletions(-) diff --git a/.gitea/workflows/build-image.yml b/.gitea/workflows/build-image.yml index 598fe0d7..e76b0ff7 100644 --- a/.gitea/workflows/build-image.yml +++ b/.gitea/workflows/build-image.yml @@ -865,14 +865,7 @@ jobs: if [ -z "$SELECTED_IMAGE" ]; then SELECTED_IMAGE="$DEFAULT_IMAGE" fi - - # Normalize stack path locally to avoid "~" confusion when passing to remote shell - STACK_PATH_RAW="~/deployment/stacks/staging" - if [ -n "$HOME" ]; then - STACK_PATH="${STACK_PATH_RAW/#\~/$HOME}" - else - STACK_PATH="$STACK_PATH_RAW" - fi + STACK_PATH="~/deployment/stacks/staging" SELECTED_TAG="${SELECTED_IMAGE##*:}" SELECTED_REPO="${SELECTED_IMAGE%:*}" @@ -907,24 +900,46 @@ jobs: STACK_PATH="$4" REGISTRY="$5" shift 5 - + + if [ "${STACK_PATH:0:1}" = "\\" ] && [ "${STACK_PATH:1:1}" = "~" ]; then + STACK_PATH="${STACK_PATH:1}" + fi + CURRENT_USER="$(whoami)" USER_HOME="$(getent passwd "$CURRENT_USER" | cut -d: -f6 2>/dev/null)" - if [ -z "$USER_HOME" ]; then - USER_HOME="$HOME" - fi - if [ -z "$USER_HOME" ]; then - USER_HOME="/home/$CURRENT_USER" - fi - - STACK_TARGET="$STACK_PATH" - if [ -z "$STACK_TARGET" ]; then - STACK_TARGET="$USER_HOME/deployment/stacks/staging" - fi - case "$STACK_TARGET" in - ~*) STACK_TARGET="${USER_HOME}${STACK_TARGET#~}" ;; - /*) ;; - *) STACK_TARGET="${USER_HOME}/${STACK_TARGET}" ;; + [ -z "$USER_HOME" ] && USER_HOME="$HOME" + [ -z "$USER_HOME" ] && USER_HOME="/home/$CURRENT_USER" + + RAW_PATH="$STACK_PATH" + [ -z "$RAW_PATH" ] && RAW_PATH="~/deployment/stacks/staging" + + FIRST_CHAR="${RAW_PATH:0:1}" + case "$FIRST_CHAR" in + "~") + if [ "${RAW_PATH:0:2}" = "~/" ] || [ "$RAW_PATH" = "~" ]; then + STACK_TARGET="${USER_HOME}${RAW_PATH:1}" + else + TARGET_SPEC="${RAW_PATH%%/*}" + TARGET_USER="${TARGET_SPEC#~}" + TARGET_REMAINDER="" + if [ "$TARGET_SPEC" != "$RAW_PATH" ]; then + TARGET_REMAINDER="${RAW_PATH#*/}" + fi + TARGET_HOME="$(getent passwd "$TARGET_USER" | cut -d: -f6 2>/dev/null)" + [ -z "$TARGET_HOME" ] && TARGET_HOME="/home/$TARGET_USER" + if [ -n "$TARGET_REMAINDER" ] && [ "$TARGET_REMAINDER" != "$RAW_PATH" ]; then + STACK_TARGET="${TARGET_HOME}/${TARGET_REMAINDER}" + else + STACK_TARGET="$TARGET_HOME" + fi + fi + ;; + "/") + STACK_TARGET="$RAW_PATH" + ;; + *) + STACK_TARGET="${USER_HOME}/${RAW_PATH}" + ;; esac # Ensure staging stack directory exists