From 1cdff136c36de822a35f54ebf2677ae23f907040 Mon Sep 17 00:00:00 2001 From: sb Date: Sat, 11 Jul 2026 18:10:34 +0900 Subject: [PATCH] =?UTF-8?q?fix(ci):=20jar=20=EC=A0=84=EC=86=A1=EC=9D=84=20?= =?UTF-8?q?scp=E2=86=92ssh(cat)=EB=A1=9C=20=EB=B3=80=EA=B2=BD=20+=20?= =?UTF-8?q?=EC=A0=91=EC=86=8D=20=ED=99=95=EC=9D=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 최신 OpenSSH scp(SFTP 모드)의 'open: no such file' 경로 이슈 회피. ssh stdin 으로 jar 전송, 배포 전 SSH 접속 체크 추가. Co-Authored-By: Claude Opus 4.8 (1M context) --- .gitea/workflows/deploy-prod.yaml | 10 ++++++---- .gitea/workflows/deploy.yaml | 14 ++++++++------ 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/.gitea/workflows/deploy-prod.yaml b/.gitea/workflows/deploy-prod.yaml index c7f6d40..c1894d3 100644 --- a/.gitea/workflows/deploy-prod.yaml +++ b/.gitea/workflows/deploy-prod.yaml @@ -50,11 +50,13 @@ jobs: ssh-keyscan -p "$PORT" "$DEPLOY_HOST" >> ~/.ssh/known_hosts 2>/dev/null SSH="ssh -p $PORT -i $HOME/.ssh/id_deploy -o StrictHostKeyChecking=yes" - JAR=$(ls build/libs/*.jar | grep -v -- '-plain.jar' | head -n1) - echo "▶ [PROD] $JAR → $DEPLOY_USER@$DEPLOY_HOST:$DEPLOY_JAR_PATH" + $SSH -o ConnectTimeout=10 "$DEPLOY_USER@$DEPLOY_HOST" "echo ok" >/dev/null \ + || { echo "::error::SSH 접속 실패 — 공개키/계정/포트 확인"; exit 1; } - $SSH "$DEPLOY_USER@$DEPLOY_HOST" "mkdir -p \"\$(dirname '$DEPLOY_JAR_PATH')\"" - scp -P "$PORT" -i "$HOME/.ssh/id_deploy" "$JAR" "$DEPLOY_USER@$DEPLOY_HOST:$DEPLOY_JAR_PATH.new" + JAR=$(ls build/libs/*.jar | grep -v -- '-plain.jar' | head -n1) + echo "▶ [PROD] 전송: $(basename "$JAR") ($(du -h "$JAR" | cut -f1))" + + $SSH "$DEPLOY_USER@$DEPLOY_HOST" "mkdir -p \"\$(dirname '$DEPLOY_JAR_PATH')\" && cat > '$DEPLOY_JAR_PATH.new'" < "$JAR" $SSH "$DEPLOY_USER@$DEPLOY_HOST" "\ mv -f '$DEPLOY_JAR_PATH.new' '$DEPLOY_JAR_PATH'; \ docker compose -f '$COMPOSE_FILE' up -d --force-recreate api; \ diff --git a/.gitea/workflows/deploy.yaml b/.gitea/workflows/deploy.yaml index 870afe9..f59d63b 100644 --- a/.gitea/workflows/deploy.yaml +++ b/.gitea/workflows/deploy.yaml @@ -54,13 +54,15 @@ jobs: ssh-keyscan -p "$PORT" "$DEPLOY_HOST" >> ~/.ssh/known_hosts 2>/dev/null SSH="ssh -p $PORT -i $HOME/.ssh/id_deploy -o StrictHostKeyChecking=yes" - # bootJar 산출물 (plain jar 제외 — 실제로 bootJar 만 돌려 하나뿐이지만 방어적으로) - JAR=$(ls build/libs/*.jar | grep -v -- '-plain.jar' | head -n1) - echo "▶ $JAR → $DEPLOY_USER@$DEPLOY_HOST:$DEPLOY_JAR_PATH" + # 접속 확인 + $SSH -o ConnectTimeout=10 "$DEPLOY_USER@$DEPLOY_HOST" "echo ok" >/dev/null \ + || { echo "::error::SSH 접속 실패 — 공개키(authorized_keys)/계정/포트 확인"; exit 1; } - # 원자적 교체: 임시파일 업로드 후 mv (실행 중 파일 손상 방지) - $SSH "$DEPLOY_USER@$DEPLOY_HOST" "mkdir -p \"\$(dirname '$DEPLOY_JAR_PATH')\"" - scp -P "$PORT" -i "$HOME/.ssh/id_deploy" "$JAR" "$DEPLOY_USER@$DEPLOY_HOST:$DEPLOY_JAR_PATH.new" + JAR=$(ls build/libs/*.jar | grep -v -- '-plain.jar' | head -n1) + echo "▶ 전송: $(basename "$JAR") ($(du -h "$JAR" | cut -f1))" + + # jar 전송: scp(SFTP) 경로 이슈 회피 위해 ssh stdin(cat) 사용. 임시파일 후 mv(원자적 교체). + $SSH "$DEPLOY_USER@$DEPLOY_HOST" "mkdir -p \"\$(dirname '$DEPLOY_JAR_PATH')\" && cat > '$DEPLOY_JAR_PATH.new'" < "$JAR" $SSH "$DEPLOY_USER@$DEPLOY_HOST" "\ mv -f '$DEPLOY_JAR_PATH.new' '$DEPLOY_JAR_PATH'; \ docker compose -f '$COMPOSE_FILE' up -d --force-recreate dev-api; \