diff --git a/update_semaphore.yml b/update_semaphore.yml index 0e672f4..1248608 100644 --- a/update_semaphore.yml +++ b/update_semaphore.yml @@ -45,49 +45,59 @@ - | set -euo pipefail - # English comments: create unique run id and log paths - RID="$(date +%s)" - LOG="/tmp/semaphore-self-update-${RID}.log" - PIDF="/tmp/semaphore-self-update-${RID}.pid" - RCF="/tmp/semaphore-self-update-${RID}.rc" + # English comments: store state in user's home (more reliable than /tmp) + STATE_DIR="${XDG_CACHE_HOME:-$HOME/.cache}/semaphore-self-update" + mkdir -p "$STATE_DIR" + + RID="$(date +%s)" + LOG="$STATE_DIR/run-${RID}.log" + PIDF="$STATE_DIR/run-${RID}.pid" + RCF="$STATE_DIR/run-${RID}.rc" + SH="$STATE_DIR/run-${RID}.sh" + + # English comments: write worker script (no variable expansion while writing) + cat > "$SH" <<'EOS' + #!/usr/bin/env bash + set -euo pipefail + unalias docker 2>/dev/null || true + export DOCKER_CLI_HINTS=0 + + echo "=== started: $(date -Is) ===" + echo "host: $(hostname)" + echo "compose: {{ semaphore_compose_file }}" + echo "project: {{ semaphore_project }} service: {{ semaphore_service }}" + echo "USE_SUDO=${USE_SUDO:-0}" + echo + + sleep 15 - # English comments: build docker command (optionally via sudo -n) DOCKER="docker" if [ "${USE_SUDO:-0}" = "1" ]; then DOCKER="sudo -n docker" fi - # English comments: start background worker, delay to let Semaphore job finish - nohup bash -lc " - set -euo pipefail - unalias docker 2>/dev/null || true - export DOCKER_CLI_HINTS=0 + # English comments: pull explicitly + recreate + $DOCKER compose -p {{ semaphore_project }} -f {{ semaphore_compose_file }} pull {{ semaphore_service }} + $DOCKER compose -p {{ semaphore_project }} -f {{ semaphore_compose_file }} up -d --no-deps --force-recreate {{ semaphore_service }} - echo \"=== started: \$(date -Is) ===\" - echo \"host: \$(hostname)\" - echo \"compose: {{ semaphore_compose_file }}\" - echo \"project: {{ semaphore_project }} service: {{ semaphore_service }}\" - echo \"USE_SUDO=\${USE_SUDO:-0}\" - echo + echo + echo "=== finished: $(date -Is) ===" + EOS - sleep 15 + chmod +x "$SH" - # English comments: pull explicitly (more compatible than --pull always) - $DOCKER compose -p {{ semaphore_project }} -f {{ semaphore_compose_file }} pull {{ semaphore_service }} + # English comments: start in background, persist output, store pid + rc + nohup env USE_SUDO="{{ lookup('env', 'USE_SUDO') | default('0') }}" \ + bash "$SH" >"$LOG" 2>&1 "$PIDF" - echo - echo \"=== finished: \$(date -Is) ===\" - " >\"$LOG\" 2>&1 "$RCF" - echo $! >\"$PIDF\" - echo \"scheduled: pid=\$(cat \"$PIDF\"), log=$LOG\" + echo "scheduled: pid=$(cat "$PIDF"), log=$LOG, script=$SH, rcfile=$RCF" environment: SSHPASS: "{{ vm_pass }}" - # Set USE_SUDO=1 in Semaphore env vars if vm_user needs sudo for docker - USE_SUDO: "{{ lookup('env', 'USE_SUDO') | default('0') }}" register: semaphore_update changed_when: false no_log: "{{ DEBUG == 0 }}"