DevSecOps/etc
rsync를 활용한 웹 서버 배포 자동화 (CI/CD 연계)
봉의일상
2025. 3. 2. 22:32
1. 개요
웹 애플리케이션 배포를 자동화하는 과정에서 rsync를 활용하면 빠르고 효율적인 동기화가 가능합니다. 특히 GitLab CI/CD, Jenkins 등의 자동화 도구와 연계하면, 코드 변경이 발생했을 때 자동으로 웹 서버에 배포할 수 있습니다. 본 글에서는 GitLab에서 Webhook을 트리거로 사용하여 rsync를 통한 자동 동기화 배포 환경을 구축하는 방법을 다룹니다.
2. rsync를 활용한 배포 자동화 개념
rsync는 증분 전송 방식을 사용하여 변경된 파일만 업데이트할 수 있는 강력한 동기화 도구입니다. 이를 CI/CD 파이프라인에 연계하면 코드가 푸시될 때마다 자동으로 웹 서버에 반영되도록 설정할 수 있습니다.
3. GitLab Webhook + rsync 연계
3.1 GitLab Webhook 설정
GitLab의 Webhook을 활용하여 새로운 코드가 푸시될 때 서버에서 자동으로 배포 스크립트를 실행하도록 설정합니다.
- GitLab 프로젝트 설정 → Settings → Webhooks
- URL 입력: Webhook을 실행할 서버의 URL (예: http://[your-server-ip]:5000/webhook)
- Trigger 선택: Push events 선택
- Secret Token 설정 (선택 사항)
- Save Webhook 클릭
3.2 Webhook 처리 서버 구성
GitLab Webhook 요청을 받아 rsync를 실행하는 간단한 웹 서버를 Python으로 작성합니다.
from flask import Flask, request
import subprocess
app = Flask(__name__)
@app.route('/webhook', methods=['POST'])
def webhook():
data = request.json
if data.get('event_name') == 'push':
subprocess.run(['bash', '/data/devops/deploy.sh'])
return 'Deployment started', 200
return 'Ignored', 400
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
3.3 배포 스크립트 (deploy.sh)
GitLab Webhook이 실행되면 rsync를 이용해 최신 코드를 배포합니다.
#!/bin/bash
GIT_REPO_PATH="/home/user/myproject"
WEB_SERVER_PATH="/var/www/html"
cd $GIT_REPO_PATH
git pull origin main
rsync -avz --delete $GIT_REPO_PATH/ user@webserver:$WEB_SERVER_PATH/
4. GitLab CI/CD와 rsync 연계
GitLab CI/CD를 활용하여 코드가 푸시될 때 rsync를 실행하는 방법도 가능합니다.
4.1 .gitlab-ci.yml 설정
GitLab CI/CD에서 rsync를 실행하는 파이프라인을 설정합니다.
stages:
- deploy
deploy:
stage: deploy
script:
- rsync -avz --delete ./ user@webserver:/var/www/html/
only:
- main