CoDream

GitLab CI/CD 배포 자동화 삽질기: rsync 권한부터 ssh 포트 오류까지 본문

Develop/회고

GitLab CI/CD 배포 자동화 삽질기: rsync 권한부터 ssh 포트 오류까지

코잠 2025. 9. 24. 14:55
728x90
반응형

안녕하세요! 오늘은 제 웹 프로젝트에 GitLab CI/CD를 이용해 배포 자동화를 구축하면서 겪었던 다사다난한 오류 해결 과정을 공유해 보려고 합니다. 간단할 줄 알았던 배포 설정이 저를 몇 시간 동안 괴롭혔는데요, 분명 저와 같은 문제를 겪는 분들이 계실 거라 생각합니다.

1. 첫 번째 관문: rsync error (code 23) - 권한 문제의 시작

가장 먼저 저를 반겨준 것은 rsync의 Permission denied 오류였습니다. 로그는 다음과 같았죠.

rsync: delete_file: unlink(...) failed: Permission denied (13)
rsync error: some files/attrs were not transferred (code 23)
ERROR: Job failed: exit status 1

원인은 간단했습니다. 배포 스크립트를 실행하는 리눅스 계정(my-user)이, 서버에서 웹서버(daemon)가 생성한 파일을 삭제할 권한이 없었던 것입니다.

해결 과정 처음에는 권한 오류가 나는 폴더(hac_upfiles 등)를 --exclude 옵션으로 배포에서 제외하는 임시방편을 사용했습니다. 하지만 이건 시작에 불과했습니다.

# .gitlab-ci.yml
- rsync -avz --exclude '/hac_upfiles' -e "ssh -p $DEPLOY_PORT" --delete ./ ...

2. 두 번째 관문: chmod: Operation not permitted

rsync는 성공했지만, 곧바로 다음 명령어인 chmod에서 똑같은 권한 오류가 발생했습니다.

chmod: changing permissions of ‘/home/my-project/hac_upfiles’: Operation not permitted

원인 rsync에서 폴더를 제외했더라도, 다음에 실행되는 chmod -R 명령어는 배포 경로 아래의 모든 파일을 대상으로 실행되기 때문이었습니다. rsync와 ssh는 완전히 별개의 작업이었던 거죠.

이때 깨달았습니다. 땜질식 처방이 아닌, 서버의 근본적인 권한 문제를 해결해야 한다는 것을요! (이 문제의 가장 좋은 해결책은 setfacl 명령어로 배포 계정에 폴더 수정 권한을 추가로 주는 것입니다.)

 3. 최종 보스: ssh: Connection timed out

권한 문제를 어느 정도 정리했다고 생각했을 때, 갑자기 새로운 유형의 오류가 나타났습니다.

ssh: connect to host 1.2.3.4 port 2020: Connection timed out

원인 로그를 자세히 보니, 제 스크립트가 엉뚱하게도 22번 포트로 접속을 시도하고 있었습니다. 제 서버는 보안을 위해 SSH 포트를 2020번으로 변경했고, 방화벽도 2020번 포트만 허용하고 있었기 때문이죠.

분명 .gitlab-ci.yml에 변수를 설정했는데 왜 적용이 안 됐을까요? 범인은 **GitLab 프로젝트 설정(Settings > CI/CD > Variables)**에 있었습니다. UI에 등록된 변수가 .yml 파일에 있는 변수보다 우선순위가 높아 값을 덮어썼던 것입니다.

최종 해결 GitLab UI에 있던 변수를 정리하고, .gitlab-ci.yml 파일이 정확히 2020번 포트를 사용하도록 수정하여 마침내 배포에 성공할 수 있었습니다.

 
# .gitlab-ci.yml

variables:
  DEPLOY_HOST: "1.2.3.4"
  DEPLOY_PORT: "2020" # 정확한 포트 지정
  DEPLOY_USER: "my-user"
  DEPLOY_PATH: "/home/my-project/www"

deploy_job:
  script:
    - rsync -avz -e "ssh -p $DEPLOY_PORT" --delete ./ $DEPLOY_USER@$DEPLOY_HOST:$DEPLOY_PATH/
    # ... (chmod 등 후속 작업)

 

## 마치며

이번 경험을 통해 GitLab CI/CD 배포 설정 시에는 스크립트 문법뿐만 아니라, 서버의 권한 구조네트워크(방화벽, 포트) 설정까지 종합적으로 이해해야 한다는 것을 깨달았습니다. 이 글이 저처럼 배포 자동화의 늪에 빠진 분들에게 작은 등대가 되길 바랍니다.

728x90
반응형