diff --git a/do-rsync/action.yml b/do-rsync/action.yml index 0c27810..d505f30 100644 --- a/do-rsync/action.yml +++ b/do-rsync/action.yml @@ -35,6 +35,10 @@ inputs: required: false default: "true" description: 기본 제외 패턴 사용 여부 (.git/, .gitea/, .claude/, .DS_Store, README.md, CLAUDE.md, *.ori|origin|bak|back) + ensure-remote-rsync: + required: false + default: "true" + description: 원격 서버에 rsync가 없으면 자동 설치 시도 (sudo 권한 필요) runs: using: composite @@ -62,6 +66,56 @@ runs: exit 1 fi + - name: 원격 서버 rsync 확인 + shell: bash + env: + DEPLOY_HOST: ${{ inputs.host }} + DEPLOY_PORT: ${{ inputs.port }} + DEPLOY_USER: ${{ inputs.user }} + KEY_PATH_INPUT: ${{ inputs.key-path }} + ENSURE_REMOTE: ${{ inputs.ensure-remote-rsync }} + run: | + set -eu + + # 원격 rsync 확인을 건너뜁니다. + if [ "$ENSURE_REMOTE" != "true" ]; then + exit 0 + fi + + KEY_PATH="$KEY_PATH_INPUT" + if [ -z "$KEY_PATH" ]; then + KEY_PATH="$HOME/.ssh/deploy_key" + fi + + ssh -i "$KEY_PATH" -p "$DEPLOY_PORT" -o IdentitiesOnly=yes \ + "$DEPLOY_USER@$DEPLOY_HOST" 'bash -se' << 'REMOTE' + set -eu + + # rsync가 이미 설치되어 있으면 건너뜁니다. + if command -v rsync >/dev/null 2>&1; then + exit 0 + fi + + # root가 아니면 sudo 사용 + SUDO="" + if [ "$(id -u)" -ne 0 ]; then + SUDO="sudo" + fi + + # 패키지 매니저에 따라 rsync를 설치합니다. + if command -v apt-get >/dev/null 2>&1; then + $SUDO apt-get update + $SUDO apt-get install -y rsync + elif command -v apk >/dev/null 2>&1; then + $SUDO apk add --no-cache rsync + elif command -v yum >/dev/null 2>&1; then + $SUDO yum install -y rsync + else + echo "원격 rsync 설치 실패: 지원하지 않는 배포판" + exit 1 + fi + REMOTE + - name: 파일 동기화 shell: bash env: